木灵鱼儿
阅读:2494
原生js获取、添加、删除元素class
className方式
我自己之前学es5的时候,老师教我们是用的是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删除后,你会发现会有多余的空格,因为我们没有对这个空格做处理,添加时插入的空格成了残余,久而久之就会非常长,为此,我们不得不写一套解决这个空格问题的逻辑判断,非常要命,那会,我就不太喜欢使用js来修改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
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");
推荐使用该属性,不用再写一段判断空格的js了,省了多少事。
如果想让不支持该属性的地方使用该方法,可以使用下面的兼容代码,兼容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;
}
};
}
});
}
版权申明
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿 - 有梦就能远航站点。未经许可,禁止转载。
相关推荐
Promise失败重试,可指定重试次数
//模拟异步请求 function axiosFn() { return new Promise((resolve, reject) => { const flge = Math.random(); //随机值 setTimeout(() => { //大于0.7就是成功 if (flge > 0.7) { return resolve(flge); } else { return reject(...
animation 动画的三个事件
const div = document.querySelector("div.box"); div.addEventListener("animationstart", function() { //动画开始运行触发 }); div.addEventListener("animationiteration", function() { //动画每执行一次触发一次,适用用多次动画 }); div.addEventListener("animationend", function() { //...
手写Promise
/* * @Author: mulingyuer * @Date: 2021-12-30 22:06:58 * @LastEditTime: 2022-01-03 05:22:30 * @LastEditors: mulingyuer * @Description: 手写promise * @FilePath: \undefinedc:\Users\13219\Desktop\promise.js * 怎么可能会有bug!!! */ /** * @description: 自定义promise * @param {fucntion} executor 执行器函数(同...
class 与 await结合
class As { constructor() {} then(resolve, reject) { setTimeout(() => { resolve(true); }, 3000) } } (async () => { const b = await new As(); console.log(b); })()
深度合并对象的方法
找了很久,现有的库有两个:1. Mergenpm地址: Merge用法:import merge from 'merge'; const obj1 = { name: 2}; const obj2 = { value: 1 }; //合并 merge(obj1,obj2); console.log(obj1); //{name:2,value:1} //克隆合并-与目标对象无关联 const obj3 = merge(true,obj1,obj2); console.log(obj3); //{name:2,value:1} console.log(obj3 === obj1)...
利用JSON过滤对象和数组中指定的key属性
有时候我们在vue中进行for循环,就会涉及到绑定唯一值key的问题,但是并不是任何时候都会存在所谓的唯一值,使用index下标明显是不合适的,官方也不推荐,除非你for循环出来的列表不用变化。所以一般常用的做法就是给for循环的对象添加一个属性,属性的值是随机的uuid或者时间戳。这样前端问题解决了,如果遍历的数据还需要提交到后端,那么不就多了一个属性,这个属性后端不需要的。所以,我们需要在提交数据前,对数据进行过滤。过滤又得for循环删除?那怎么行,有没有那种通用的,简单的方法。过滤方法/** * @description: 过滤对象中指定的属性,也可以拿来浅拷贝 * @para...
Copy 一个复制操作的类
前言js有一个31k多的star的开源复制库:clipboard.js;但是一些简单复制并不想安装一个库来解决,所以就想自己写一个。copy所需要的东西Selection 对象用于获取被用户选中的部分,通过toString()方法可以获取被选中的文本内容,以及js操作选中。MDN文档:SelectionexecCommand 对象用于以命令的形式来操作网页的内容,说白了就是用它来实现复制文本操作,复制的是选中的文本MDN文档:execCommand 需要注意的是,execCommand在未来将会被遗弃,因为这个api本身是从ie浏览器那边继承的,久而久之各大浏览器都对其做了兼容,虽然...
对象扁平化
前言后端返回给前端的数据,有时候会是一个多层级对象,但是我们前端使用的时候,for循环遍历渲染时,多层级对象往往需要进行单独处理,因为还需要判断这个key值是否存在,否则会报错。强行让后端改变数据结构又好像不现实,无奈,只有自己处理了。掘金看到一位大佬文章《【算法】JS 实现对象的扁平化》感觉很合适,逻辑清晰。要求将对象中的层级扁平化,改成如下格式:// 实现一个 flatten 函数,实现如下的转换功能 const obj = { a: 1, b: [1, 2, { c: true }], c: { e: 2, f: 3 }, g: null, }; // 转换为 l...