关于html:如何用JavaScript更改元素的类?

How to change an element's class with JavaScript?

如何使用JavaScript响应EDCOX1 0事件来更改一个HTML元素?


现代HTML5换课技术

现代浏览器增加了ClassList,它提供了一些方法,可以更容易地操作类而不需要库:

1
2
3
4
5
6
7
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添加对它的支持,可从本页获得。不过,它得到了越来越多的支持。

简单的跨浏览器解决方案

选择一个元素的标准javascript方法是使用document.getElementById("Id"),这就是下面的示例所使用的方法-当然,您可以用其他方法获得元素,并且在正确的情况下,可能只使用this-但是,详细介绍这一点超出了答案的范围。

要更改元素的所有类,请执行以下操作:

要用一个或多个新类替换所有现有类,请设置classname属性:

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

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

要向元素添加附加类,请执行以下操作:

要在不删除/影响现有值的情况下向元素添加类,请附加一个空格和新的类名,如下所示:

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

要从元素中移除类,请执行以下操作:

要在不影响其他潜在类的情况下将单个类移除到元素,需要使用简单的regex替换:

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

此regex的解释如下:

1
2
3
4
5
6
7
(?:^|\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
         # (i.e. must be end of string or a space)

如果类名被添加了多次,则g标志会告诉replace根据需要重复。

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

上面用于移除类的ReGEX也可以用作检查特定类是否存在:

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

< BR>

将这些操作分配给单击事件:

虽然可以直接在HTML事件属性(如EDCOX1(3)中)写入JavaScript,但这并不推荐行为。特别是在更大的应用程序中,通过将HTML标记与JavaScript交互逻辑分离来实现更可维护的代码。

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

1
2
3
4
5
6
7
<script type="text/javascript">
    function changeClass(){
        // Code examples from above
    }

...
<button onclick="changeClass()">My Button</button>

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

第二步是将onclick事件移出HTML并移入JavaScript,例如使用addEventListener。

1
2
3
4
5
6
7
8
9
10
11
<script type="text/javascript">
    function changeClass(){
        // Code examples from above
    }

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

...
<button id="MyElement">My Button</button>

(请注意,window.onload部分是必需的,以便在HTML完成加载后执行该函数的内容-如果不这样做,调用javascript代码时可能不存在myElement,因此该行将失败。)

< BR>

JavaScript框架和库

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

虽然有些人认为添加一个大约50 kb的框架来简单地更改一个类是过分杀伤力的,但是如果您正在做大量的javascript工作,或者任何可能具有异常跨浏览器行为的事情,那么这是值得考虑的。

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

上面的例子已经使用jquery(可能是最常用的javascript库)在下面复制(尽管还有其他值得研究的库)。

(注意,这里是jquery对象。)

使用jquery更改类:

1
2
3
4
5
$('#MyElement').addClass('MyClass');

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

if ( $('#MyElement').hasClass('MyClass') )

此外,jquery还提供了一个快捷方式,用于在类不适用时添加该类,或者删除具有以下功能的类:

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

< BR>

使用jquery为Click事件分配函数:

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

或者,不需要ID:

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

< BR>


你也可以这样做:

1
2
document.getElementById('id').classList.add('class');
document.getElementById('id').classList.remove('class');

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

1
document.getElementById('id').classList.toggle('class');


在一个不使用jquery的旧项目中,我构建了以下函数来添加、删除和检查元素是否具有类:

1
2
3
4
5
6
7
8
9
10
11
12
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, ' ');
    }
}

例如,如果我想单击添加一些类,我可以使用这个按钮:

1
2
3
4
5
6
7
8
9
<script type="text/javascript">
    function changeClass(btn, cls) {
        if(!hasClass(btn, cls)) {
            addClass(btn, cls);
        }
    }

...
<button onclick="changeClass(this,"someClass")">My Button</button>

现在可以肯定的是,最好使用jquery。


您可以这样使用node.className

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

根据PPK,这应该在IE5.5和更高版本中有效。


哇,奇怪这里有这么多多余的答案…

1
 


使用纯javascript代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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);
    }
}


这对我很有用:

1
2
3
4
5
6
function setCSS(eleID) {
    var currTabElem = document.getElementById(eleID);

    currTabElem.setAttribute("class","some_class_name");
    currTabElem.setAttribute("className","some_class_name");
}


同样,您可以扩展HTMLEngy对象,以便添加添加、删除、切换和检查类(GIST)的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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);
}

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

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

这是演示。


只需从另一个流行的框架google closures添加信息,就可以看到它们的dom/classes类:

1
2
3
4
5
goog.dom.classes.add(element, var_args)

goog.dom.classes.addRemove(element, classesToRemove, classesToAdd)

goog.dom.classes.remove(element, var_args)

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

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


前一个正则表达式上的几个小注释和调整:

如果类列表中的类名不止一次,您将希望全局执行该操作。而且,您可能希望从类列表的末尾删除空格,并将多个空格转换为一个空格,以避免出现空格。如果唯一使用类名的代码挖掘在添加前使用下面的regex并删除一个名称,那么这些事情都不应该是问题。但是。好吧,谁知道谁在吃班级名单呢。

这个regex不区分大小写,因此类名中的错误可能会在不关心类名大小写的浏览器上使用代码之前出现。

1
2
3
4
5
6
7
8
9
10
11
12
13
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类:

1
2
3
4
5
6
7
8
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编写如下内容:

1
2
3
4
5
jQuery(function($) {
    $("#some-element").click(function() {
        $(this).toggleClass("clicked");
    });
});

此代码添加了一个函数,当单击某个元素的id元素时,将调用该函数。如果元素的class属性尚未包含,则该函数会将单击的内容追加到该属性,如果该属性已存在,则将其移除。

是的,您确实需要在页面中添加一个对jquery库的引用来使用此代码,但至少您可以确信库中的大多数函数在几乎所有现代浏览器上都能工作,并且这样做可以节省您实现自己的代码的时间。

谢谢


线

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

应该是:

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


下面是切换/添加/删除元素类的ToggleClass:

1
2
3
4
5
6
7
8
// 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;
}

参见JSFIDLE

也可以在这里看到我动态创建新类的答案


这是我的版本,完全有效:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
}

用途:

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


在支持IE6的普通JavaScript中更改元素类

您可以尝试使用node attributes属性来保持与旧浏览器的兼容性,即使是IE6:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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);
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.red {
  color: red;
}
.red:before {
  content: 'I am red! ';
}
.red:after {
  content: ' again';
}
.blue {
  color: blue;
}
.blue:before {
  content: 'I am blue! '
}
1
<span id="message" class="">Click me</span>


我在代码中使用了下面的香草JavaScript函数。它们使用正则表达式和EDCOX1(0),但不需要引用正则表达式中的特殊字符。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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,"");
    }
}

你也可以在现代浏览器中使用元素。


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

1
2
3
4
5
6
7
var doc = document;
var divOne = doc.getElementById("one");
var goButton = doc.getElementById("go");

goButton.addEventListener("click", function() {
  divOne.classList="blue";
});
1
2
3
4
5
6
7
8
9
10
11
12
13
div{
  min-height:48px;
  min-width:48px;
}
.bordered{
  border: 1px solid black;
}
.green{
  background:green;
}
.blue{
  background: blue;
}
1
<button id="go">Change Class</button>


很多答案,很多好答案。

TL;DR :

1
document.getElementById('id').className = 'class'

1
2
document.getElementById('id').classList.add('class');
document.getElementById('id').classList.remove('class');

就是这样。

而且,如果你真的想知道原因并自学,那么我建议你阅读彼得·布格顿的答案,它是完美的:
https://stackoverflow.com/a/19638/1804013

注意事项;
这可以通过(文档或事件)实现:

  • GetElementByID()。
  • GetElementsByClassName()。
  • 查询选择器()
  • 查询选择单元格()。


是的,有很多方法可以做到这一点。在ES6语法中,我们可以轻松实现。使用此代码切换添加和删除类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
const tabs=document.querySelectorAll('.menu li');

for(let tab of tabs){
 
  tab.onclick=function(){
   
  let activetab=document.querySelectorAll('li.active');
   
  activetab[0].classList.remove('active')
 
    tab.classList.add('active');
  }
 
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
body {
    padding:20px;
    font-family:sans-serif;    
}

ul {
    margin:20px 0;
    list-style:none;
}

li {
    background:#dfdfdf;
    padding:10px;
    margin:6px 0;
    cursor:pointer;
}

li.active {
    background:#2794c7;
    font-weight:bold;
    color:#ffffff;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Please click an item:

<ul class="menu">
  <li class="active"><span>Three</span>
</li>

 
<li>
<span>Two</span>
</li>

 
<li>
<span>One</span>
</li>


</ul>


EDOCX1·0的DOMAPI:

添加和移除类的一种非常方便的方式是EDOCX1×0的DOM API。这个API允许我们选择特定的DOM元素的所有类,以便使用JavaScript修改列表。例如:

1
2
const el = document.getElementById("main");
console.log(el.classList);
1
 

我们可以在日志中观察到,我们返回的对象不仅包含元素的类,还包含许多辅助方法和属性。此对象继承自接口domTokenList,该接口在dom中用于表示一组空格分隔的标记(如类)。

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const el = document.getElementById('container');


function addClass () {
   el.classList.add('newclass');
}


function replaceClass () {
     el.classList.replace('foo', 'newFoo');
}


function removeClass () {
       el.classList.remove('bar');
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
button{
  margin: 20px;
}

.foo{
  color: red;
}

.newFoo {
  color: blue;
}

.bar{
  background-color:powderblue;
}

.newclass{
  border: 2px solid green;
}
1
2
3
4
5
6
7
8
9
10
11
12
 "Sed ut perspiciatis unde omnis
  iste natus error sit voluptatem accusantium doloremque laudantium,
  totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et
  quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam
  voluptatem quia voluptas
 
 
<button onclick="
addClass()">AddClass</button>
 
<button onclick="
replaceClass()">ReplaceClass</button>
 
<button onclick="
removeClass()">removeClass</button>


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

我想在我的javascript框架中添加一些类似jquery的功能,比如添加类、删除类等,这在IE9+中得到了完全支持,我的代码是用ES6编写的,所以你需要确保浏览器支持它,或者你使用类似babel的工具,否则需要使用ES5syn。在您的代码中纳税,也就是说,我们通过ID查找元素,这意味着元素需要有一个要选择的ID:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//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);
  }

}

您可以简单地调用use them,如下所示,假设您的元素的id为"id",class为"class",确保将它们作为字符串传递,您可以使用util,如下所示:

1
2
3
4
classUtil.addClass('myId', 'myClass');
classUtil.removeClass('myId', 'myClass');
classUtil.hasClass('myId', 'myClass');
classUtil.toggleClass('myId', 'myClass');

我只是想把这个扔进去:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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(' ');
}

尝试

1
function change(el) { el.className='second' }
1
2
.first { width: 50px; height: 50px; background: blue }
.second { width: 150px; height: 150px; background: red; transition: all 0.3s ease-in }
1
<button  onclick="change(box)">Click me</button>


工作的javascript代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Add class from Javascript
Replace class from Javascript
Remove class from Javascript
<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 ="";
    }

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


下面是简单的jquery代码。

1
2
3
4
5
6
$(".class1").click(function(argument) {
    $(".parentclass").removeClass("classtoremove");
    setTimeout(function (argument) {
        $(".parentclass").addClass("classtoadd");
    }, 100);
});

在这里,

  • Class1是事件的侦听器。
  • 父类是承载要更改的类的类
  • 课堂记忆是你的旧课堂。
  • 要添加的类是要添加的新类。
  • 100是更改类的超时延迟。

祝你好运。


这对于类似jquery的库来说是最简单的:

1
2
3
4
5
6
7
<input type="button" onClick="javascript:test_byid();" value="id='second'" />


function test_byid()
{
    $("#second").toggleClass("highlight");
}


无意冒犯,但在强制CSS解释器重新计算整个网页的视觉呈现时,立即更改类是不明智的。

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

永远不要在飞行中更改类名!-)

但通常只需要更改一两个属性,这很容易实现:

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