普通JavaScript的“ hasClass”函数是什么?


313

jQuery如何hasClass使用普通的JavaScript?例如,

<body class="foo thatClass bar">

什么是JavaScript的方式来询问是否<body>thatClass


我想您将不得不解析该class属性(在多个类的情况下,将以随机顺序将多个类名用空格隔开),并检查您的类名是否在其中。并不是很困难,但是如果不是出于学习目的,还是很不方便:)
Pekka

7
不知道我参加聚会是否迟到,但是可以替代jQuery函数的好网站是youmightnotneedjquery.com
ithil

Answers:


116

您可以检查是否element.className匹配/\bthatClass\b/
\b匹配一个单词中断。

或者,您可以使用jQuery自己的实现:

var className = " " + selector + " ";
if ( (" " + element.className + " ").replace(/[\n\t]/g, " ").indexOf(" thatClass ") > -1 ) 

为了回答您的一般性问题,您可以在github上查看jQuery的源代码,也可以hasClass在此源代码查看器中查看源代码


6
+1为jQuery实现(因为查找(这是正确的英语吗?)的意思rclass是什么;)
Felix Kling

6
不会\b匹配“ thatClass-anotherClass”吗?
马修·克鲁姆利

3
仅出于完整性考虑:最新版本中的rclass是“ / [\ n \ t \ r] / g”(已添加\ r)
Felix Schwarz 2013年

4
@FelixSchwarz是正确的,在当前的jQuery中,正则表达式已更新为/[\t\r\n\f]/g。同样值得一提的是/\bclass\b/,带有-负号的类名可能会失败(除了效果很好),这就是jQuery的实现更好,更可靠的原因。例如:/\bbig\b/.test('big-text')返回true而不是预期的false。
斯塔诺

994

只需使用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');

浏览器支持:

  • Chrome 8.0
  • Firefox 3.6
  • IE 10
  • 歌剧11.50
  • Safari 5.1

classList 浏览器支持


5
IE8不支持此功能。IE8可以检索.classList为字符串,但无法识别更现代的方法,例如.classList.contains()
iono 2013年

7
@iono在MDN 的Element.classList实现描述中,有一个垫片将对这种行为的支持扩展到IE8 developer.mozilla.org/en-US/docs/Web/API/Element/classList
James

3
我同意@AlexanderWigmore,这非常有用而且非常简单。
雅克·奥利维尔

投票给它。这是查询类的一种更
简洁的

@SLaks,应该已经更新为已接受的答案。
UmurKaragöz

35

最有效的一种衬垫

  • 返回一个布尔值(与Orbling的答案相对)
  • 在搜寻thisClass具有的元素时,不会传回假阳性class="thisClass-suffix"
  • 与每个浏览器兼容,最低至IE6

function hasClass( target, className ) {
    return new RegExp('(\\s|^)' + className + '(\\s|$)').test(target.className);
}

28

存储使用中的类的属性是className

所以你可以说:

if (document.body.className.match(/\bmyclass\b/)) {
    ....
}

如果您想要一个可以显示jQuery如何完成所有工作的位置,我建议:

http://code.jquery.com/jquery-1.5.js


1
优秀的。该match属性再次派上用场!真的jQuery所做的比JavaScript还要多吗?如果不是这样,jQuery只是不必要的简写形式。
animaacija 2015年

1
这也与匹配myclass-something\b与连字符匹配。
马克·杜丁

1
@animaacija所有javascript库/插件基本上都是javascript的简写,因为它们是使用javascript构建的。事实是:速记总是必要的。永远不要重新发明轮子。
Edwin Stoteler '16

这是一个很好的解决方案!
曼努埃尔·阿巴斯卡尔

28

// 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>


4
@greg_diesel:不要劝阻答案!对于常见问题的新解决方案非常受欢迎。
raveren 2015年

2
@Raveren虽然欢迎对旧问题的新解决方案,但这个特殊的答案并没有带来新的东西。这只会增加这个问题的噪音。
Emile Bergeron

1
@raveren这不是一个新的解决方案,它与该答案相同,但是信息较少。
基金莫妮卡的诉讼

13

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

11

我使用一种简单/最小的解决方案,一个行,跨浏览器,并且也可以与旧版浏览器一起使用:

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

有关其他类的操作,请参见此处的完整文件。


2
这次旅行会超过一班notmyClassHere吗?
2015年

2
您还可以询问您的班级是否不在那里,也请!/myClass/.test(document.body.className)注意该!符号。
2015年

1
我不是在谈论否定问题。我认为如果类名是,您的函数将错误地返回true thisIsmyClassHere
Teepeemm

1
我只是在猜测这就是您要的内容,无法确切了解您的需求,但是您是否尝试过它,但按原样应该返回true / false失败了?
thednp

2
这不是完美的,因为它不是子字符串证明。例如,当document.body.className ='myClass123'时,/ myClass / .test(document.body.className)返回true ...
Zbigniew Wiadro

9

一个很好的解决方案是使用classList和contains。

我这样做是这样的:

... for ( var i = 0; i < container.length; i++ ) {
        if ( container[i].classList.contains('half_width') ) { ...

因此,您需要您的元素并检查类列表。如果其中一个类别与您搜索的类别相同,否则将返回true,否则将返回false!


6

使用类似:

Array.prototype.indexOf.call(myHTMLSelector.classList, 'the-class');

3
这不等于myHTMLSelector.classList.indexOf('the-class')吗?您最后也不想>=0吗?
Teepeemm,2015年

5
使用[].indexOfif classListcontains什么意义?
Oriol

@Teepeemm号 myHTMLSelector.classList.indexOf('the-class')返回错误,myHTMLSelector.classList.indexOf is not a function因为myHTMLSelector.classList它不是数组。但是我猜想使用Array.prototype某种转换调用它时会发生。尽管它contains有很好的支持,但它可能支持较旧的浏览器。
Ehsan88


2

此“ 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);
}

1

那么以上所有答案都很好,但这是我提出的一个简单功能。效果很好。

function hasClass(el, cn){
    var classes = el.classList;
    for(var j = 0; j < classes.length; j++){
        if(classes[j] == cn){
            return true;
        }
    }
}

3
如果classListcontains方法,迭代的意义何在?
Oriol

1

您如何看待这种方法?

<body class="thatClass anotherClass"> </body>

var bodyClasses = document.querySelector('body').className;
var myClass = new RegExp("thatClass");
var trueOrFalse = myClass.test( bodyClasses );

https://jsfiddle.net/5sv30bhe/


2
我认为您正在混合使用变量名(active === myClass?)。但是这种方法难道不会带来误报class="nothatClassIsnt"吗?
Teepeemm,2015年

0

这是最简单的方法:

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");
         }
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.