如何向给定元素添加类?

时间:2009-02-03 13:54:00

标签: javascript dom-manipulation

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

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

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

我该怎么做?

25 个答案:

答案 0 :(得分:1750)

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

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

然后

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

另见element.className on MDN

答案 1 :(得分:1205)

没有任何框架的最简单方法是使用element.classList.add方法。

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

修改 如果你想从一个元素中删除类 -

element.classList.remove("otherclass");

我更喜欢不必添加任何空白空间和自己重复的条目处理(使用document.className方法时需要)。有一些browser limitations,但您可以使用polyfills解决这些问题。

答案 2 :(得分:173)

按照您的意愿找到您的目标元素“d”,然后:

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

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

答案 3 :(得分:124)

添加班级

  • 交叉兼容

    在以下示例中,我们向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 Test Case: Adding a Class
  2. jsPerf Test Case: Removing a Class

  3. 使用Prototype

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

答案 4 :(得分:32)

使用纯JavaScript

将类添加到元素的另一种方法

添加课程:

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

删除课程:

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

答案 5 :(得分:21)

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

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;
}

答案 6 :(得分:18)

假设你做的不仅仅是添加这一个类(例如,你有异步请求等等),我建议使用像Prototype或{{3}这样的库}。

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

所以,假设你现在已经在你的页面上有了jQuery,你可以使用这样的代码为一个元素添加一个类名(在这种情况下加载时):

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

查看jQuery了解其他内容。

答案 7 :(得分:13)

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

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

上面的代码将为nameElem添加(而不是替换)类“anyclass”。 类似地,您可以使用classList.remove()方法删除类。

nameElem.classList.remove("anyclss")

答案 8 :(得分:9)

要向元素添加其他类:

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

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

要更改元素的所有类:

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

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

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

答案 9 :(得分:5)

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

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

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

答案 10 :(得分:4)

我知道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');

答案 11 :(得分:4)

document.getElementById('some_id').className+='  someclassname'

OR:

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

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

要删除,您可以使用:

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

答案 12 :(得分:3)

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

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

答案 13 :(得分:3)

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

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

从那里你可以很容易地得到添加新类所需的javascript ...只需将一个空格后跟新类附加到元素的className属性。知道了这一点,你也可以编写一个函数,以便在需要时删除一个类。

答案 14 :(得分:3)

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

&#13;
&#13;
if(Element.prototype.classList === void 0){
	function DOMTokenList(classes, self){
		typeof classes == "string" && (classes = classes.split(' '))
		while(this.length){
			Array.prototype.pop.apply(this);
		}
		Array.prototype.push.apply(this, classes);
		this.__self__ = this.__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
	})
}
&#13;
&#13;
&#13;

答案 15 :(得分:2)

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

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

&#13;
&#13;
'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)
  }
}
&#13;
&#13;
&#13;

答案 16 :(得分:2)

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

如果你只需要改变一个元素,首先是JS将在DOM中找到的元素,你可以使用它:

document.querySelector('.someclass').className += " red";
.red {
  color: red;
}
<div class="someclass">
  <p>This method will add class "red" only to first element in DOM</p>
</div>

<div class="someclass">
  <p>lorem ipsum</p>
</div>

<div class="someclass">
  <p>lorem ipsum</p>
</div>

<div class="someclass">
  <p>lorem ipsum</p>
</div>

请注意在类名之前留一个空格

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

document.querySelectorAll('.someclass').forEach(function(element) {
  element.className += " red";
});
.red {
  color: red;
}
<div class="someclass">
  <p>This method will add class "red" to all elements in DOM that have "someclass" class.</p>
</div>

<div class="someclass">
  <p>lorem ipsum</p>
</div>

<div class="someclass">
  <p>lorem ipsum</p>
</div>

<div class="someclass">
  <p>lorem ipsum</p>
</div>

答案 17 :(得分:2)

最短

image1.parentNode.className+=' box';

image1.parentNode.className+=' box';
.box { width: 100px; height:100px; background: red; }
<div class="someclass">
    <img ... id="image1" name="image1" />
</div>

答案 18 :(得分:1)

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

答案 19 :(得分:0)

对于那些使用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()

答案 20 :(得分:0)

就我而言,我在DOM中有一个以上的类,名为main-wrapper,但我只想影响父级main-wrapper。使用:first Selectorhttps://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

答案 21 :(得分:-1)

首先,给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>

答案 22 :(得分:-1)

您可以使用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');

答案 23 :(得分:-5)

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

希望这对sombody有帮助

答案 24 :(得分:-11)

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

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

HTH