1.classlist属性
要操作类名,可以通过 className 属性实现添加、删除和替换。但 className 是一个字符串, 所以每次操作之后都需要重新设置这个值才能生效,即使只改动了部分字符串也一样。<br />以下面的 HTML 代码为例:
<div class="bd user disabled">...</div>
这个
元素有 3 个类名。要想删除其中一个,就得先把 className 拆开,删除不想要的那个, 再把包含剩余类的字符串设置回去。
比如:
                    比如:
// 要删除"user"类let targetClass = "user";// 把类名拆成数组let classNames = div.className.split(/\s+/);// 找到要删除类名的索引let idx = classNames.indexOf(targetClass);// 如果有则删除if (idx > -1) {classNames.splice(i,1);}// 重新设置类名div.className = classNames.join(" ");
- 这就是从元素的类名中删除”user”类要写的代码。
 - 替换类名和检测类名也要涉及同样的算 法。
 - 添加类名只涉及字符串拼接,但必须先检查一下以确保不会重复添加相同的类名。
 - 很多 JavaScript 库为这些操作实现了便利方法。
 
HTML5 通过给所有元素增加 classList 属性为这些操作提供了更简单也更安全的实现方式。
- classList 是一个新的集合类型 DOMTokenList 的实例。
 - 与其他 DOM 集合类型一样,DOMTokenList 也有 length 属性表示自己包含多少项,也可以通过 item()或中括号取得个别的元素。
 - 此外, DOMTokenList 还增加了以下方法。
- add(value) 向类名列表中添加指定的字符串值value。如果这个值已经存在则什么也不做 - contains(value) 返回布尔值,表示给定的value是否存在 - remove(value) 从类名列表中删除指定的字符串值value - toggle(value) 如果类名列表中已存在指定的value,则删除;如果不存在,则添加 
如此上面的代码就能简化为一行代码:
div.classList.remove("user");
这行代码可以在不影响其他类名的情况下完成删除。其他方法同样极大地简化了操作类名的复杂 性,
如下面的例子所示:
// 删除"disabled"类
div.classList.remove("disabled"); 
// 添加"current"类
div.classList.add("current");
// 切换"user"类
div.classList.toggle("user"); 
// 检测类名 
if (div.classList.contains("bd") && !div.classList.contains("disabled")){ 
 // 执行操作
) 
// 迭代类名
for (let class of div.classList){ 
 doStuff(class); 
}
- 添加了 classList 属性之后,除非是完全删除或完全重写元素的 class 属性,否则 className 属性就用不到了。
 - IE10 及以上版本(部分)和其他主流浏览器(完全)实现了 classList 属性。
 
