前言
在MVV*框架一统天下的数据驱动前端开发模式下,直接使用JavaScript操作DOM的机会少之又少。
但是在一些特殊应用场景下,还是会存在需要直接操作DOM,获取、添加、删除一些属性的情况。
本文就聊聊如何使用JavaScript,对DOM对class属性进行对操作。
三种方式
className
className属性,他是dom的一个属性,返回元素的class值,兼容性可以说是通杀吧,所有浏览器都是支持的,但是,他是一个string操作。
document.getElementById('myid').className;
它会返回一个string的值(空的话返回empty string,empty string===“”,length为0),而class的设置,他是需要空格的:class="class1 class2",当我们添加一个新的class时就不得不考虑空格的问题:
document.getElementById('myid').className += " class2";
这个空格我们甚至还需要判断,这个元素有没有class,没有class的话,开头就不需要空格,删除的时候,也只能用replace方法:
let $myid = document.getElementById('myid');
$myid.className = $myid.className.replace("class2","");
当class删除后,你会发现会有多余的空格,因为我们没有对这个空格做处理,添加时插入的空格成了残余,久而久之就会非常长,为此,我们不得不写一套解决这个空格问题的逻辑判断。
getAttribute
getAttribute的兼容性也是全兼容,获取元素的行内属性。
var classVal = document.getElementById("id").getAttribute("class");
//删除的话
classVal = classVal.replace("someClassName",""); document.getElementById("id").setAttribute("class",classVal );
//添加的话
classVal = classVal.concat(" someClassName"); document.getElementById("id").setAttribute("class",classVal );
//替换的话
classVal = classVal.replace("someClassName","otherClassName"); document.getElementById("id").setAttribute("class",classVal );
可以看到getAttribute也是string操作,不可避免的,会有空格问题。
classList
Element.classList 是一个只读属性,返回一个元素的类属性的实时 DOMTokenList 集合。
相比将element.className 作为以空格分隔的字符串来使用,classList 是一种更方便的访问元素的类列表的方法。
html5新增了classList属性,它有四个方法:
add(value)添加类名,如果有则不添加contains(value)判断是否存在类名,返回Boolean值remove(value)从列表中删除类名toggle(value)切换类名:如果列表中存在则删除,否则添加
兼容性:ie10及以上、谷歌8.0及以上、火狐3.6及以上、safari 5.1及以上、open 11.5及以上
//增加:
document.getElementById("myDIV").classList.add("mystyle", "anotherClass", "thirdClass");
//删除:
document.getElementById("myDIV").classList.remove("mystyle");
// 添加或移除多个类值
document.getElementById("myDIV").classList.add("foo", "bar", "baz");
document.getElementById("myDIV").classList.remove("foo", "bar", "baz");
// 查询目标dom是否存在 foo 类
document.getElementById("myDiv").classList.contains("foo");
// 将类值 "foo" 替换成 "bar"
document.getElementById("myDiv").classList.replace("foo", "bar");
// 如果 visible 类值已存在,则移除它,否则添加它
document.getElementById("myDiv").classList.toggle("visible");
如果想让不支持该属性的地方使用该方法,可以使用下面的兼容代码,兼容ie9及以下,在使用改方法之前先使用该兼容库。
if (!("classList" in document.documentElement)) {
Object.defineProperty(HTMLElement.prototype, 'classList', {
get: function() {
var self = this;
function update(fn) {
return function(value) {
var classes = self.className.split(/\s+/g),
index = classes.indexOf(value);
fn(classes, index, value);
self.className = classes.join(" ");
}
}
return {
add: update(function(classes, index, value) {
if (!~index) classes.push(value);
}),
remove: update(function(classes, index) {
if (~index) classes.splice(index, 1);
}),
toggle: update(function(classes, index, value) {
if (~index)
classes.splice(index, 1);
else
classes.push(value);
}),
contains: function(value) {
return !!~self.className.split(/\s+/g).indexOf(value);
},
item: function(i) {
return self.className.split(/\s+/g)[i] || null;
}
};
}
});
}