我有一个元素已经有一个类:
<div class="someclass">
<img ... id="image1" name="image1" />
</div>
现在,我想创建一个JavaScript函数,它将向div添加一个类(不是替换,而是添加)。
我该怎么做?
我有一个元素已经有一个类:
<div class="someclass">
<img ... id="image1" name="image1" />
</div>
现在,我想创建一个JavaScript函数,它将向div添加一个类(不是替换,而是添加)。
我该怎么做?
如果您只针对现代浏览器:
使用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";
注意其他类之前的空格。包含空间很重要,否则它会损害类列表中前面的现有类。
另请参见MDN上的element.className。
假设您所做的不仅仅是添加这个类(例如,您还有异步请求等),我建议使用Prototype或jQuery这样的库。
这将使你需要做的所有事情(包括这个)变得非常简单。
假设您现在在页面上有jQuery,您可以使用如下代码向元素添加类名(在本例中是加载时):
$(document).ready( function() {
$('#div1').addClass( 'some_other_class' );
} );
查看jQueryAPI浏览器以了解其他内容。
找到你想要的目标元素“d”,然后:
d.className += ' additionalClass'; //note the space
您可以用更聪明的方式来包装它,以检查预存在,检查空间需求等。。
首先,给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>
为了详细说明其他人所说的,多个CSS类组合在一个字符串中,由空格分隔。因此,如果您想对其进行硬编码,它只需如下所示:
<div class="someClass otherClass yetAnotherClass">
<img ... id="image1" name="image1" />
</div>
从那里,您可以很容易地导出添加新类所需的javascript。。。只需在元素的className属性中添加一个空格,后跟新类。知道了这一点,您还可以编写一个函数,以便以后在需要时删除类。
当我正在做的工作不需要使用库时,我使用以下两个函数:
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;
}
在没有任何框架的情况下,最简单的方法是使用element.classList.add方法。
var element = document.getElementById("div1");
element.classList.add("otherclass");
编辑:如果要从元素中删除类-
element.classList.remove("otherclass");
我宁愿不添加任何空格和重复条目处理(使用document.className方法时需要这样做)。浏览器存在一些限制,但可以使用polyfills解决这些限制。
可以使用classList.add或classList.remove方法从元素中添加/删除类。
var nameElem = document.getElementById("name")
nameElem.classList.add("anyclss")
上述代码将向nameElem添加(而不是替换)一个类“anyclass”。类似地,可以使用classList.remove()方法删除类。
nameElem.classList.remove("anyclss")
要以简单的方式添加、删除或检查元素类,请执行以下操作:
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');
这个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
希望这对忧郁的人有帮助
使用纯JavaScript将类添加到元素的另一种方法
对于添加类:
document.getElementById("div1").classList.add("classToBeAdded");
要删除类:
document.getElementById("div1").classList.remove("classToBeRemoved");
添加类
交叉兼容在下面的示例中,我们向<body>元素添加类名。这与IE-8兼容。var a=文档正文;a.classList?a.classList.add('classname'):a.classname+='classname';这是以下内容的简写。。var a=文档正文;if(a.classList){a.classList.add('wait');}其他{a.className+=“等待”;}
表演如果您更关心性能而不是交叉兼容性,可以将其缩短为以下值,即速度提高4%。var z=文档正文;document.body.classList.add('wait');
方便或者,您可以使用jQuery,但结果的性能会明显降低。根据jsPerf,速度降低了94%$('body').addClass('wait');
正在删除类
表演如果您关注性能,那么有选择地使用jQuery是删除类的最佳方法var a=document.body,c=“类名”;$(a).removeClass(c);
没有jQuery,速度会慢32%var a=document.body,c=“类名”;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")
您可以使用API querySelector来选择元素,然后以元素和新类名作为参数创建函数。在现代浏览器中使用classlist,在IE8中使用else。然后,您可以在事件后调用该函数。
//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');
纯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";
})
要向元素添加其他类,请执行以下操作:
要在不删除/影响现有值的情况下将类添加到元素,请附加一个空格和新类名,如下所示:
document.getElementById("MyElement").className += " MyClass";
要更改元素的所有类,请执行以下操作:
要用一个或多个新类替换所有现有类,请设置className属性:
document.getElementById("MyElement").className = "MyClass";
(可以使用空格分隔的列表来应用多个类。)
如果您不想使用jQuery并希望支持较旧的浏览器:
function addClass(elem, clazz) {
if (!elemHasClass(elem, clazz)) {
elem.className += " " + clazz;
}
}
function elemHasClass(elem, clazz) {
return new RegExp("( |^)" + clazz + "( |$)").test(elem.className);
}
我认为最好使用纯JavaScript,它可以在浏览器的DOM上运行。
这里是使用它的函数方法。我使用过ES6,但可以随意使用ES5和函数表达式或函数定义,无论哪种都适合您的JavaScript StyleGuide。
'使用严格'const oldAdd=(元素,className)=>{let classes=element.className.split(“”)if(classes.indexOf(className)<0){classs.push(className)}element.className=classes.join(“”)}const oldRemove=(元素,className)=>{let classes=element.className.split(“”)const idx=classes.indexOf(className)如果(idx>-1){类.拼接(idx,1)}element.className=classes.join(“”)}const addClass=(元素,className)=>{if(element.classList){element.classList.add(className)}其他{oldAdd(元素,className)}}const removeClass=(元素,className)=>{if(element.classList){element.classList.remove(className)}其他{oldRemove(元素,className)}}
我知道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');
对于使用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()
您可以使用类似于jQuery的现代方法
如果您只需要更改一个元素,即JS将在DOM中找到的第一个元素,则可以使用以下方法:
document.querySelector('.someclass').className+=“red”;.红色{颜色:红色;}<div class=“someclass”><p>此方法将仅向DOM中的第一个元素添加类“red”</p></div><div class=“someclass”><p>洛雷姆ipsum</p></div><div class=“someclass”><p>洛雷姆ipsum</p></div><div class=“someclass”><p>洛雷姆ipsum</p></div>
请记住在类名前留一个空格。
如果您有多个要添加新类的类,可以这样使用
document.querySelectorAll('.someclass').forEach(函数(元素){element.className+=“红色”;});.红色{颜色:红色;}<div class=“someclass”><p>此方法将向DOM中具有“someclass”类的所有元素添加类“red”</p></div><div class=“someclass”><p>洛雷姆ipsum</p></div><div class=“someclass”><p>洛雷姆ipsum</p></div><div class=“someclass”><p>洛雷姆ipsum</p></div>
我也认为最快的方法是使用Element.prototype.classList,如es5:document.querySelector(“.my.superclass”).classList.add('new-class')但是在ie8中没有Element.prototype.classList这样的东西,无论如何,您可以用以下代码段来填充它(可以自由编辑和改进它):
if(Element.prototype.classList==void 0){函数DOMTokenList(类,自身){typeof classes==“string”&&(classes=classes.split(“”))while(此长度){Array.protocol.pop.apply(this);}数组.原型.推送.应用(this,类);这一点__self__=这个__自我__||自我}DOMTokenList.prototype.item=函数(索引){返回此[索引];}DOMTokenList.prototype.contains=函数(myClass){对于(var i=this.length-1;i>=0;i-){如果(this[i]==myClass){返回true;}}return false}DOMTokenList.prototype.add=函数(newClass){if(this.contains(newClass)){回来}这一点__self__.className+=(this.__self__.calassName?“”:“”)+newClass;DOMTokenList.call(this,this.__self__.className)}DOMTokenList.prototype.remove=函数(旧类){if(!this.contains(newClass)){回来}this[this.indexOf(oldClass)]=未定义这一点__self__.className=this.join('').replace(/+/,'')DOMTokenList.call(this,this.__self__.className)}DOMTokenList.prototype.toggle=函数(aClass){this[this.contains(aClass)?'remove':'add'](aClass)返回this。contains(aClass);}DOMTokenList.prototype.replace=函数(旧类,新类){this.contains(oldClass)&&this.remove(oldClass)&&this.add(newClass)}Object.defineProperty(Element.prototype,'classList'{获取:函数(){返回新的DOMTokenList(this.className,this);},可枚举:false})}
最短的
image1.parentNode.className+=' box';
image1.parentNode.className+=“box”;.box{width:100px;height:100px,background:red;}<div class=“someclass”><img。。。id=“images1”name=“image1”/></div>
document.getElementById('some_id').className+=' someclassname'
OR:
document.getElementById('some_id').classList.add('someclassname')
当第二种方法不起作用时,第一种方法有助于添加类。在第一种方法中,不要忘记在“someclassname”前面留一个空格。
对于删除,您可以使用:
document.getElementById('some_id').classList.remove('someclassname')
在我的例子中,我在DOM中有多个称为主包装器的类,但我只想影响父主包装器。使用:第一选择器(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');
} );
我还对DOM中特定div的第二个孩子做了同样的事情,正如您在代码中看到的那样,我使用了$('#deals index>div:eq(0)>div:eq(1)').addClass('doubleheadrredesign');。
注意:如您所见,我使用了jQuery。
使用JavaScript添加类的两种不同方法
JavaScript提供了两种向HTML元素添加类的不同方式:
使用element.classList.add()方法使用className属性
使用这两种方法,您可以同时添加一个或多个类。
1.使用element.classList.add()方法
var element=document.querySelector('.box');//使用加法//添加单个类element.classList.add('color');//添加多个类element.classList.add('订单','阴影');.box格式{宽度:200px;高度:100px;}.颜色{背景:天蓝;}.边框{边框:2px实心黑色;}.阴影{盒子阴影:5px 5px 5px灰色;}<div class=“box”>我的盒子</div>
2.使用element.className属性
注意:始终使用+=运算符,并在类名前添加一个空格,以使用classList方法添加类。
var element=document.querySelector('.box');//使用className属性//添加单个类element.className+=“颜色”;//添加多个类element.className+='边框阴影';.box格式{宽度:200px;高度:100px;}.颜色{背景:天蓝;}.边框{边框:2px实心黑色;}.阴影{盒子阴影:5px 5px 5px灰色;}<div class=“box”>我的盒子</div>
这可能对WordPress开发人员等有帮助。
document.querySelector('[data-section="section-hb-button-1"] .ast-custom-button').classList.add('TryMyClass');
大多数人在getElementById上使用.classList.add,但我想在getElementByClassName上使用它。为此,我使用了如下的forEach:
document.getElementsByClassName(“类名”).forEach(element=>element.classList.add(“new class”));
但它不起作用,因为我发现getElementsByClassName返回的是HTML集合,而不是数组。为了处理这个问题,我使用以下代码将其转换为数组:
[…document.getElementsByClassName(“类名”)].forEach(element=>element.classList.add(“new class”));