如何使用JavaScript更改元素的类?


2776

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


28
“ class属性通常用于指向样式表中的类。但是,JavaScript(通过HTML DOM)也可以使用它来对具有指定类的HTML元素进行更改。” - w3schools.com/tags/att_standard_class.asp
Triynko

11
element.setAttribute(name, value); 替换nameclass。用value您给该类的任何名称替换,并用引号引起来。这样可以避免删除当前类并添加其他类。这个jsFiddle示例显示了完整的工作代码。
艾伦·威尔斯

3
要使用onClick更改HTML元素类,请使用以下代码:<input type='button' onclick='addNewClass(this)' value='Create' /> 并在javascript部分:function addNewClass(elem){ elem.className="newClass";} 在线
Iman Bahrampour

@Triynko-w3schools上的链接已更改,就像在2012年9月一样。这是2012年9月12日在Archive.org上的页面:HTML类Attribute-w3schools。这是w3schools.com上替换页面的链接:HTML类Attribute-w3schools
凯文·费根

Answers:


3879

更改类的现代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');

遗憾的是,尽管有一些垫片可以将其支持添加到IE8和IE9中,但这些工具无法在v10之前的Internet Explorer中工作,页面。但是,它越来越受到支持

简单的跨浏览器解决方案

选择元素的标准JavaScript方法是使用 document.getElementById("Id"),这是以下示例所使用的-您当然可以以其他方式获取元素,并且在合适的情况下可以简单地使用它this-但是,对此的详细讨论已超出了范围的答案。

更改元素的所有类:

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

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

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

要将附加类添加到元素:

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

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

要从元素中删除类:

要在元素中删除单个类而又不影响其他潜在类,则需要简单的正则表达式替换:

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

此正则表达式的解释如下:

(?:^|\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已多次添加类名,则该标志指示替换根据需要重复。

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

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

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


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

虽然可以直接在HTML事件属性(例如 onclick="this.className+=' MyClass'")不建议。尤其是在大型应用程序上,通过将HTML标记与JavaScript交互逻辑分开,可以实现更具可维护性的代码。

实现此目的的第一步是创建一个函数,然后在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工作,或者可能有不寻常的跨浏览器行为的任何事情,则值得考虑。

(大致来说,库是为特定任务而设计的一组工具,而框架通常包含多个库并执行一整套职责。)

上面的示例已在下面使用jQuery进行了重现,它可能是最常用的JavaScript库(尽管还有其他值得研究的地方)。

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

使用jQuery更改类:

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

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

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

另外,jQuery提供了一种捷径,用于添加不适用的类,或删除适用的类:

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


使用jQuery将功能分配给click事件:

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

或者,不需要ID:

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



105
很好的答案彼得。一个问题...为什么使用JQuery比使用Java 更好?JQuery很棒,但是如果这是您需要做的一切,那么有什么理由包括整个JQuery libray而不是几行JavaScript?
mattstuehler 2011年

23
@mattstuehler 1)短语“ x更好” 通常意味着“ x 更好(您可以)”。2)要深入探讨问题,jQuery旨在帮助访问/操纵DOM,并且在很多情况下,如果需要执行此类操作,通常会需要这样做。
巴里

31
此解决方案的一个错误:多次单击按钮时,它将多次将“ MyClass”的类添加到元素,而不是检查它是否已经存在。因此,您可能最终得到一个类似于以下内容的HTML类属性:class="button MyClass MyClass MyClass"
Web_Designer 2011年

35
如果您要删除类'myClass',并且有一个类'prefix-myClass',则您在上面给出的用于删除类的正则表达式将使您的className中带有'prefix-'::
jinglesthula 2011年

16
哇,三年零183次投票,直到现在还没有人发现。感谢jinglesthula,我更正了正则表达式,因此它不会错误地删除部分类名。//我想这是一个很好的例子,说明为什么框架(如jQuery)值得使用-像这样的错误会尽快被发现并修复,并且不需要更改常规代码。
彼得·

422

您也可以这样做:

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

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

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

63
我相信这是HTML5依赖的。
约翰

12
您将需要Eli Grey的classList垫片。
ELLIOTTCABLE 2011年

15
Mozilla开发人员网络指出,它在少于10个的Internet Explorer中本身不起作用。我在测试中发现该说法是正确的。显然,Internet Explorer 8-9需要使用Eli Gray垫片。不幸的是,即使在搜索中,我也找不到它。该垫片可在Mozilla链接上找到。
doubleJ 2012年


4
atow“ classList”在IE10 +中有部分支持;不支持Opera Mini;其余标准浏览器中的其他功能完全支持:caniuse.com/#search=classlist
Nick Humphrey,

119

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

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, ' ');
    }
}

因此,例如,如果我想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>

到目前为止,可以肯定的是使用jQuery会更好。


8
当您的客户不允许您使用jQuery时,这非常有用。(因为您最终几乎要建立自己的图书馆。)
Mike

1
@Mike如果客户端不允许您使用jQuery,您是否不能仅将所需的功能重新构建到自己的库中?
kfrncs

5
@kfrncs因为我通常不需要那么大的框架。对于我正在考虑的项目,我唯一需要的功能是3个类名(具有,添加,删除)功能和cookie(具有,添加,删除)功能。其他所有东西都是自定义的,或者是本机很好的支持。因此,在压缩之前,所有内容加起来只有150行,包括注释。
麦克,

2
杜德(Dude),凌晨4点,非常感谢。Vanilla JS是我们在我的项目中使用的东西,这可以节省生命。
LessQuesar 2015年

这是我最喜欢的解决方案。我到处都用它。我相信,当您的项目还没有其他方法可以完成添加和删除类时,这是最优雅的方法。
WebWanderer


51

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

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

14
我会说不打扰的javascript是编写示例代码的可怕实践……
Gabe 2012年

22
我不同意,因为我认为示例代码应该树立一个好榜样。
thomasrutter

1
一个好的例子应该同时指导和激发想象力。它不应取代思想,而应激发思想。
安东尼·鲁特里奇

4
其他答案不是过分的,它们还将现有的类保留在元素上。
gcampbell 2016年

47

使用纯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);
    }
}

33

这为我工作:

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

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

很好的答案!刚出补充:设定每个CSS类名选择到指定样式的一组类的元素
罗马POLEN。

这在FF上对我有效,但是当我尝试使用el.className =“ newStyle”; 它没有用,为什么呢?
Lukasz'Severiaan'Grela 2012年

1
您可以使用el.setAttribute('class', newClass)或更好el.className = newClass。但是不是el.setAttribute('className', newClass)
Oriol 2015年

20

同样,您可以扩展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');
}

这是演示


1
这个有点冗长...这是一个非常简洁的解决方案... jsfiddle.net/jdniki/UaT3P
zero_cool 2014年

5
对不起,@ Jackson_Sandland,但是您完全错过了重点,那就是根本不使用jQuery。
moka

17

只是要添加来自另一个流行框架Google Closures的信息,请参阅其dom / classs类:

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选择器结合使用:

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

14

对以前的正则表达式的一些小注释和调整:

如果班级列表中的班级名称不止一次,您将希望在全局范围内执行此操作。而且,您可能希望从类列表的末尾删除空格,并将多个空格转换为一个空格,以免出现空格。如果仅使用类名进行拼写的代码使用下面的正则表达式并在添加名称之前将其删除,那么所有这些都应该不是问题。但。好吧,谁知道谁可能在和班级名称表打扰。

此正则表达式不区分大小写,因此在不关心类名大小写的浏览器上使用代码之前,可能会显示类名中的错误。

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, ' ') + "]");

13

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

13

我将使用jQuery并编写如下内容:

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

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

是的,您确实需要在页面中添加对jQuery库的引用才能使用此代码,但是至少您可以确信该库中的大多数功能将在几乎所有现代浏览器上都可以使用,并且可以节省实施时间您自己的代码也可以这样做。

谢谢


8
您只需要以jQuery长格式编写一次。jQuery(function($) { });使得$可用的内部在所有情况下的功能。
ThiefMaster 2012年

10

线

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

应该:

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

8
不正确 正则表达式由正斜杠代替。添加引号会导致它在IE中失败,返回您要删除的类的字符串,而不是实际删除的类。
Dylan

9

在支持IE6的原始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);
})
.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>


8

这是我的版本,可以正常使用:

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")' >

4
foobar如果您尝试删除class,那将破坏class foo。内部事件处理程序属性中的JS在被编辑之前已损坏。4岁接受的答案要好得多。
昆汀

1
谢谢,我解决了它(不是前缀问题)。这是旧的公认答案,并且正则表达式存在错误。
2012年

代码仍然有foobar问题。在此处
rosell.dk

8

这是一个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

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


6

我在代码中使用了以下普通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, "");
    }
}

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


3

选项。

这是一个样式vs.classList的小示例,可让您了解可用的选项以及如何使用它classList来执行所需的操作。

styleclassList

之间的区别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.

classList示例

假设我们有一个<div class="class-a class-b">,在这种情况下,已经在div元素中添加了2个类,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")

class-c

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

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


1

只是以为我会把这个扔进去:

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

只是说,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>


1

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

我想在我的javascript框架中执行以下操作,以添加一些功能来处理类似于jQuery的添加类,删除类等功能,这在IE9 +中完全受支持,而且我的代码是在ES6中编写的,因此您需要为了确保您的浏览器支持它,或者您使用babel之类的东西,否则需要在代码中使用ES5语法,同样通过这种方式,我们通过ID查找元素,这意味着该元素需要选择一个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);
  }

}

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

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

1

classList DOM API:

添加和删​​除类的一种非常方便的方式是classListDOM API。该API允许我们选择特定DOM元素的所有类,以便使用javascript修改列表。例如:

const el = document.getElementById("main");
console.log(el.classList);
<div class="content wrapper animated" id="main"></div>

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

例:

const el = document.getElementById('container');


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


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


function removeClass () {
       el.classList.remove('bar');
}
button{
  margin: 20px;
}

.foo{
  color: red;
}

.newFoo {
  color: blue;
}

.bar{
  background-color:powderblue;
}

.newclass{
  border: 2px solid green;
}
<div class="foo bar" id="container">
  "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 
 </div>
  
<button onclick="addClass()">AddClass</button>
  
<button onclick="replaceClass()">ReplaceClass</button>
  
<button onclick="removeClass()">removeClass</button>
  


1

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

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'); 
  }
  
}
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;
}
<i>Please click an item:</i>

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


1
function classed(el, class_name, add_class) {
  const re = new RegExp("(?:^|\\s)" + class_name + "(?!\\S)", "g");
  if (add_class && !el.className.match(re)) el.className += " " + class_name
  else if (!add_class) el.className = el.className.replace(re, '');
}

使用上面接受的答案是一个简单的跨浏览器函数,用于添加和删除类

添加类:

classed(document.getElementById("denis"), "active", true)

删除类别:

classed(document.getElementById("denis"), "active", false)

1

很多答案,很多好的答案。

TL; DR:

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

要么

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

而已。

而且,如果您真的想知道原因并进行自我教育,那么我建议您阅读Peter Boughton的答案,这很完美。

注意:
这可以通过(documentevent)来实现:

  • getElementById()
  • getElementsByClassName()
  • querySelector()
  • querySelectorAll()

1

javascript中有一个属性className,用于更改HTML元素的类的名称。现有的类值将替换为您在className中分配的新值。

<!DOCTYPE html>
<html>
<head>
<title>How to change class of an HTML element in Javascript?</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
</head>
<body>
<h1 align="center"><i class="fa fa-home" id="icon"></i></h1><br />

<center><button id="change-class">Change Class</button></center>

<script>
var change_class=document.getElementById("change-class");
change_class.onclick=function()
{
    var icon=document.getElementById("icon");
    icon.className="fa fa-gear";
}

</script>
</body>
</html>

信用-https: //jaischool.com/javascript-lang/how-to-change-class-name-of-an-html-element-in-javascript.html


1

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

现代浏览器允许您使用一行javascript来做到这一点:

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

classList属性提供了具有多种方法的DOMTokenList 。您可以使用简单的操作(例如add()remove()replace())对元素的classList进行操作。或获得非常复杂和可操作的类,就像使用key()values()entry()生成对象或Map一样

彼得·布顿(Peter Boughton)的答案是一个不错的答案,但是它已经有十多年的历史了。现在,所有现代浏览器都支持DOMTokenList-请参阅https://caniuse.com/#search=classList,甚至IE11也支持某些DOMTokenList方法


1

尝试

element.className='second'


-2

有效的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>

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


1
这将破坏一个以上类的元素。
gcampbell 2016年

-4

这是执行此操作的简单jQuery代码。

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

这里,

  • Class1是事件的侦听器。
  • 父类是托管您要更改的类的类
  • Classtoremove是您拥有的旧课程。
  • 要添加的类是您要添加的新类。
  • 100是更改类的超时延迟。

祝好运。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.