例如:
<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 属性返回以数字值返回指定节点的节点类型。常用的一般有三种:
- 如果节点是元素节点(Element),则 nodeType 属性将返回 1。
- 如果节点是属性节点(Attr),则 nodeType 属性将返回 2。
- 如果节点是文本节点(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
说明下:
- 字符串的indexOf方法是无法区分
.no-js
和.no-js-indeed
这样的类; - 类名的分隔符可能不是空格,还有可能是
\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