window.onload = function () {
var classStr = document.documentElement.getAttribute("class");
var classArr = classStr.split(' ');
if (classArr.indexOf('no-js')) {
console.log('exists');
}
}
以上确实错了,不会判断如no-js-abc的class。
更新如下:
window.onload = function () {
var classStr = document.documentElement.getAttribute("class");
var classArr = classStr.split(' ');
console.log(classArr.some(function (element) { return element == 'no-js' }));
}
说一下这个问题两个比较容易出错的点:
.no-js
和.no-js-indeed
这样的类\t
等。简单封装了一下,全浏览器兼容。所以ES5方法Array.prototype.indexOf在fallback里面就要绕过了。
jQuery
下可以这样:$("html").hasClass('no-js');
JS
下可以这样搞:参考:http://stackoverflow.com/questions/5898656/test-if-an-element-contains-a-class
提供一个正则的答案
测试:
先说,如果你用 jQuery,那很简单
如果你不用 jQuery,但是只考虑支持 HTML5 classList API 的浏览器,也很简单
如果还要兼容其它浏览器,那就不那么简单了,不妨看看 jQuery 的源码是怎么实现的
hasClass
,然后参照 jQuery 的代码,简化一下,自己实现个
当然,这个
hasClass
没考虑className
参数包含多个 class 的情况,不过这种情况 classList API 也是直接抛的 Error,所以先不管了,将就用着吧。以上确实错了,不会判断如no-js-abc的class。
更新如下:
修正了之前的bug,使用正则匹配
原理:ele.className获取到的字符串是用空格分开的多个class,例如'class1 class2 class3'
reg 构造的是要判断的类名并在前面加了个空白符,它能匹配' targetClass'这样的结构
最后用于test方法的是在前面加了空白的ele.className。
例子将变为reg.test(' class1 class2 class3')
拆分class,循环判断。