有道题是一个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的更多相关文章

  1. [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 ...

  2. HTML5 classList API接口

    原文地址:HTML5 classList API 原文日期: 2010年07月13日 翻译日期: 2013年08月23日 当我陷入JavaScrip和JavaScript类库框架之中时,我总是有种希望 ...

  3. HTML5 classList API

    Having thrust myself into the world of JavaScript and JavaScript Libraries, I've often wondered: Whe ...

  4. 使用 classList API

    一.classList API 是什么 属于 DOM API,HTML5 引入,用来操作 HTML 标签的 class 属性值. classList 属性是一个只读的类数组对象,"实时&qu ...

  5. [转]HTML5 classList API

    Having thrust myself into the world of JavaScript and JavaScript Libraries, I've often wondered: Whe ...

  6. HTML5的classList API优化对样式名className的操作

    //添加一个class elem.classList.add(classname); //删除一个class elem.classList.remove(classname); //判断一个class ...

  7. element.dataset API

    不久之前我向大家展示了非常有用的classList API,它是一种HTML5里提供的原生的对页面元素的CSS类进行增.删改的接口,完全可以替代jQuery里的那些CSS类操作方法.而另外一个非常有用 ...

  8. H5新增属性classList

    H5新增属性classList h5中新增了一个classList,原生js可以通过它来判断获取dom节点有无某个class. classList是html元素对象的成员,它的使用非常简单,比如 co ...

  9. h5的classList对象

    H5新增属性classList h5中新增了一个classList,原生js可以通过它来判断获取dom节点有无某个class. classList是html元素对象的成员,它的使用非常简单,比如 co ...

随机推荐

  1. HDU-4055:Number String

    链接:HDU-4055:Number String 题意:给你一个字符串s,s[i] = 'D'表示排列中a[i] > a[i+1],s[i] = 'I'表示排列中a[i] < a[i+1 ...

  2. Python基础灬高阶函数(lambda,filter,map,reduce,zip)

    高阶函数 lambda函数 关键字lambda表示匿名函数,当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便. lambda函数省略函数名,冒号前为参数,冒号后函数体. # ...

  3. scikit-learn使用PCA降维小结

    本文在主成分分析(PCA)原理总结和用scikit-learn学习主成分分析(PCA)的内容基础上做了一些笔记和补充,强调了我认为重要的部分,其中一些细节不再赘述. Jupiter notebook版 ...

  4. css 元素水平垂直方向居中

    html部分 <div class="parent"> <div class="child"> - -居中- - </div> ...

  5. zigbee,质量追溯系统,上位机,mis系统,C#(一)

    一.效果截图 登录界面 主界面 查看养殖信息界面 添加养殖信息 温度采集实时监控界面1 温度采集实时监控界面2 信息追溯

  6. OOP 2.1 类和对象的基本概念2

    1.成员函数的另一种写法:类的成员函数和类的定义分开写 e.g. class rectangle { public: int w,h; int area(); int p(); void init(i ...

  7. 第15章 磁盘配额(Quota)与高级文件系统管理

    磁盘配额(quota)的应用与实践 什么是quota 举例来说,用户的默认主文件夹是在/home下面,如果/home是个独立的分区,假设是10G,/home下有30个账号,这样30个用户共享这10G的 ...

  8. mysqldump without auto_increment

    mysqldump -u root -p -h <db-host> --opt <db-name> -d --single-transaction | sed 's/ AUTO ...

  9. purcell的emacs配置中的自动补全功能开启

    标记一下,原文参看purcell的emacs配置中的自动补全功能开启 修改init-auto-complete.el文件 ;;(setq-default ac-expand-on-auto-compl ...

  10. [2017BUAA软工]第一次博客作业

    一.一些疑问 看书看得比较慢,暂时只思考了以下几个问题,有些自问自答,不知道符合不符合要求…… [1] 第一章中书上提到了这样一个例子: “如果一架民用飞机上有需求,用户使用它的概率是百万分之一,你还 ...