如何用JavaScript更改元素的类?

Nat*_*ith 2650 html javascript dom

如何onclick使用JavaScript 更改HTML元素的类以响应事件?

Pet*_*ton 3744

用于更改类的现代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');
Run Code Online (Sandbox Code Playgroud)

不幸的是,这些在v10之前的Internet Explorer中不起作用,尽管有一个垫片可以添加对IE8和IE9的支持,可以从这个页面获得.但是,它越来越受到支持.

简单的跨浏览器解决方案

选择元素的标准JavaScript方法是使用document.getElementById("Id"),这是以下示例所使用的 - 您当然可以通过其他方式获取元素,并且在正确的情况下可以简单地使用this- 但是,详细说明这一点超出了范围的答案.

要更改元素的所有类:

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

document.getElementById("MyElement").className = "MyClass";
Run Code Online (Sandbox Code Playgroud)

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

要向元素添加其他类:

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

document.getElementById("MyElement").className += " MyClass";
Run Code Online (Sandbox Code Playgroud)

要从元素中删除类:

要将单个类移除到元素而不影响其他可能的类,需要使用简单的正则表达式替换:

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

这个正则表达式的解释如下:

(?:^|\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)
Run Code Online (Sandbox Code Playgroud)

如果g已多次添加类名,则该标志告诉replace按要求重复.

要检查某个类是否已应用于元素:

上面用于删除类的相同正则表达式也可用于检查特定类是否存在:

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


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

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

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

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

(不需要在脚本标记中包含此代码,这仅仅是为了简洁示例,并且在不同的文件中包含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>
Run Code Online (Sandbox Code Playgroud)

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


JavaScript框架和库

上面的代码都是标准的JavaScript,但通常的做法是使用框架或库来简化常见任务,以及从编写代码时可能没有想到的修复错误和边缘情况中获益.

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

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

上面的示例已经使用jQuery重现,可能是最常用的JavaScript库(尽管还有其他值得研究的).

(注意,$这是jQuery对象.)

使用jQuery更改类:

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

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

if ( $('#MyElement').hasClass('MyClass') )
Run Code Online (Sandbox Code Playgroud)

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

$('#MyElement').toggleClass('MyClass');
Run Code Online (Sandbox Code Playgroud)


使用jQuery为click事件分配函数:

$('#MyElement').click(changeClass);
Run Code Online (Sandbox Code Playgroud)

或者,不需要id:

$(':button:contains(My Button)').click(changeClass);
Run Code Online (Sandbox Code Playgroud)


  • 伟大的回答彼得.一个问题......为什么用JQuery比用Javascript更好**?JQuery很棒,但是如果这就是你需要做的 - 包括整个JQuery库而不是几行JavaScript的理由是什么? (99认同)
  • 如果你试图删除一个类'myClass'并且你有一个类'prefix-myClass'你上面给出的用于删除类的正则表达式将在你的className中留下'prefix-':O (32认同)
  • 此解决方案的一个错误:当您多次单击按钮时,它会多次向元素添加"MyClass"类,而不是检查它是否已存在.因此,您最终可能会看到类似这样的HTML类属性:`class ="button MyClass MyClass MyClass"` (27认同)
  • @mattstuehler 1)短语"better yet x"**经常表示"更好(你可以)x".2)为了解决问题的核心,jQuery旨在帮助访问/操作DOM,并且通常如果你需要在整个地方完成这些操作时需要这样做. (20认同)
  • 哇,三年和183个赞成,直到现在还没有人发现.谢谢jinglesthula,我已经纠正了正则表达式,因此它不会错误地删除部分类名.//我想这是一个很好的例子,为什么一个框架(比如jQuery)值得使用 - 像这样的错误会被更快地捕获并修复,并且不需要更改普通代码. (14认同)
  • 我想解决方法是:`if(!document.getElementById("MyElement").className.match(/(?:^ |\s)MyClass(?!\ S)/))`或者,用jQuery :`if(!$ j('#MyElement').hasClass('MyClass'))`(虽然我怀疑addClass不会添加重复项?) (9认同)
  • 在添加类名称的情况下,在您要添加的类名称前面有空格. (4认同)
  • 当与类名我不得不寻找语法的变量,以形成正则表达式:`VAR正则表达式=新的RegExp( '(?:^ | \\ S)' + classToAddOrRemove + '?!(\\ S)', 'G');` (4认同)
  • 我刚刚对这个答案做了大量补充 - 批量是一样的,但如果有任何错误或进一步改进的地方,我会很感激. (3认同)
  • 我做了一些小的改编以改善答案 - 希望人们同意他们是改进?如果还有其他任何我错过的让我知道(或者只是自己编辑答案). (2认同)
  • @PeterBoughton不确定你认为这是一个改进,但我喜欢:`(''+ document.getElementById("MyElement").className +'').replace(''+ MyClass +'','')` (2认同)
  • 我使用类似的方法,但使用ag(一般)正则表达式.原因正好是@Web_Designer上面描述的问题:如果用户多次点击,您最终会得到同一个类的多个实例,并且必须删除所有实例才能删除该类. (2认同)
  • 这里缺少的一个重要细节是框架和库之间的区别.jQuery是一个库,而不是一个框架.仅为了示例的安全,例如,框架将是angularJs. (2认同)
  • _(您可以指定以空格分隔的元素列表.)_您必须表示要分配的类列表,而不是要选择的元素. (2认同)
  • \ b匹配连字符旁边. (2认同)

Tyi*_*ilo 406

你也可以这样做:

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

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

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

  • 我相信这是HTML5依赖. (62认同)
  • [Mozilla开发者网络](https://developer.mozilla.org/en-US/docs/DOM/element.classList)声明它在本地使用不到10的Internet Explorers中工作.我找到了声明在我的测试中是真的.显然,Internet Explorer 8-9需要[Eli Gray shim](http://eligrey.com).不幸的是,我在他的网站上找不到它(即使是搜索).Mozilla链接上提供了垫片. (15认同)
  • 你需要Eli Gray的`classList`垫片. (12认同)
  • atow"classList"在IE10 +中有部分支持; 不支持Opera Mini; 其他标准浏览器完全支持:http://caniuse.com/#search=classlist (4认同)
  • [这里是 `classList` 的 MDN 文档](https://developer.mozilla.org/en-US/docs/Web/API/Element/classList)。 (2认同)

And*_*ich 109

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

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, ' ');
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

到目前为止,肯定会更好地使用jQuery.

  • 当您的客户端不允许您使用jQuery时,这非常有用.(因为你最终几乎建立了自己的图书馆.) (8认同)
  • @kfrncs因为我一般不需要那么庞大的框架.对于我想到的项目,我需要的唯一函数是3个classname(has,add,remove)函数和cookie(has,add,remove)函数.其他一切都是定制的,或者本机支持得很好.因此,在缩小之前,所有东西一共只有150行,包括评论. (4认同)
  • @Mike如果客户端不允许您使用jQuery,您是否可以只浏览并仅将您需要的功能重建到您自己的库中? (2认同)
  • 伙计,现在是凌晨 4 点,非常感谢。Vanilla JS 是我们在我的项目中使用的,这是一个救星。 (2认同)

Eri*_*lin 74

您可以这样使用node.className:

document.getElementById('foo').className = 'bar';
Run Code Online (Sandbox Code Playgroud)

根据PPK,这应该适用于IE5.5及更高版本.

  • 这将覆盖对象上的任何和所有其他类...所以它不是那么简单. (9认同)

Pse*_*nja 45

使用纯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);
    }
}
Run Code Online (Sandbox Code Playgroud)


Tra*_*s J 45

哇,惊讶于这里有太多的矫枉过正的答案......

<div class="firstClass" onclick="this.className='secondClass'">
Run Code Online (Sandbox Code Playgroud)

  • 我不同意,因为我认为示例代码应该树立一个很好的例子. (21认同)
  • 我会说不引人注目的javascript是编写示例代码的可怕做法...... (13认同)
  • 其他答案并不过分,他们还会在元素上保留现有的类. (3认同)

Sat*_*pta 45

4 个可能的操作:添加、删除、检查和切换

让我们看看每个操作的多种方式。

1.添加班级

方法1:在现代浏览器中添加类的最佳方法是使用classList.add()元素方法。

  • 案例 1:添加单个类

    function addClass() {
      let element = document.getElementById('id1');
    
      // adding class
      element.classList.add('beautify');
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 案例2:添加多个类

    add()添加多个类,在方法中用逗号分隔类

    function addClass() {
      let element = document.getElementById('id1');
    
      // adding multiple class
      element.classList.add('class1', 'class2', 'class3');
    }
    
    Run Code Online (Sandbox Code Playgroud)

方法 2 - 您还可以使用属性向 HTML 元素添加类className

  • 情况 1:覆盖预先存在的类 当您将新类分配给属性时,className它会覆盖以前的类。
    function addClass() {
      let element = document.getElementById('id1');
    
      // adding multiple class
      element.className = 'beautify';
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 情况 2:添加类而不覆盖+=对类使用运算符不覆盖以前的类。另外,在新类之前添加一个额外的空格。
    function addClass() {
      let element = document.getElementById('id1');
    
      // adding single multiple class
      element.className += ' beautify';
      // adding multiple classes
      element.className += ' class1 class2 class3';
    }
    
    Run Code Online (Sandbox Code Playgroud)

2. 删除类

方法 1 - 从元素中删除类的最佳方法是classList.remove()方法。

  • 情况 1:删除单个类

    只需传递要从方法中的元素中删除的类名即可。

    function removeClass() {
      let element = document.getElementById('id1');
    
      // removing class
      element.classList.remove('beautify');
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 情况 2:删除多个类

    传递以逗号分隔的多个类。

    function removeClass() {
      let element = document.getElementById('id1');
    
      // removing class
      element.classList.remove('class1', 'class2', 'class3');
    }
    
    Run Code Online (Sandbox Code Playgroud)

方法 2 - 您还可以使用className方法删除类。

  • 情况 1:删除单个类 如果该元素只有 1 个类并且您想删除它,则只需为该方法分配一个空字符串即可className
    function removeClass() {
      let element = document.getElementById('id1');
    
      // removing class
      element.className = '';
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 情况 2:删除多个类 如果元素有多个类,首先使用className属性从元素获取所有类,然后使用替换方法并用空字符串替换所需的类,最后将其分配给元素的 className属性。
    function removeClass() {
      let element = document.getElementById('id1');
    
      // removing class
      element.className = element.className.replace('class1', '');
    }
    
    Run Code Online (Sandbox Code Playgroud)

3.检查班级

要检查元素中是否存在类,您可以简单地使用classList.contains()方法。true如果类存在则返回,否则返回 false。

function checkClass() {
  let element = document.getElementById('id1');

  // checking class
  if(element.classList.contains('beautify') {
      alert('Yes! class exists');
  }
}
Run Code Online (Sandbox Code Playgroud)

4. 切换类

要切换类,请使用classList.toggle()方法。

function checkClass() {
  let element = document.getElementById('id1');

  // checking class
  if(element.classList.contains('beautify') {
      alert('Yes! class exists');
  }
}
Run Code Online (Sandbox Code Playgroud)


Gop*_*jan 31

这对我有用:

function setCSS(eleID) {
    var currTabElem = document.getElementById(eleID);

    currTabElem.setAttribute("class", "some_class_name");
    currTabElem.setAttribute("className", "some_class_name");
}
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用“el.setAttribute('class', newClass)”或更好的“el.className = newClass”。但不是`el.setAttribute('className', newClass)`。 (2认同)

mok*_*oka 19

你也可以扩展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);
}
Run Code Online (Sandbox Code Playgroud)

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

document.getElementById('yourElementId').onclick = function() {
  this.toggleClass('active');
}
Run Code Online (Sandbox Code Playgroud)

这是演示.

  • 对不起@Jackson_Sandland,但你完全错过了这一点,完全不使用jQuery. (5认同)

Ben*_*ynn 16

只是为了添加来自其他流行框架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)
Run Code Online (Sandbox Code Playgroud)

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

var myElement = goog.dom.query("#MyElement")[0];
Run Code Online (Sandbox Code Playgroud)


Ale*_*son 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, ' ') + "]");
Run Code Online (Sandbox Code Playgroud)


小智 12

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
Run Code Online (Sandbox Code Playgroud)


shi*_*kko 11

我会使用jQuery并写这样的东西:

jQuery(function($) {
    $("#some-element").click(function() {
        $(this).toggleClass("clicked");
    });
});
Run Code Online (Sandbox Code Playgroud)

此代码添加了在单击id some元素的元素时要调用的函数.该函数将点击该元素的class属性,如果它不是已经是它的一部分,如果它的存在,删除它.

是的,您确实需要在页面中添加对jQuery库的引用以使用此代码,但至少您可以确信库中的大多数函数可以在几乎所有现代浏览器上运行,并且它将节省您实施的时间你自己的代码做同样的事情.

谢谢

  • 你只需要用长形式编写`jQuery`一次.`jQuery(function($){});`在所有情况下``使`$`在函数内可用. (8认同)

小智 9

这条线

document.getElementById("MyElement").className = document.getElementById("MyElement").className.replace(/\bMyClass\b/','')
Run Code Online (Sandbox Code Playgroud)

应该:

document.getElementById("MyElement").className = document.getElementById("MyElement").className.replace('/\bMyClass\b/','');
Run Code Online (Sandbox Code Playgroud)

  • 不正确.RegEx被正斜杠所取代.添加引号会导致它在IE中失败,返回您尝试删除的类的字符串,而不是实际删除该类. (8认同)

小智 7

这是我的版本,完全正常工作:

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
}
Run Code Online (Sandbox Code Playgroud)

用法:

<tr onmouseover='addHTMLClass(this,"clsSelected")'
onmouseout='removeHTMLClass(this,"clsSelected")' >
Run Code Online (Sandbox Code Playgroud)

  • 如果你试图删除类`foo`,那将破坏类`foobar`.内部事件处理程序属性中的JS在编辑之前已被破坏.4岁的接受答案要好得多. (4认同)

kof*_*fus 7

这是一个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;
}
Run Code Online (Sandbox Code Playgroud)

jsfiddle

另请参阅我在这里动态创建新类的答案


Eug*_*rin 6

使用IE6支持更改vanilla JavaScript中的元素类

您可以尝试使用node 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);
})
Run Code Online (Sandbox Code Playgroud)
.red {
  color: red;
}
.red:before {
  content: 'I am red! ';
}
.red:after {
  content: ' again';
}
.blue {
  color: blue;
}
.blue:before {
  content: 'I am blue! '
}
Run Code Online (Sandbox Code Playgroud)
<span id="message" class="">Click me</span>
Run Code Online (Sandbox Code Playgroud)


tim*_*mbo 6

OP 问题是如何使用 JavaScript 更改元素的类?

现代浏览器允许你用一行 JavaScript来做到这一点:

document.getElementById('id').classList.replace('span1', 'span2')

classList属性提供了一个具有多种方法的 DOMTokenList 。您可以使用add()remove()replace()等简单操作对元素的 classList 进行操作。或者变得非常复杂并操作类,就像使用keys()values()entries()的对象或 Map 一样。

Peter Boughton 的回答很好,但现在已经有十多年了。所有现代浏览器现在都支持 DOMTokenList - 请参阅https://caniuse.com/#search=classList甚至Internet Explorer 11 也支持一些 DOMTokenList 方法。


Sal*_*n A 5

我在代码中使用以下vanilla JavaScript函数.它们使用正则表达式,indexOf但不要求在正则表达式中引用特殊字符.

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, "");
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Kam*_*ski 5

尝试:

element.className='second'
Run Code Online (Sandbox Code Playgroud)

element.className='second'
Run Code Online (Sandbox Code Playgroud)
function change(box) { box.className='second' }
Run Code Online (Sandbox Code Playgroud)
.first  { width:  70px; height:  70px; background: #ff0                 }
.second { width: 150px; height: 150px; background: #f00; transition: 1s }
Run Code Online (Sandbox Code Playgroud)


Far*_*had 5


选项。

这里有一些样式与 classList 示例,可让您了解可用的选项以及如何使用classList它们来做您想做的事。

style 对比 classList

之间的区别style,并classList为与style您要添加的元素的样式属性,而且classList是有点儿控制元素的类(ES)( , ,,add ),我会告诉你如何使用和方法,因为这些都是流行的。removetogglecontainaddremove


样式示例

如果要将margin-top 属性添加到元素中,您可以这样做:

// Get the Element
const el = document.querySelector('#element');

// Add CSS property 
el.style.margintop = "0px"
el.style.margintop = "25px" // This would add a 25px to the top of the element.
Run Code Online (Sandbox Code Playgroud)

类列表示例

让我们说我们有一个<div class="class-a class-b">,在这种情况下,我们有2类添加到我们的div元素已经,class-a而且class-b,我们要控制哪些类remove,哪些类add。这是classList变得得心应手的地方。

消除 class-b

// Get the Element
const el = document.querySelector('#element');

// Remove class-b style from the element
el.classList.remove("class-b")

Run Code Online (Sandbox Code Playgroud)

添加 class-c

// Get the Element
const el = document.querySelector('#element');

// Add class-b style from the element
el.classList.add("class-c")

Run Code Online (Sandbox Code Playgroud)


小智 5

对于 IE v6-9(classList不支持该版本,并且您不想使用 polyfill):

var elem = document.getElementById('some-id');

// don't forget the extra space before the class name
var classList = elem.getAttribute('class') + ' other-class-name';

elem.setAttribute('class', classList);
Run Code Online (Sandbox Code Playgroud)