温习classList api
有道题是一个removeClass的功能,代码里是正则分隔了传入的name,根据name的个数,循环移除掉,让寻找bug。。看了了这几行代码,首先想到的是我会如何去优化。 如果看代码一两分钟就能找到公司js框架中的bug,那也太。。。
改为如何优化算是不错的面试题,
first,去掉正则表达式,使用split字符串内置方法分隔,
second,支持html5的浏览器使用classList api,
第三,类似jq,hasClass、remove、togglle都是用了字符串内置方法,indexOf、replace、字符串相加。
周末试着coding。代码如下
var className = (function() {
//设置的方法list
var fnName = 'add,remove,contains,toggle'.split(',');
var _trim = function(str) {
return str.trim ? str.trim() : str.replace(/(^\s*)|(\s*$)/g, "");
};
//不支持H5的classList,使用自定义方法实现
var cClassList = {
add: function(el, name) {
if (!this.contains(el, name)) {
el.className = _trim(el.className + ' ' + name + ' ');
}
},
remove: function(el, name) {
if (this.contains(el, name)) {
var _class = (' ' + el.className + ' ').replace(' ' + name + ' ', ' ');
el.className = _class ? _trim(_class) : '';
}
},
contains: function(el, name) {
if (el && el.nodeType == 1 && (" " + el.className + " ").indexOf(" " + name + " ") >= 0) {
return true;
}
return false;
},
toggle: function(el, name) {
if (this.contains(el, name)) {
this.remove(el, name);
} else {
this.add(el, name);
}
}
};
var _classList = {};
/*
* 如果name为多个(空格分隔),那么循环设置,反之调用classList设置
* @param {HtmlNode} type
* @param {String} name
* @returns {undefined}
*/
var _eachDo = function(type, name) {
if (typeof name === 'string' && name.length) {
name = _trim(name).split(' ');
var len = name.length;
if (len === 1) {
if (this.classList) {//使用h5的classList,非hasClass 则return undefined
return this.classList[type](name[0]);
} else {
return cClassList[type](this, name);//使用自定义设置
}
} else {
var Return = true;
for (var j = 0; j < len; j++) {
if (_eachDo.call(this, type, name[j]) == false) {
Return = false;
}
;
}
return Return;
}
}
};
//添加上 add、toggle、contains、remove方法
for (var i = 0; i < fnName.length; i++) {
(function(key) {
_classList[key] = function(el, name) {
//如果传入的className是个function,那么得到计算结果
if (typeof name === 'function') {
name = name.call(this);
}
return _eachDo.call(el, key, name);
};
})(fnName[i]);
}
//hasClass
_classList['has'] = _classList.contains;
return _classList;
})();
var div1 = document.getElementById('div1');
className.add(div1, 'asd fv');
alert(div1.className)
className.remove(div1, 'asd');
alert(div1.className)
className.toggle(div1, 'asd sd');
alert(div1.className)
className.add(div1, 'asd sd fv');
alert(div1.className)
alert(className.has(div1, 'asd fv'))
温习classList api的更多相关文章
- [Javascript] Manipulate the DOM with the classList API
Learn how to add, remove and test for CSS classes using the classList API. It's more powerful than u ...
- HTML5 classList API接口
原文地址:HTML5 classList API 原文日期: 2010年07月13日 翻译日期: 2013年08月23日 当我陷入JavaScrip和JavaScript类库框架之中时,我总是有种希望 ...
- HTML5 classList API
Having thrust myself into the world of JavaScript and JavaScript Libraries, I've often wondered: Whe ...
- 使用 classList API
一.classList API 是什么 属于 DOM API,HTML5 引入,用来操作 HTML 标签的 class 属性值. classList 属性是一个只读的类数组对象,"实时&qu ...
- [转]HTML5 classList API
Having thrust myself into the world of JavaScript and JavaScript Libraries, I've often wondered: Whe ...
- HTML5的classList API优化对样式名className的操作
//添加一个class elem.classList.add(classname); //删除一个class elem.classList.remove(classname); //判断一个class ...
- element.dataset API
不久之前我向大家展示了非常有用的classList API,它是一种HTML5里提供的原生的对页面元素的CSS类进行增.删改的接口,完全可以替代jQuery里的那些CSS类操作方法.而另外一个非常有用 ...
- H5新增属性classList
H5新增属性classList h5中新增了一个classList,原生js可以通过它来判断获取dom节点有无某个class. classList是html元素对象的成员,它的使用非常简单,比如 co ...
- h5的classList对象
H5新增属性classList h5中新增了一个classList,原生js可以通过它来判断获取dom节点有无某个class. classList是html元素对象的成员,它的使用非常简单,比如 co ...
随机推荐
- php 操作 oracle lob 数据2
CREATE SEQUENCE mylobs_id_seq NOMINVALUE NOMAXVALUE NOCYCLE CACHE 20 NOORDERINCREMENT ...
- 自己动手做AI:Google AIY开发工具包解析
2018年国际消费性电子展(CES)上,最明显的一个趋势是Amazon与Google的语音技术进驻战,如AmazonAlexa进驻到Acer笔电内,Google Assist进驻到KIA汽车内,其他如 ...
- Linux文件归档和解压缩
1.tar tar命令相当于归档,不做压缩,解压同样也是把归档文件释放出来(归档通俗上可以理解为把文件分类,把一些文件放到一个包中归类,方便用户管理) 解包:tar -zxvf file.tar #解 ...
- python编辑购物车
一.需求分析 输入工资金额,进入购物车,并打印输出商品编号和价格,用户可以通过输入商品编号进行商品选购 余额不足时,打印提示信息 通过q进行退出结算 购物车能够循环购物 二.代码实现 ShoopCar ...
- html的背景样式图片
背景图片 如果背景图片小于当前的div的情况下 默认的是将平铺充满元素 background-image 设置背景图片. background-repeat 设置是否及如何重复背景图片. repeat ...
- Centos7下安装Oracle11g r2
我的centos7是在virtualbox下安装的,安装Oracle安装了好久好久,最开始的时候在网上找的两个文章,按照步骤装,有一篇写着装的时候有灰色的竖线,直接按space键或者鼠标右键close ...
- Longge's problem(欧拉函数应用)
Description Longge is good at mathematics and he likes to think about hard mathematical problems whi ...
- Beta阶段第2周/共2周 Scrum立会报告+燃尽图 02
此作业要求参见:[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2410] 版本控制地址 https://git.coding.net ...
- OpenNF tutorial复现
这篇博客记录了自己实现OpenNF官网上tutorial的过程和遇见的问题,如果有不对的地方还请批评指正! tutorial链接 实验内容 这个实验展示了如何迅速且安全地把一个TCP流从一个NF实例迁 ...
- DataTable转List<T>集合
#region DataTable转List集合 +static IList<T> DataTableToList<T>(DataTable dt) where T : cla ...