【问题标题】:How can I check in JavaScript if a DOM element contains a class?如果 DOM 元素包含类,我如何签入 JavaScript?
【发布时间】:2011-05-14 12:58:07
【问题描述】:

如果 DOM 元素包含类,我如何检查 JavaScript?

我尝试了以下代码,但由于某种原因它不起作用...

if (document.getElementById('element').class == "class_one") {
    //code...
}

【问题讨论】:

标签: javascript dom


【解决方案1】:

.className property,像这样:

if (document.getElementById('element').className == "class_one") {
    //code...
}

【讨论】:

  • @tereško - 这个答案有什么不正确的地方?请记住所提出的问题。
  • 它假设标签只有一个类(并且,如果你想更新它 - 与classList无关)。
  • @tereško - 问题是“如何检查 DOM 元素的类?”,而不是“如何检查 DOM 元素是否有类?”......这个问题在别处.
  • @tereško - classList 直到 IE10 才起作用,对于大多数人来说,这并不是一个真正可行的选择。见这里:caniuse.com/classlist
  • 嗯,className 始终 是一个字符串,所以它不会真正产生影响。除非你当然是 jslint。 ;)
【解决方案2】:

要获取类属性的全部值,请使用.className

From MDC:

className 获取并设置指定元素的类属性值。

自 2013 年以来,您得到了额外的帮助。

很多年前,当这个问题第一次被回答时,.className 是纯 JavaScript 中唯一的真正解决方案。自2013年起,all browsers support.classList接口。

JavaScript:

if(document.getElementById('element').classList.contains("class_one")) {
    //code...
}

您还可以使用classList 做有趣的事情,例如.toggle().add().remove()

MDN documentation.

向后兼容的代码:

if(document.getElementById('element').className.split(" ").indexOf("class_one") >= 0) {
    //code...
}

【讨论】:

  • 现在是 2016 年,我可以使用 classList,太棒了:)
  • 欢迎来到未来,@alwe
【解决方案3】:

您需要的属性是className,而不是class。此外,一个元素可以有很多类,所以如果你想测试它是否有一个特定的类,你需要执行以下操作:

function hasClass(el, clss) {
    return el.className && new RegExp("(^|\\s)" +
           clss + "(\\s|$)").test(el.className);
}

var element = document.getElementById('element');
if ( hasClass(element, "class_one") ) {
    // Do stuff here
}

更新

现代浏览器(除了 IE classList 属性,如 @Dropped.on.Caprica 的回答中所述。因此,在可用的情况下使用它是有意义的。下面是一些示例代码,用于检测浏览器是否支持 classList,否则将退回到基于正则表达式的代码:

var hasClass = (typeof document.documentElement.classList == "undefined") ?
    function(el, clss) {
        return el.className && new RegExp("(^|\\s)" +
               clss + "(\\s|$)").test(el.className);
    } :
    function(el, clss) {
        return el.classList.contains(clss);
    };

【讨论】:

  • +1,正要发布类似的内容。只有一件事,我猜你必须在你的if (hasClass(...)) 示例中传递一个类名("class_one" 是 OP 要检查的)。
【解决方案4】:

比所有这些更好的解决方案(如果您使用的是 HTML5)是使用 classList API。

var element = document.getElementById('some-element');

if (element.classList.contains('class-you-want-to-check')) {
  console.log('element has target class')
} else {
  element.classList.add('class-you-want-to-check');
  element.classList.remove('class-you-want-to-check');
  element.classList.toggle('class-you-want-to-check');

  if (element.classList.contains('class-you-want-to-check')) {
    console.log('Yep, classList is baller')
  }
}

【讨论】:

【解决方案5】:

在元素上切换类

var el = document.getElementById('element');
el.classList[['add','remove'][+el.classList.contains('class_one')]]('class_one');

el.classList.toggle('class_one');

【讨论】:

    【解决方案6】:

    如果您使用的是 jQuery,那么这个简单的代码将会有所帮助:

    if ($('.yourclass').length) {
      // do something
    } 
    

    如果您想在页面中查看超过 2 个类,请使用 $('.yourclass').length > 2

    【讨论】:

      【解决方案7】:

      所有现代浏览器都支持Element.classListcontains 方法:

      testElement.classList.contains(className)
      

      演示

      var testElement = document.getElementById('test');
      
      document.body.innerHTML = '<pre>' + JSON.stringify({
          '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')
      }, null, 2) + '</pre>';
      &lt;div id="test" class="main main-content content"&gt;&lt;/div&gt;

      支持的浏览器

      (来自CanIUse.com


      Polyfill

      如果您想使用Element.classList,并且还想支持IE8等古老的浏览器,请考虑使用this polyfill by Eli Grey

      【讨论】:

        【解决方案8】:

        有类:

        function hasClass(element, className) {
          return (element.className).indexOf(className) > -1;
        }
        

        包含类:

        function containsClass(element, className) {
          return Array.from(element.classList).filter(function (cls) {
            return cls.indexOf(className) > -1;
          }).length > 0;
        }
        

        codepen demo

        【讨论】:

        • 注意 hasClass:如果一个元素有“show-initial”类并且你测试了“show”类,即使元素没有类,你也会得到 true。
        猜你喜欢
        • 2021-04-01
        • 2011-12-28
        • 1970-01-01
        • 2021-12-20
        • 1970-01-01
        • 2011-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多