如何向给定元素添加类?

IT技术 javascript dom-manipulation
2021-02-07 03:59:23

我有一个已经有一个类的元素:

<div class="someclass">
    <img ... id="image1" name="image1" />
</div>

现在,我想创建一个 JavaScript 函数,它将向div(不是替换,而是添加)添加一个类

我怎样才能做到这一点?

6个回答

如果您只针对现代浏览器:

使用element.classList.add添加一个类:

element.classList.add("my-class");

element.classList.remove删除一个类:

element.classList.remove("my-class");

如果您需要支持 Internet Explorer 9 或更低版本:

className在元素属性中添加一个空格加上新类的名称首先,将 anid放在元素上,以便您可以轻松获得参考。

<div id="div1" class="someclass">
    <img ... id="image1" name="image1" />
</div>

然后

var d = document.getElementById("div1");
d.className += " otherclass";

注意前面的空格otherclass包含空格很重要,否则它会损害类列表中位于它之前的现有类。

另请参阅MDN 上的 element.className

“一个库也可以帮助处理其他所有事情”——除了学习 JavaScript
2021-03-10 03:59:23
向 DOM 元素添加类与学习语言有什么关系?document.getElementById('div1').className 是一个库相关的问题,就像使用 jQuery 来做同样的事情一样。问题是“我该怎么做”,经过彻底测试的库是明智的答案。
2021-03-12 03:59:23
@meouw:我同意你的看法。jQuery是写JavaScript中,但是,所以我认为,提至OP一个库是一个好主意不是“向下推[他]喉咙框架”。就这样。
2021-03-14 03:59:23
@thenduks:我相信你知道 JavaScript !== jQuery。这个问题的答案包括图书馆和非图书馆解决方案是一件好事,因为重要的是要知道事情如何工作的,而不仅仅是完成它们的最简单方法。你会注意到这个问题被标记为 javascript
2021-03-17 03:59:23
如果整个页面上唯一需要用 JavaScript 完成的工作就是添加这个类名,那么是的。但我看不出这是页面的唯一动态部分。图书馆也将帮助处理其他一切。30-50kb 的 jQuery 几乎不值得讨论。
2021-03-24 03:59:23

在没有任何框架的情况下执行此操作的最简单方法是使用element.classList.add方法。

var element = document.getElementById("div1");
element.classList.add("otherclass");

编辑: 如果你想从元素中删除类 -

element.classList.remove("otherclass");

我不想自己添加任何空白区域和重复条目处理(使用该document.className方法时需要这样做)。有一些浏览器限制,但您可以使用polyfills解决它们

2021-03-16 03:59:23
遗憾的是,在 IE 10.0 之前不支持此功能,因为它是一项出色的功能,也是我经常遇到的问题的最简单解决方案。
2021-03-20 03:59:23
classList 的 polyfill 可用。
2021-03-29 03:59:23
这个似乎是最好用的,因为那些有空间的人至少感觉像黑客——而不是添加类......
2021-04-04 03:59:23
@SilverRingvee 空间方法的另一个风险是其他一些开发人员可能不知道它的重要性,并删除它以进行清理。
2021-04-09 03:59:23

找到你想要的目标元素“d”,然后:

d.className += ' additionalClass'; //note the space

你可以用更聪明的方式包装它来检查预先存在,并检查空间要求等。

要删除老式方法,split空格上的类名,从结果数组中删除您不想要的那个,然后join再次删除数组...或使用element.classList.remove.
2021-03-11 03:59:23
@TheTechy - 如果您需要保留不止一门课程(这些天经常发生这种情况),那将行不通。
2021-03-13 03:59:23
并使用此方法删除?
2021-04-05 03:59:23
@DeathGrip 只是将类设置回单个定义的名称 d.className = 'originalClass';
2021-04-09 03:59:23

添加class

  • 交叉兼容

    在下面的示例中,我们将 a 添加classname<body>元素。这是 IE-8 兼容的。

    var a = document.body;
    a.classList ? a.classList.add('classname') : a.className += ' classname';
    

    这是以下内容的简写..

    var a = document.body;
    if (a.classList) {
        a.classList.add('wait');
    } else {
        a.className += ' wait';
    }
    

  • 表现

    如果您更关心性能而不是交叉兼容性,您可以将其缩短为以下 4% 的速度。

    var z = document.body;
    document.body.classList.add('wait');
    

  • 方便

    或者,您可以使用 jQuery,但结果性能明显变慢。根据 jsPerf 慢 94%

    $('body').addClass('wait');
    


删除类

  • 表现

    如果您关心性能,则有选择地使用 jQuery 是删除类的最佳方法

    var a = document.body, c = ' classname';
    $(a).removeClass(c);
    

  • 没有 jQuery,它会慢 32%

    var a = document.body, c = ' classname';
    a.className = a.className.replace( c, '' );
    a.className = a.className + c;
    

参考

  1. jsPerf 测试用例:添加一个类
  2. jsPerf 测试用例:删除一个类

使用原型

Element("document.body").ClassNames.add("classname")
Element("document.body").ClassNames.remove("classname")
Element("document.body").ClassNames.set("classname")

使用 YUI

YAHOO.util.Dom.hasClass(document.body,"classname")
YAHOO.util.Dom.addClass(document.body,"classname")
YAHOO.util.Dom.removeClass(document.body,"classname")
@FezVrasta 在交叉兼容下,我确实使用了 .add() 但只有在检查它是否可用后,才能交叉兼容对于删除,我没有费心重复自己,所以我没有包含尽可能多的选项。
2021-03-20 03:59:23
@AdamclassList除了删除课程外,他用于所有事情,这就是我问它的原因。
2021-03-22 03:59:23
哇,谢谢 :) 速记版本 ( a.classList ? ...) 与普通版本 ( ) 相比有什么速度差异if (a.classList) { ....吗?
2021-04-02 03:59:23
@FezVrasta classList 在 IE 10 之前不受支持,IE 10 仍然具有不错的市场份额(在 netmarketshare.com 上为 +13%)。
2021-04-03 03:59:23
有 olso classList.remove()你为什么不使用它?它比 jQuery jsperf.com/remove-class-vanilla-vs-jquery 快得多
2021-04-06 03:59:23

使用纯 JavaScript 将类添加到元素的另一种方法

添加类:

document.getElementById("div1").classList.add("classToBeAdded");

对于删除类:

document.getElementById("div1").classList.remove("classToBeRemoved");
@bafromca 我没有看到之前给出的答案是我的错误。你可以标记这个答案
2021-03-25 03:59:23
@ShoaibChikate:如果您愿意,您也可以删除答案(您将保留积分)。只是试图减少这个问题上的混乱;完全取决于你。
2021-03-26 03:59:23
其他用户已经多次回答了这个问题,包括对浏览器支持和垫片的讨论。
2021-04-03 03:59:23