首页 > 技术文章 > 如何用JavaScript判断dom是否有存在某class的值?

moqiutao 2017-02-13 08:57 原文

例如:

<html class="no-js">
<head>
</head>
<body>
</body>
</html>

判断html节点的class是否有no-js。

1.jquery的实现方式

$("html").hasClass('no-js');

jquery源码的实现方式:

var rclass = /[\t\r\n\f]/g;

jQuery.fn.extend({
    hasClass: function(selector) {
        var className = " " + selector + " ",
            i = 0,
            l = this.length;
        for (; i < l; i++) {
            if (this[i].nodeType === 1 &&
                (" " + this[i].className + " ").replace(rclass, " ").indexOf(className) > -1) {
                return true;
            }
        }

        return false;
    }
})

源码里面用到了nodeType,nodeType是HTML DOM 的nodeType 属性,nodeType 属性返回以数字值返回指定节点的节点类型。常用的一般有三种:

  1. 如果节点是元素节点(Element),则 nodeType 属性将返回 1。
  2. 如果节点是属性节点(Attr),则 nodeType 属性将返回 2。
  3. 如果节点是文本节点(Text),则nodeType 属性将返回 3。

例如,获得 body 元素的节点类型:

document.body.nodeType;//1

如果想了解更多的节点类型,可查看:HTML DOM nodeType 属性

2.js的实现方式

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

hasClass(document.querySelector("html"), 'no-js');

想详细了解DOM选择器querySelector,可点击原生JS强大DOM选择器querySelector与querySelectorAll》。

3.H5的classList

说明下:

  1. 字符串的indexOf方法是无法区分.no-js.no-js-indeed这样的类;
  2. 类名的分隔符可能不是空格,还有可能是\t等。

代码:

var hasClass = (function(){
    var div = document.createElement("div") ;
    if( "classList" in div && typeof div.classList.contains === "function" ) {
        return function(elem, className){
            return elem.classList.contains(className) ;
        } ;
    } else {
        return function(elem, className){
            var classes = elem.className.split(/\s+/) ;
            for(var i= 0 ; i < classes.length ; i ++) {
                if( classes[i] === className ) {
                    return true ;
                }
            }
            return false ;
        } ;
    }
})() ;

alert( hasClass(document.documentElement, "no-js") ) ;

问题地址:https://segmentfault.com/q/1010000002501794

推荐阅读