jQuery如何hasClass
使用普通的JavaScript?例如,
<body class="foo thatClass bar">
什么是JavaScript的方式来询问是否<body>
有thatClass
?
jQuery如何hasClass
使用普通的JavaScript?例如,
<body class="foo thatClass bar">
什么是JavaScript的方式来询问是否<body>
有thatClass
?
Answers:
您可以检查是否element.className
匹配/\bthatClass\b/
。
\b
匹配一个单词中断。
或者,您可以使用jQuery自己的实现:
var className = " " + selector + " ";
if ( (" " + element.className + " ").replace(/[\n\t]/g, " ").indexOf(" thatClass ") > -1 )
为了回答您的一般性问题,您可以在github上查看jQuery的源代码,也可以hasClass
在此源代码查看器中查看源代码。
rclass
是什么;)
\b
匹配“ thatClass-anotherClass”吗?
/[\t\r\n\f]/g
。同样值得一提的是/\bclass\b/
,带有-
负号的类名可能会失败(除了效果很好),这就是jQuery的实现更好,更可靠的原因。例如:/\bbig\b/.test('big-text')
返回true而不是预期的false。
只需使用classList.contains()
:
if (document.body.classList.contains('thatClass')) {
// do some stuff
}
其他用途classList
:
document.body.classList.add('thisClass');
// $('body').addClass('thisClass');
document.body.classList.remove('thatClass');
// $('body').removeClass('thatClass');
document.body.classList.toggle('anotherClass');
// $('body').toggleClass('anotherClass');
浏览器支持:
.classList
为字符串,但无法识别更现代的方法,例如.classList.contains()
存储使用中的类的属性是className
。
所以你可以说:
if (document.body.className.match(/\bmyclass\b/)) {
....
}
如果您想要一个可以显示jQuery如何完成所有工作的位置,我建议:
match
属性再次派上用场!真的jQuery所做的比JavaScript还要多吗?如果不是这样,jQuery只是不必要的简写形式。
myclass-something
,\b
与连字符匹配。
// 1. Use if for see that classes:
if (document.querySelector(".section-name").classList.contains("section-filter")) {
alert("Grid section");
// code...
}
<!--2. Add a class in the .html:-->
<div class="section-name section-filter">...</div>
hasClass函数:
HTMLElement.prototype.hasClass = function(cls) {
var i;
var classes = this.className.split(" ");
for(i = 0; i < classes.length; i++) {
if(classes[i] == cls) {
return true;
}
}
return false;
};
addClass函数:
HTMLElement.prototype.addClass = function(add) {
if (!this.hasClass(add)){
this.className = (this.className + " " + add).trim();
}
};
removeClass函数:
HTMLElement.prototype.removeClass = function(remove) {
var newClassName = "";
var i;
var classes = this.className.replace(/\s{2,}/g, ' ').split(" ");
for(i = 0; i < classes.length; i++) {
if(classes[i] !== remove) {
newClassName += classes[i] + " ";
}
}
this.className = newClassName.trim();
};
我使用一种简单/最小的解决方案,一个行,跨浏览器,并且也可以与旧版浏览器一起使用:
/\bmyClass/.test(document.body.className) // notice the \b command for whole word 'myClass'
该方法非常有用,因为它不需要polyfill,如果您使用它们,classList
则性能会更好。至少对我来说。
更新:我做了一个很小的polyfill,这是我现在使用的全面解决方案:
function hasClass(element,testClass){
if ('classList' in element) { return element.classList.contains(testClass);
} else { return new Regexp(testClass).exec(element.className); } // this is better
//} else { return el.className.indexOf(testClass) != -1; } // this is faster but requires indexOf() polyfill
return false;
}
有关其他类的操作,请参见此处的完整文件。
notmyClassHere
吗?
!/myClass/.test(document.body.className)
注意该!
符号。
thisIsmyClassHere
。
使用类似:
Array.prototype.indexOf.call(myHTMLSelector.classList, 'the-class');
myHTMLSelector.classList.indexOf('the-class')
吗?您最后也不想>=0
吗?
[].indexOf
if classList
有contains
什么意义?
myHTMLSelector.classList.indexOf('the-class')
返回错误,myHTMLSelector.classList.indexOf is not a function
因为myHTMLSelector.classList
它不是数组。但是我猜想使用Array.prototype
某种转换调用它时会发生。尽管它contains
有很好的支持,但它可能支持较旧的浏览器。
if (document.body.className.split(/\s+/).indexOf("thatClass") !== -1) {
// has "thatClass"
}
此“ hasClass”功能可在IE8 +,FireFox和Chrome中使用:
hasClass = function(el, cls) {
var regexp = new RegExp('(\\s|^)' + cls + '(\\s|$)'),
target = (typeof el.className === 'undefined') ? window.event.srcElement : el;
return target.className.match(regexp);
}
您如何看待这种方法?
<body class="thatClass anotherClass"> </body>
var bodyClasses = document.querySelector('body').className;
var myClass = new RegExp("thatClass");
var trueOrFalse = myClass.test( bodyClasses );
class="nothatClassIsnt"
吗?
这是最简单的方法:
var allElements = document.querySelectorAll('*');
for (var i = 0; i < allElements.length; i++) {
if (allElements[i].hasAttribute("class")) {
//console.log(allElements[i].className);
if (allElements[i].className.includes("_the _class ")) {
console.log("I see the class");
}
}
}
class
属性(在多个类的情况下,将以随机顺序将多个类名用空格隔开),并检查您的类名是否在其中。并不是很困难,但是如果不是出于学习目的,还是很不方便:)