ChatGPT解决这个技术问题 Extra ChatGPT

如何将类添加到给定元素?

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

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

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

我怎样才能做到这一点?

对于 2020 年或以后阅读此主题的任何人,请跳过旧的 className 方法并改用 element.classList.add("my-class")

l
laurent

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

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

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

element.classList.remove 删除一个类:

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

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

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

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

然后

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

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

另见element.className on MDN


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

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

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

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

element.classList.remove("otherclass");

我不希望自己添加任何空白空间和重复条目处理(使用 document.className 方法时需要这样做)。有一些 browser limitations,但您可以使用 polyfills 解决它们。


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

随心所欲地找到目标元素“d”,然后:

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

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


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

添加类

交叉兼容 在下面的示例中,我们将类名添加到 元素。这是 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 += '等待'; }

性能 如果您更关心交叉兼容性的性能,您可以将其缩短到以下,即快 4%。 var z = 文档.body; document.body.classList.add('wait');

方便 或者,您可以使用 jQuery,但结果性能明显变慢。根据 jsPerf $('body').addClass('wait'); 慢 94%;

删除类

性能 如果您关心性能 var a = document.body, c = 'classname'; 有选择地使用 jQuery 是删除类的最佳方法$(a).removeClass(c);

如果没有 jQuery,它会慢 32% var a = document.body, c = 'classname'; a.className = a.className.replace( c, '' ); a.className = a.className + c;

参考

jsPerf 测试用例:添加类 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")

哇,谢谢 :) 速记版本 (a.classList ? ...) 与普通版本 (if (a.classList) { ....) 相比有什么速度差异吗?
还有 classList.remove()。你为什么不使用它?它比 jQuery jsperf.com/remove-class-vanilla-vs-jquery 快得多
@FezVrasta classList 在 IE 10 之前不受支持,它仍然拥有不错的市场份额(在 netmarketshare.com 上增加了 13%)。
@Adam 除了删除课程外,他使用 classList 进行所有操作,这就是我问它的原因。
@FezVrasta 在交叉兼容下我确实使用了 .add() 但只有在检查它是否可用之后,才可以交叉兼容。对于删除,我懒得重复自己,所以我没有包括尽可能多的选项。
S
Shoaib Chikate

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

添加类:

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

对于删除类:

document.getElementById("div1").classList.remove("classToBeRemoved");

其他用户已经多次回答了这个问题,包括讨论浏览器支持和垫片。
@bafromca 我没有看到之前的答案是我的错误。你可以标记这个答案
@ShoaibChikate:您也可以根据需要删除答案(您会保留分数)。只是试图减少这个问题的混乱;完全取决于你。
m
meouw

当我正在做的工作不保证使用库时,我使用这两个函数:

function addClass( classname, element ) {
    var cn = element.className;
    //test for existance
    if( cn.indexOf( classname ) != -1 ) {
        return;
    }
    //add a space if the element already has class
    if( cn != '' ) {
        classname = ' '+classname;
    }
    element.className = cn+classname;
}

function removeClass( classname, element ) {
    var cn = element.className;
    var rxp = new RegExp( "\\s?\\b"+classname+"\\b", "g" );
    cn = cn.replace( rxp, '' );
    element.className = cn;
}

if( cn.indexOf( classname ) != -1 ) { return; } 请注意,如果您添加“btn”类且“btn-info”类已在此处,则会失败。
您应该使用 element.className.split(" "); 来防止@AlexandreDieulot 在这里报告的问题。
r
rfunduk

假设您要做的不仅仅是添加这一类(例如,您还有异步请求等等),我建议您使用像 PrototypejQuery 这样的库。

这将使您需要做的所有事情(包括这个)变得非常简单。

因此,假设您的页面上现在有 jQuery,您可以使用这样的代码向元素添加类名(在这种情况下是在加载时):

$(document).ready( function() {
  $('#div1').addClass( 'some_other_class' );
} );

查看 jQuery API browser 了解其他内容。


A
Athira V Ajit
document.getElementById('some_id').className+='  someclassname'

或者:

document.getElementById('some_id').classList.add('someclassname')

当第二种方法不起作用时,第一种方法有助于添加类。
在第一种方法中,不要忘记在 ' someclassname' 前面保留一个空格。

对于删除,您可以使用:

document.getElementById('some_id').classList.remove('someclassname')

s
sjv

您可以使用 classList.add OR classList.remove 方法从元素中添加/删除类。

var nameElem = document.getElementById("name")
nameElem.classList.add("anyclss")

上面的代码将添加(而不是替换)一个类“anyclass”到nameElem。同样,您可以使用 classList.remove() 方法来删除一个类。

nameElem.classList.remove("anyclss")

非常好,但不支持 IE <= 9 或 Safari <=5.0 ... :( (caniuse.com/classlist)
has already been discussed,包括浏览器支持。
M
Mo.

向元素添加附加类:

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

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

要更改元素的所有类:

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

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

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


M
Martijn Pieters

使用 JavaScript 添加类的 2 种不同方法

JavaScript 提供了 2 种不同的方式来向 HTML 元素添加类:

使用 element.classList.add() 方法 使用 className 属性

使用这两种方法,您可以一次添加单个或多个类。

1. 使用 element.classList.add() 方法

var element = document.querySelector('.box'); // 使用 add 方法 // 添加单个类 element.classList.add('color'); // 添加多个类 element.classList.add('border', 'shadow'); .box { 宽度:200px;高度:100px; } .color { 背景:天蓝色; } .border { 边框:2px 纯黑色; } .shadow { 盒子阴影:5px 5px 5px 灰色; }

我的盒子

2. 使用 element.className 属性

注意:始终使用 += 运算符并在类名前添加一个空格以使用 classList 方法添加类。

var element = document.querySelector('.box'); // 使用 className 属性 // 添加单个类 element.className += 'color'; // 添加多个类 element.className += '边框阴影'; .box { 宽度:200px;高度:100px; } .color { 背景:天蓝色; } .border { 边框:2px 纯黑色; } .shadow { 盒子阴影:5px 5px 5px 灰色; }

我的盒子


加一用于添加多个类。
F
Ferran Maylinch

如果您不想使用 jQuery 并希望支持旧版浏览器:

function addClass(elem, clazz) {
    if (!elemHasClass(elem, clazz)) {
        elem.className += " " + clazz;
    }
}

function elemHasClass(elem, clazz) {
    return new RegExp("( |^)" + clazz + "( |$)").test(elem.className);
}

a
asdru

我也认为最快的方法是在 es5:document.querySelector(".my.super-class").classList.add('new-class') 中使用 Element.prototype.classList 但在 ie8 中没有 Element.prototype.classList 这样的东西,无论如何你可以用这个片段来填充它(可以自由编辑并改进它):

if(Element.prototype.classList === void 0){ function DOMTokenList(classes, self){ typeof classes == "string" && (classes = classes.split(' ')) while(this.length){ Array.原型.pop.apply(this); Array.prototype.push.apply(this, classes);这.__self__ = 这.__self__ || self } DOMTokenList.prototype.item = function (index){ return this[index]; } DOMTokenList.prototype.contains = function (myClass){ for(var i = this.length - 1; i >= 0 ; i--){ if(this[i] === myClass){ return true; } } return false } DOMTokenList.prototype.add = function (newClass){ if(this.contains(newClass)){ return; } this.__self__.className += (this.__self__.className?" ":"")+newClass; DOMTokenList.call(this, this.__self__.className) } DOMTokenList.prototype.remove = function (oldClass){ if(!this.contains(newClass)){ return; } this[this.indexOf(oldClass)] = undefined this.__self__.className = this.join(' ').replace(/ +/, ' ') DOMTokenList.call(this, this.__self__.className) } DOMTokenList. prototype.toggle = function (aClass){ this[this.contains(aClass)? 'remove' : 'add'](aClass) return this.contains(aClass); } DOMTokenList.prototype.replace = function (oldClass, newClass){ this.contains(oldClass) && this.remove(oldClass) && this.add(newClass) } Object.defineProperty(Element.prototype, 'classList', { get: function() { return new DOMTokenList( this.className, this ); }, enumerable: false }) }


M
Marcos Fernandez Ramos

以简单的方式添加、删除或检查元素类:

var uclass = {
    exists: function(elem,className){var p = new RegExp('(^| )'+className+'( |$)');return (elem.className && elem.className.match(p));},
    add: function(elem,className){if(uclass.exists(elem,className)){return true;}elem.className += ' '+className;},
    remove: function(elem,className){var c = elem.className;var p = new RegExp('(^| )'+className+'( |$)');c = c.replace(p,' ').replace(/  /g,' ');elem.className = c;}
};

var elem = document.getElementById('someElem');
//Add a class, only if not exists yet.
uclass.add(elem,'someClass');
//Remove class
uclass.remove(elem,'someClass');

L
Let Me Tink About It

我知道 IE9 已正式关闭,我们可以通过上面提到的 element.classList 来实现它,但我只是尝试在没有 classList 的情况下通过上面的许多答案来了解它是如何工作的,我可以学习它。

下面的代码扩展了上面的许多答案,并通过避免添加重复的类来改进它们。

function addClass(element,className){
  var classArray = className.split(' ');
  classArray.forEach(function (className) {
    if(!hasClass(element,className)){
      element.className += " "+className;
    }
  });            
}
//this will add 5 only once
addClass(document.querySelector('#getbyid'),'3 4 5 5 5');

V
Vladimir Jovanović

您可以使用类似于 jQuery 的现代方法

如果您只需要更改一个元素,即 JS 将在 DOM 中找到的第一个元素,您可以使用以下命令:

document.querySelector('.someclass').className += "red"; .red { 颜色:红色; }

这个方法只会将class "red" 添加到DOM中的第一个元素

lorem ipsum

lorem ipsum

lorem ipsum

请记住在类名前留一个空格。

如果您有多个要添加新类的类,则可以像这样使用它

document.querySelectorAll('.someclass').forEach(function(element) { element.className += "red"; }); .red { 颜色:红色; }

这个方法将把类“red”添加到DOM中所有具有“someclass”类的元素。

lorem ipsum

lorem ipsum

lorem ipsum

< /div>


如何以最后一堂课为目标?
M
Misko

只是为了详细说明其他人所说的,多个 CSS 类组合在一个字符串中,由空格分隔。因此,如果你想对其进行硬编码,它看起来就像这样:

<div class="someClass otherClass yetAnotherClass">
      <img ... id="image1" name="image1" />
</div>

从那里您可以轻松地派生添加新类所需的 javascript... 只需在元素的 className 属性后面附加一个空格,然后是新类。知道了这一点,您还可以编写一个函数,以便稍后在需要时删除一个类。


r
revelt

我认为最好使用纯 JavaScript,我们可以在浏览器的 DOM 上运行。

这是使用它的功能方法。我使用过 ES6,但可以随意使用 ES5 和函数表达式或函数定义,以适合您的 JavaScript 样式指南。

'use strict' const oldAdd = (element, className) => { let classes = element.className.split(' ') if (classes.indexOf(className) < 0) { classes.push(className) } element.className = classes.join('') } const oldRemove = (element, className) => { let classes = element.className.split(' ') const idx = classes.indexOf(className) if (idx > -1) { classes. splice(idx, 1) } element.className = classes.join('') } const addClass = (element, className) => { if (element.classList) { element.classList.add(className) } else { oldAdd( element, className) } } const removeClass = (element, className) => { if (element.classList) { element.classList.remove(className) } else { oldRemove(element, className) } }


V
Vasyl Gutnyk

纯 JS 示例。在第一个示例中,我们获取元素的 id 并添加例如 2 个类。

document.addEventListener('DOMContentLoaded', function() {
    document.getElementsById('tabGroup').className = "anyClass1 anyClass2";
})

在第二个示例中,我们获取元素的类名并再添加 1 个。

document.addEventListener('DOMContentLoaded', function() {
    document.getElementsByClassName('tabGroup')[0].className = "tabGroup ready";
})

S
S.D.

对于那些使用 Lodash 并想要更新 className 字符串的人:

// get element reference
var elem = document.getElementById('myElement');

// add some classes. Eg. 'nav' and 'nav header'
elem.className = _.chain(elem.className).split(/[\s]+/).union(['nav','navHeader']).join(' ').value()

// remove the added classes
elem.className = _.chain(elem.className).split(/[\s]+/).difference(['nav','navHeader']).join(' ').value()

K
Kamil Kiełczewski

最短的

image1.parentNode.className+=' box';

image1.parentNode.className+='盒子'; .box { 宽度:100px;高度:100px;背景:红色; }


A
Anastasis

您可以使用 API querySelector 来选择您的元素,然后使用该元素和新的类名作为参数创建一个函数。对现代浏览器使用类列表,否则对 IE8 使用。然后您可以在事件发生后调用该函数。

 //select the dom element
 var addClassVar = document.querySelector('.someclass');

 //define the addclass function
 var addClass = function(el,className){
   if (el.classList){
     el.classList.add(className);
   }
   else {
     el.className += ' ' + className;
  }
};

//call the function
addClass(addClassVar, 'newClass');

这具有 already been discussed 以及浏览器支持。
t
tehvan

首先,给 div 一个 id。然后,调用函数 appendClass:

<script language="javascript">
  function appendClass(elementId, classToAppend){
    var oldClass = document.getElementById(elementId).getAttribute("class");
    if (oldClass.indexOf(classToAdd) == -1)
    {
      document.getElementById(elementId).setAttribute("class", classToAppend);
    }
}
</script>

它将替换不附加的类!可能是缺少一行或 oldClass+" "+classToAppend 而不是最后一个 classToAppend
indexOf 是一个简单的解决方案,并且有一个 problem already pointed out
J
Jaime Montoya

就我而言,我在 DOM 中有多个名为 main-wrapper 的类,但我只想影响父级 main-wrapper。使用 :first Selector (https://api.jquery.com/first-selector/),我可以选择第一个匹配的 DOM 元素。这是我的解决方案:

$(document).ready( function() {
    $('.main-wrapper:first').addClass('homepage-redesign');
    $('#deals-index > div:eq(0) > div:eq(1)').addClass('doubleheaderredesign');
} );

正如您在我使用 $('#deals-index > div:eq(0) > div:eq(1)').addClass('doubleheaderredesign'); 的代码中看到的那样,我还为我的 DOM 中特定 div 的第二个孩子做了同样的事情。

注意:如您所见,我使用了 jQuery


A
Anon

这个js代码对我有用

提供类名替换

var DDCdiv = hEle.getElementBy.....

var cssCNs = DDCdiv.getAttribute('class');
var Ta = cssCNs.split(' '); //split into an array
for (var i=0; i< Ta.length;i++)
{
    if (Ta[i] == 'visible'){
        Ta[i] = 'hidden';
        break;// quit for loop
    }
    else if (Ta[i] == 'hidden'){
        Ta[i] = 'visible';
    break;// quit for loop
    }
}
DDCdiv.setAttribute('class',Ta.join(' ') );  // Join array with space and set class name

添加只是使用

var cssCNs = DDCdiv.getAttribute('class');
var Ta = cssCNs.split(' '); //split into an array
Ta.push('New class name');
// Ta.push('Another class name');//etc...
DDCdiv.setAttribute('class',Ta.join(' ') );  // Join array with space and set class name

删除使用

var cssCNs = DDCdiv.getAttribute('class');
var Ta = cssCNs.split(' '); //split into an array

for (var i=0; i< Ta.length;i++)
{
    if (Ta[i] == 'visible'){
        Ta.splice( i, 1 );
        break;// quit for loop
    }
}
DDCdiv.setAttribute('class',Ta.join(' ') );  // Join array with space and set class name

希望这对某人有帮助


A
Alagu

在 YUI 中,如果包含 yuidom,则可以使用

YAHOO.util.Dom.addClass('div1','className');

高温高压


它说的是 JavaScript,而不是 jQuery 或 YUI。