使用纯 JavaScript(不是 jQuery),是否有任何方法可以检查元素是否包含类?
目前,我正在这样做:
var test = document.getElementById("test");
var testClass = test.className;
switch (testClass) {
case "class1":
test.innerHTML = "I have class1";
break;
case "class2":
test.innerHTML = "I have class2";
break;
case "class3":
test.innerHTML = "I have class3";
break;
case "class4":
test.innerHTML = "I have class4";
break;
default:
test.innerHTML = "";
}
<div id="test" class="class1"></div>
问题是,如果我将 HTML 更改为此...
<div id="test" class="class1 class5"></div>
... 不再存在完全匹配的内容,因此我得到的默认输出为 none( ""
)。但是我仍然希望输出为I have class1
因为<div>
仍然包含.class1
类。
使用element.classList
.contains
方法:
element.classList.contains(class);
这适用于所有当前浏览器,并且也有 polyfill 支持较旧的浏览器。
另外,如果您使用的是较旧的浏览器,并且不想使用 polyfill 对其进行修复,则使用indexOf
是正确的,但是您需要对其进行一些调整:
function hasClass(element, className) {
return (' ' + element.className + ' ').indexOf(' ' + className+ ' ') > -1;
}
否则,如果您要查找的班级是另一个班级名称的一部分,您也将获得true
jQuery 使用类似(如果不相同)的方法。
应用于示例:
由于这不能与 switch 语句一起使用,因此可以使用以下代码实现相同的效果:
var test = document.getElementById("test"),
classes = ['class1', 'class2', 'class3', 'class4'];
test.innerHTML = "";
for(var i = 0, j = classes.length; i < j; i++) {
if(hasClass(test, classes[i])) {
test.innerHTML = "I have " + classes[i];
break;
}
}
它也较少冗余;)
一种简单有效的解决方案是尝试.contains方法。
test.classList.contains(testClass);
在现代浏览器中,您可以只使用Element.classList
contains
方法:
testElement.classList.contains(className)
var testElement = document.getElementById('test');
console.log({
'main' : testElement.classList.contains('main'),
'cont' : testElement.classList.contains('cont'),
'content' : testElement.classList.contains('content'),
'main-cont' : testElement.classList.contains('main-cont'),
'main-content' : testElement.classList.contains('main-content')
});
<div id="test" class="main main-content content"></div>
(来自CanIUse.com )
如果要使用Element.classList
但也要支持较旧的浏览器,请考虑使用Eli Gray 的此 polyfill 。