如何向给定元素添加类?

Bla*_*man 1109 javascript dom-manipulation

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

<div class="someclass">
    <img ... id="image1" name="image1" />
</div>
Run Code Online (Sandbox Code Playgroud)

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

我怎样才能做到这一点?

Ish*_*ael 1798

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

<div id="div1" class="someclass">
    <img ... id="image1" name="image1" />
</div>
Run Code Online (Sandbox Code Playgroud)

然后

var d = document.getElementById("div1");
d.className += " otherclass";
Run Code Online (Sandbox Code Playgroud)

另请参见MDN上的element.className.

  • "除了学习JavaScript之外,"图书馆也将帮助其他一切" (154认同)
  • 如果需要使用JavaScript完成整个页面上的唯一工作是添加此类名称,那么是.但我不认为这是该页面唯一的动态部分.图书馆也将帮助其他一切.在30-50kb jQuery几乎不值得讨论. (23认同)
  • 将一个类添加到DOM元素与学习该语言有什么关系?document.getElementById('div1').className与库相关的问题一样多,使用jQuery也是如此.问题是"我怎么能这样做",经过彻底测试的图书馆是明智的答案. (18认同)
  • @thenduks:我相信你知道JavaScript!== jQuery.这个问题的答案包括库和非库解决方案是一件好事,因为知道*如何*工作不仅仅是完成它们的最简单方法也很重要.你会注意到这个问题被标记为javascript (4认同)
  • @meouw:我同意你的看法.然而,jQuery是用JavaScript编写的,所以我坚持要求OP提到一个库是一个好主意并不是"推动一个框架下来[他的]喉咙".就这样. (2认同)
  • @QadirHussain:您必须手动解析字符串,然后将其分配给className. (2认同)

Yur*_*uri 1324

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

var element = document.getElementById("div1");
element.classList.add("otherclass");
Run Code Online (Sandbox Code Playgroud)

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

element.classList.remove("otherclass");
Run Code Online (Sandbox Code Playgroud)

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

  • 令人遗憾的是,在IE 10.0之前不支持这一点,因为它是一个出色的功能,也是我经常遇到的问题的最简单的解决方案. (67认同)
  • 可以使用classList的polyfill. (12认同)
  • MDN上的[element.classList docs](https://developer.mozilla.org/en-US/docs/Web/API/Element.classList). (10认同)
  • 这个似乎是最好用的,因为有空间的人至少感觉像黑客 - 没有添加类... (10认同)
  • @SilverRingvee太空方法的另一个风险是,其他一些开发人员可能不知道它至关重要,并将其删除以便清理. (5认同)

ann*_*ata 173

找到你想要的目标元素"d"然后:

d.className += ' additionalClass'; //note the space
Run Code Online (Sandbox Code Playgroud)

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

  • @DeathGrip只需将类设置回单个定义的名称d.className ='originalClass'; (3认同)

dav*_*rey 129

添加课程

  • 交叉兼容

    在以下示例中,我们classname<body>元素添加了一个.这是IE-8兼容的.

    var a = document.body;
    a.classList ? a.classList.add('classname') : a.className += ' classname';
    
    Run Code Online (Sandbox Code Playgroud)

    这是以下的简写..

    var a = document.body;
    if (a.classList) {
        a.classList.add('wait');
    } else {
        a.className += ' wait';
    }
    
    Run Code Online (Sandbox Code Playgroud)

  • 性能

    如果您更关心性能而不是交叉兼容性,则可以将其缩短到以下速度,速度提高4%.

    var z = document.body;
    document.body.classList.add('wait');
    
    Run Code Online (Sandbox Code Playgroud)



删除课程



参考

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

使用Prototype

Element("document.body").ClassNames.add("classname")
Element("document.body").ClassNames.remove("classname")
Element("document.body").ClassNames.set("classname")
Run Code Online (Sandbox Code Playgroud)

使用YUI

YAHOO.util.Dom.hasClass(document.body,"classname")
YAHOO.util.Dom.addClass(document.body,"classname")
YAHOO.util.Dom.removeClass(document.body,"classname")
Run Code Online (Sandbox Code Playgroud)

  • @Adam他使用`classList`除了删除类之外的一切,这就是为什么我要问它. (6认同)
  • 还有'classList.remove()`.你为什么不用它?它比jQuery http://jsperf.com/remove-class-vanilla-vs-jquery快得多 (5认同)

Sat*_*pta 47

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

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

  1. 使用element.classList.add()方法
  2. 使用className财产

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

一、使用element.classList.add()方法

var element = document.querySelector('.box');
// using add method
// adding single class
element.classList.add('color');

// adding multiple class
element.classList.add('border', 'shadow');
Run Code Online (Sandbox Code Playgroud)
.box {
    width: 200px;
    height: 100px;
}
.color {
    background: skyblue;
}
.border {
    border: 2px solid black;
}
.shadow {
    box-shadow: 5px 5px 5px gray;
}
Run Code Online (Sandbox Code Playgroud)
<div class="box">My Box</div>
Run Code Online (Sandbox Code Playgroud)

2. 使用element.className财产

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

var element = document.querySelector('.box');
// using className Property
// adding single class
element.className += ' color';

// adding multiple class
// keep classes space separated
element.className += ' border shadow';
Run Code Online (Sandbox Code Playgroud)
.box {
    width: 200px;
    height: 100px;
}
.color {
    background: skyblue;
}
.border {
    border: 2px solid black;
}
.shadow {
    box-shadow: 5px 5px 5px gray;
}
Run Code Online (Sandbox Code Playgroud)
<div class="box">My Box</div>
Run Code Online (Sandbox Code Playgroud)


Sho*_*ate 33

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

添加课程:

document.getElementById("div1").classList.add("classToBeAdded");
Run Code Online (Sandbox Code Playgroud)

删除课程:

document.getElementById("div1").classList.remove("classToBeRemoved");
Run Code Online (Sandbox Code Playgroud)

  • 其他用户已多次回答这个问题,包括浏览器支持和填充程序的讨论. (4认同)
  • @ShoaibChikate:如果你愿意,你也可以删除答案(你会保留积分).试着减少这个问题的混乱; 完全取决于你. (3认同)

meo*_*ouw 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;
}
Run Code Online (Sandbox Code Playgroud)

  • `if(cn.indexOf(classname)!= -1){return; }请注意,如果添加类"btn-info"的类"btn"已经在这里,则会失败. (15认同)
  • 你应该使用`element.className.split(" ");`来防止@AlexandreDieulot在这里报告的问题。 (2认同)

rfu*_*duk 20

假设你做的不仅仅是添加这个类(例如,你有异步请求等等),我建议使用像PrototypejQuery这样的库.

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

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

$(document).ready( function() {
  $('#div1').addClass( 'some_other_class' );
} );
Run Code Online (Sandbox Code Playgroud)

查看jQuery API浏览器以获取其他内容.


小智 14

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

var nameElem = document.getElementById("name")
nameElem.classList.add("anyclss")
Run Code Online (Sandbox Code Playgroud)

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

nameElem.classList.remove("anyclss")
Run Code Online (Sandbox Code Playgroud)


Mo.*_*Mo. 9

要向元素添加其他类:

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

document.getElementById("MyElement").className += " MyClass";
Run Code Online (Sandbox Code Playgroud)

要更改元素的所有类:

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

document.getElementById("MyElement").className = "MyClass";
Run Code Online (Sandbox Code Playgroud)

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


小智 9

这可能对 WordPress 开发人员等有帮助。

document.querySelector('[data-section="section-hb-button-1"] .ast-custom-button').classList.add('TryMyClass');
Run Code Online (Sandbox Code Playgroud)


asd*_*dru 8

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

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
	})
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*mos 6

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

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');
Run Code Online (Sandbox Code Playgroud)


小智 6

我知道 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');
Run Code Online (Sandbox Code Playgroud)


Vla*_*vić 6

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

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

document.querySelector('.someclass').className += " red";
Run Code Online (Sandbox Code Playgroud)
.red {
  color: red;
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

请记住班级名称留一个空格。

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

document.querySelectorAll('.someclass').forEach(function(element) {
  element.className += " red";
});
Run Code Online (Sandbox Code Playgroud)
.red {
  color: red;
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)


Mis*_*sko 5

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

<div class="someClass otherClass yetAnotherClass">
      <img ... id="image1" name="image1" />
</div>
Run Code Online (Sandbox Code Playgroud)

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


Fer*_*nch 5

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

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

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


bvm*_*der 5

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

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

'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)
  }
}
Run Code Online (Sandbox Code Playgroud)


Ath*_*jit 5

document.getElementById('some_id').className+='  someclassname'
Run Code Online (Sandbox Code Playgroud)

或者:

document.getElementById('some_id').classList.add('someclassname')
Run Code Online (Sandbox Code Playgroud)

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

对于删除,您可以使用:

document.getElementById('some_id').classList.remove('someclassname')
Run Code Online (Sandbox Code Playgroud)