使用JavaScript更改元素的类

如何使用JavaScript更改一个HTML元素的类来响应onClick事件?

用于改变类的现代HTML5技术

现代浏览器已经添加了classList ,它提供了一些方法,使得在不需要库的情况下操作类变得更容易:

 document.getElementById("MyElement").classList.add('MyClass'); document.getElementById("MyElement").classList.remove('MyClass'); if ( document.getElementById("MyElement").classList.contains('MyClass') ) document.getElementById("MyElement").classList.toggle('MyClass'); 

不幸的是,这些在v10之前的Internet Explorer中不起作用,不过有一点可以在IE8和IE9上增加对它的支持。 但是,越来越多的支持 。

简单的跨浏览器解决scheme

select元素的标准JavaScript方法是使用document.getElementById("Id") ,这是以下示例使用的 – 您当然可以通过其他方式获取元素,而在正确的情况下可以简单地使用this ,详细了解这个超出了答案的范围。

要更改元素的所有类:

要用一个或多个新类replace所有现有类,请设置className属性:

 document.getElementById("MyElement").className = "MyClass"; 

(您可以使用空格分隔的列表来应用多个类。)

为一个元素添加一个额外的类:

要添加一个类到一个元素,而不删除/影响现有的值,追加一个空格和新的类名,如下所示:

 document.getElementById("MyElement").className += " MyClass"; 

从元素中移除一个类:

要将单个类移除到某个元素,而不影响其他潜在的类,则需要一个简单的正则expression式replace:

 document.getElementById("MyElement").className = document.getElementById("MyElement").className.replace ( /(?:^|\s)MyClass(?!\S)/g , '' ) /* Code wrapped for readability - above is all one statement */ 

这个正则expression式的解释如下:

 (?:^|\s) # Match the start of the string, or any single whitespace character MyClass # The literal text for the classname to remove (?!\S) # Negative lookahead to verify the above is the whole classname # Ensures there is no non-space character following # (ie must be end of string or a space) 

g标志告诉replace重复根据需要,以防万一class级名称已被多次添加。

要检查一个类是否已经应用到一个元素:

上面用于移除类的正则expression式也可以用来检查某个特定的类是否存在:

 if ( document.getElementById("MyElement").className.match(/(?:^|\s)MyClass(?!\S)/) ) 

将这些操作分配给onclick事件:

虽然可以直接在HTML事件属性(例如onclick="this.className+=' MyClass'" )中编写JavaScript,但这不是build议的行为。 特别是在较大的应用程序中,通过将HTML标记与JavaScript交互逻辑分开,可实现更多可维护的代码。

实现这一目标的第一步是创build一个函数,并在onclick属性中调用该函数,例如:

 <script type="text/javascript"> function changeClass() { // Code examples from above } </script> ... <button onclick="changeClass()">My Button</button> 

(不需要在脚本标记中包含此代码,这仅仅是为了简化示例,并且将JavaScript包含在不同的文件中可能更合适)。

第二步是将onclick事件从HTML中移出到JavaScript中,例如使用addEventListener

 <script type="text/javascript"> function changeClass() { // Code examples from above } window.onload = function() { document.getElementById("MyElement").addEventListener( 'click', changeClass); } </script> ... <button id="MyElement">My Button</button> 

(请注意,window.onload部分是必需的,以便在HTML加载完成执行该函数的内容 – 否则,在JavaScript代码被调用时MyElement可能不存在,从而导致该行失败。

JavaScript框架和库

上面的代码都是标准的JavaScript,但是通常的做法是使用框架或者库来简化常见的任务,并且从编写代码时你可能不会想到的固定的错误和边缘情况中受益。

虽然有些人认为增加一个大约50 KB的框架来简单地改变一个类,如果你正在做大量的JavaScript工作,或者任何可能具有不寻常的跨浏览器行为的东西,那么这是值得考虑的。

(非常粗略的说,一个库是一套为特定任务devise的工具,而一个框架通常包含多个库并执行一套完整的职责。)

上面的例子使用jQuery (可能是最常用的JavaScript库)进行了重新编译(尽pipe还有其他值得研究的地方)。

(请注意$这里是jQuery对象。)

用jQuery改变类:

 $('#MyElement').addClass('MyClass'); $('#MyElement').removeClass('MyClass'); if ( $('#MyElement').hasClass('MyClass') ) 

另外,jQuery提供了一个快捷方式来添加一个类,如果它不适用,或者删除一个类:

 $('#MyElement').toggleClass('MyClass'); 

用jQuery为一个点击事件分配一个函数:

 $('#MyElement').click(changeClass); 

或者,不需要ID:

 $(':button:contains(My Button)').click(changeClass); 

你也可以做:

的document.getElementById( 'ID')classList.add( '类')。
的document.getElementById( 'ID')classList.remove( '类')。

并切换一个类(删除如果存在,否则添加它):

 。的document.getElementById( '编号')classList.toggle( '类');

在我没有使用jQuery的旧项目中,我构build了以下函数来添加,删除和检查元素是否具有类:

 function hasClass(ele, cls) { return ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)')); } function addClass(ele, cls) { if (!hasClass(ele, cls)) ele.className += " " + cls; } function removeClass(ele, cls) { if (hasClass(ele, cls)) { var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)'); ele.className = ele.className.replace(reg, ' '); } } 

所以,例如,如果我想点击添加一些类的button,我可以使用这个:

 <script type="text/javascript"> function changeClass(btn, cls) { if(!hasClass(btn, cls)) { addClass(btn, cls); } } </script> ... <button onclick="changeClass(this, "someClass")">My Button</button> 

现在肯定会更好地使用jQuery。

你可以像这样使用node.className

 document.getElementById('foo').className = 'bar'; 

这应该在IE5.5和PPK的工作 。

哇,这里有这么多的矫枉过正的答案

 <div class="firstClass" onclick="this.className='secondClass'"> 

使用纯JavaScript代码:

 function hasClass(ele, cls) { return ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)')); } function addClass(ele, cls) { if (!this.hasClass(ele, cls)) ele.className += " " + cls; } function removeClass(ele, cls) { if (hasClass(ele, cls)) { var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)'); ele.className = ele.className.replace(reg, ' '); } } function replaceClass(ele, oldClass, newClass){ if(hasClass(ele, oldClass)){ removeClass(ele, oldClass); addClass(ele, newClass); } return; } function toggleClass(ele, cls1, cls2){ if(hasClass(ele, cls1)){ replaceClass(ele, cls1, cls2); }else if(hasClass(ele, cls2)){ replaceClass(ele, cls2, cls1); }else{ addClass(ele, cls1); } } 

这对我有用:

 function setCSS(eleID) { var currTabElem = document.getElementById(eleID); currTabElem.setAttribute("class", "some_class_name"); currTabElem.setAttribute("className", "some_class_name"); } 

你也可以扩展HTMLElement对象,以添加添加,删除,切换和检查类( gist )的方法:

 HTMLElement = typeof(HTMLElement) != 'undefiend' ? HTMLElement : Element; HTMLElement.prototype.addClass = function(string) { if (!(string instanceof Array)) { string = string.split(' '); } for(var i = 0, len = string.length; i < len; ++i) { if (string[i] && !new RegExp('(\\s+|^)' + string[i] + '(\\s+|$)').test(this.className)) { this.className = this.className.trim() + ' ' + string[i]; } } } HTMLElement.prototype.removeClass = function(string) { if (!(string instanceof Array)) { string = string.split(' '); } for(var i = 0, len = string.length; i < len; ++i) { this.className = this.className.replace(new RegExp('(\\s+|^)' + string[i] + '(\\s+|$)'), ' ').trim(); } } HTMLElement.prototype.toggleClass = function(string) { if (string) { if (new RegExp('(\\s+|^)' + string + '(\\s+|$)').test(this.className)) { this.className = this.className.replace(new RegExp('(\\s+|^)' + string + '(\\s+|$)'), ' ').trim(); } else { this.className = this.className.trim() + ' ' + string; } } } HTMLElement.prototype.hasClass = function(string) { return string && new RegExp('(\\s+|^)' + string + '(\\s+|$)').test(this.className); } 

然后就像这样使用(点击将添加或删除类):

 document.getElementById('yourElementId').onclick = function() { this.toggleClass('active'); } 

这里是演示 。

只要添加来自另一个stream行框架(Google Closures)的信息,请参阅他们的dom / classes类:

 goog.dom.classes.add(element, var_args) goog.dom.classes.addRemove(element, classesToRemove, classesToAdd) goog.dom.classes.remove(element, var_args) 

select元素的一个选项是使用goog.dom.query和CSS3select器:

 var myElement = goog.dom.query("#MyElement")[0]; 

以前的正则expression式中有一些小调和调整:

如果class级名单不止一次地拥有class级名称,您将需要在全球进行。 而且,您可能需要从class级列表的末尾去掉空格,并将多个空格转换为一个空格,以避免空格被占用。 如果使用类名的唯一代码使用下面的正则expression式并在添加名称之前删除名称,则这些事情都不应该成为问题。 但。 那么,谁知道谁可能会与class级名单下降。

这个正则expression式是不区分大小写的,这样在类名称中不用关心大小写的浏览器上使用代码之前,类名中的错误可能会出现。

 var s = "testing one four one two"; var cls = "one"; var rg = new RegExp("(^|\\s+)" + cls + "(\\s+|$)", 'ig'); alert("[" + s.replace(rg, ' ') + "]"); var cls = "test"; var rg = new RegExp("(^|\\s+)" + cls + "(\\s+|$)", 'ig'); alert("[" + s.replace(rg, ' ') + "]"); var cls = "testing"; var rg = new RegExp("(^|\\s+)" + cls + "(\\s+|$)", 'ig'); alert("[" + s.replace(rg, ' ') + "]"); var cls = "tWo"; var rg = new RegExp("(^|\\s+)" + cls + "(\\s+|$)", 'ig'); alert("[" + s.replace(rg, ' ') + "]"); 

在ASP.NET中使用JavaScript更改元素的CSS类:

 Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load If Not Page.IsPostBack Then lbSave.Attributes.Add("onmouseover", "this.className = 'LinkButtonStyle1'") lbSave.Attributes.Add("onmouseout", "this.className = 'LinkButtonStyle'") lbCancel.Attributes.Add("onmouseover", "this.className = 'LinkButtonStyle1'") lbCancel.Attributes.Add("onmouseout", "this.className = 'LinkButtonStyle'") End If End Sub 

我会使用jQuery和写这样的事情:

 jQuery(function($) { $("#some-element").click(function() { $(this).toggleClass("clicked"); }); }); 

这个代码添加了一个函数,当id some元素的一个元素被点击时被调用。 如果函数不是它的一部分,则该函数将附加到元素的类属性中,如果它存在,则将其删除。

是的,你需要在页面中添加一个对jQuery库的引用来使用这个代码,但是至less你可以放心,库中的大多数函数可以在几乎所有的现代浏览器上工作,并且可以节省你的时间你自己的代码也是这样做的。

谢谢

该线

 document.getElementById("MyElement").className = document.getElementById("MyElement").className.replace(/\bMyClass\b/','') 

应该:

 document.getElementById("MyElement").className = document.getElementById("MyElement").className.replace('/\bMyClass\b/',''); 

这是我的版本,充分工作:

 function addHTMLClass(item, classname) { var obj = item if (typeof item=="string") { obj = document.getElementById(item) } obj.className += " " + classname } function removeHTMLClass(item, classname) { var obj = item if (typeof item=="string") { obj = document.getElementById(item) } var classes = ""+obj.className while (classes.indexOf(classname)>-1) { classes = classes.replace (classname, "") } obj.className = classes } 

用法:

 <tr onmouseover='addHTMLClass(this,"clsSelected")' onmouseout='removeHTMLClass(this,"clsSelected")' > 

用IE6支持在香草JavaScript中更改元素的类

您可以尝试使用节点attributes属性来保持与旧版浏览器甚至IE6的兼容性:

 function getClassNode(element) { for (var i = element.attributes.length; i--;) if (element.attributes[i].nodeName === 'class') return element.attributes[i]; } function removeClass(classNode, className) { var index, classList = classNode.value.split(' '); if ((index = classList.indexOf(className)) > -1) { classList.splice(index, 1); classNode.value = classList.join(' '); } } function hasClass(classNode, className) { return classNode.value.indexOf(className) > -1; } function addClass(classNode, className) { if (!hasClass(classNode, className)) classNode.value += ' ' + className; } document.getElementById('message').addEventListener('click', function() { var classNode = getClassNode(this); var className = hasClass(classNode, 'red') && 'blue' || 'red'; removeClass(classNode, 'red'); removeClass(classNode, 'blue'); addClass(classNode, className); }) 
 .red { color: red; } .red:before { content: 'I am red! '; } .red:after { content: ' again'; } .blue { color: blue; } .blue:before { content: 'I am blue! ' } 
 <span id="message" class="">Click me</span> 

这里有一个toggleClass来切换/添加/删除一个元素上的类:

 // If newState is provided add/remove theClass accordingly, otherwise toggle theClass function toggleClass(elem, theClass, newState) { var matchRegExp = new RegExp('(?:^|\\s)' + theClass + '(?!\\S)', 'g'); var add=(arguments.length>2 ? newState : (elem.className.match(matchRegExp) == null)); elem.className=elem.className.replace(matchRegExp, ''); // clear all if (add) elem.className += ' ' + theClass; } 

见jsfiddle

也看到我的答案在这里dynamic地创build一个新的类

我在我的代码中使用下面的香草JavaScript函数。 他们使用正则expression式和indexOf但不需要在正则expression式中引用特殊字符。

 function addClass(el, cn) { var c0 = (" " + el.className + " ").replace(/\s+/g, " "), c1 = (" " + cn + " ").replace(/\s+/g, " "); if (c0.indexOf(c1) < 0) { el.className = (c0 + c1).replace(/\s+/g, " ").replace(/^ | $/g, ""); } } function delClass(el, cn) { var c0 = (" " + el.className + " ").replace(/\s+/g, " "), c1 = (" " + cn + " ").replace(/\s+/g, " "); if (c0.indexOf(c1) >= 0) { el.className = c0.replace(c1, " ").replace(/\s+/g, " ").replace(/^ | $/g, ""); } } 

您也可以在现代浏览器中使用element.classList 。

这可以做到。

HTML:

 <div class="red" id="text"> <a href="#" onclick="changeClass();">Fahad</a> </div> 

CSS:

 .red a{ color:red; } .black a{ color:black; } 

JavaScript的:

 function changeClass(){ document.getElementById("text").className = "black"; } 

小提琴 。

只是想我会把这个:

 function inArray(val, ary){ for(var i=0,l=ary.length; i<l; i++){ if(ary[i] === val){ return true; } } return false; } function removeClassName(classNameS, fromElement){ var x = classNameS.split(/\s/), s = fromElement.className.split(/\s/), r = []; for(var i=0,l=s.length; i<l; i++){ if(!iA(s[i], x))r.push(s[i]); } fromElement.className = r.join(' '); } function addClassName(classNameS, toElement){ var s = toElement.className.split(/\s/); s.push(c); toElement.className = s.join(' '); } 

这是很好的,我发现有帮助。

 function classChangeFn() { document.getElementById("MyElement").className = ""; } window.onload = function(){ document.getElementById("MyElement").addEventListener( 'click' , classChangeFn ); } 

使用JavaScript代码:

 <div id="div_add" class="div_add">Add class from Javascript</div> <div id="div_replace" class="div_replace">Replace class from Javascript</div> <div id="div_remove" class="div_remove">Remove class from Javascript</div> <button onClick="div_add_class();">Add class from Javascript</button> <button onClick="div_replace_class();">Replace class from Javascript</button> <button onClick="div_remove_class();">Remove class from Javascript</button> <script type="text/javascript"> function div_add_class() { document.getElementById("div_add").className += " div_added"; } function div_replace_class() { document.getElementById("div_replace").className = "div_replaced"; } function div_remove_class() { document.getElementById("div_remove").className = ""; } </script> 

您可以从此链接下载工作代码。

经过漫长的search,我发现没有document.getElementById()的最好的类pipe理解决scheme

 var els = [].slice.apply(document.getElementsByClassName("no-js")); for (var i = 0; i < els.length; i++) { els[i].className = els[i].className.replace(/ *\bno-js\b/g, "js"); } 

解决scheme的原始位置: https : //stackoverflow.com/a/8708944/1589669

只要说myElement.classList="new-class"除非你需要维护其他现有的类,在这种情况下,你可以使用classList.add, .remove方法。

 var doc = document; var divOne = doc.getElementById("one"); var goButton = doc.getElementById("go"); goButton.addEventListener("click", function() { divOne.classList="blue"; }); 
 div{ min-height:48px; min-width:48px; } .bordered{ border: 1px solid black; } .green{ background:green; } .blue{ background: blue; } 
 <button id="go">Change Class</button> <div id="one" class="bordered green"> </div> 

好吧,我认为在这种情况下,你应该使用jQuery或在纯JavaScript中编写你自己的方法,如果我不需要其他原因,我的首选是添加我自己的方法,而不是注入所有的jQuery到我的应用程序。

我想做一些像下面的方法来我的JavaScript框架添加几个function,处理添加类,删除类,类似于jQuery,这是完全支持在IE9 +,也是我的代码写在ES6,所以你需要以确保您的浏览器支持它,或者您使用类似babel的东西,否则需要在您的代码中使用ES5语法,也是这样,我们通过IDfind元素,这意味着元素需要select一个ID:

 //simple javascript utils for class management in ES6 var classUtil = { addClass: (id, cl) => { document.getElementById(id).classList.add(cl); }, removeClass: (id, cl) => { document.getElementById(id).classList.remove(cl); }, hasClass: (id, cl) => { return document.getElementById(id).classList.contains(cl); }, toggleClass: (id, cl) => { document.getElementById(id).classList.toggle(cl); } } 

你可以简单地使用它们,如下所示,想象你的元素具有id和class的类,确保你将它们作为string传递,你可以使用如下的util:

 classUtil.addClass('myId', 'myClass'); classUtil.removeClass('myId', 'myClass'); classUtil.hasClass('myId', 'myClass'); classUtil.toggleClass('myId', 'myClass'); 

如果你想删除一个类,你可以这样做:ELEMENT.classList.remove(“CLASS_NAME”);

添加一个类:ELEMENT.classList.add('CLASS_NAME');

这是简单的jQuery代码来做到这一点。

 $(".class1").click(function(argument) { $(".parentclass").removeClass("classtoremove"); setTimeout(function (argument) { $(".parentclass").addClass("classtoadd"); }, 100); }); 

这里,

  • Class1是一个事件的侦听器。
  • 父类是承载您想要更改的类的类
  • Classtoremove是你有的老class。
  • 要添加的类是要添加的新类。
  • 100是类更改的超时延迟。

祝你好运。

像jQuery这样的库是最简单的:

 <input type="button" onClick="javascript:test_byid();" value="id='second'" /> <script> function test_byid() { $("#second").toggleClass("highlight"); } </script> 

没有冒犯性,但是更改class级的时间并不长,因为它迫使CSS解释器重新计算整个网页的视觉performance。

原因是CSS解释器几乎不可能知道是否可以改变inheritance或级联,所以简短的答案是:

永远不要改变className! – )

但通常你只需要改变一个或两个属性,而且很容易实现:

 function highlight(elm){ elm.style.backgroundColor ="#345"; elm.style.color = "#fff"; }