山寨HTML5API classList类
preface
认为自己去写一些类,你真的会找到自己不足的地方。事实上厉害不是你实现一个类。而是你怎样去设计一个类,能让开发人员更加easy操作。
对于这个操作样式,能够通过javascript訪问style,可是在《javascript高级程序设计》中有说到这样子CSS、javascript、HTML耦合度太高,不太适合维护。还有就是通过className,可是我们知道className是一个能够被开发人员读写的字符串,假设要增删查改元素相应的className的话,能够实现,可是比較麻烦。这个时候HTML5站出来了,提出了classList类,确实方便我们开发人员去使用,可是它有一个弊端就是兼容性不是非常好。
introduction
- 简介element.classList,以下是它的4个方法
- 1 add a class to an element's list of classes(为元素加入class)
- 2 remove a class from an element's list of classes(删除元素的class)
- 3 toggle the existence of a class in an element's list of classes ◦See below about the optional second argument.(切换元素的class)
- 4 check if an element's list of classes contains a specific class(检查元素是否有这个class)
确实认为这种API让开发人员少做非常多苦力活,具体的能够去看element.classList,毕竟上面不是我想深入了解的知识点,我想深入了解的是,自己先去模仿别人设计的API,看自己能不能扩展那个API(非常显然自己还没达到那种程度)。
description
在这里说明下我定义的CSSClassList能够到我《javascript正則表達式 "\b"问题》找,这里我就不详述了。我们主要还是来实现上面说的4个方法,能够在不支持classListAPI的浏览器上用
- 一 contains方法(个人认为这种方法是最重要的。之后的add remove和toggle方法都要用到)
-
CSSClassList.prototype.contains = function(cls) {
var classname = this.el.className, reg = new RegExp("\\b" + cls + "\\b");
return reg.test(classname);
}
-
遇见的问题:
- 1 在《javascript正則表達式 "\b"问题》事实上有提到一个比較easy忽略的问题就是对于字符串"\b"与"\\b"的差别。
- 2 怎样将一个字符串转换成正則表達式
-
解决这个问题(1就是相应上面的问题1,以此类推)
- 1 在《javascript正則表達式 "\b"问题》有说道,这里不再详述。
- 2 在我脑海中如今有两种方法,一种是用eval,可是由于安全性还有性能问题被我否决了。所以我改成了另外一种方法是用RegExp构造函数。假设对于如今正在读我的blog的您来说。有更好的方法请告诉我,大家来交流交流。
- 二 add方法
-
CSSClassList.prototype.add = function(cls) {
var classname = this.el.className;
if (this.contains(cls))
return;
else {
var arr = classname.split(/\s+/);
arr.push(cls);
this.el.className = arr.join(" ");
}}
-
设计思路:
假设在该元素中找到class的话。就不加入了。找不到就加入,怎样去加入?我把该元素的className字符 串转成数组,然后使用数组的push方法并把数组转换成字符串赋值给该元素的className
-
遇见的问题:
- 对于字符串的split方法不是非常熟练,比方上面有句代码我写成了var arr = classname.split("/\s+/");记住在split參数中是正則表達式可是我又画蛇添足加了双引號""。
-
解决这个问题:
- 三 remove方法(这种方法还是我折腾比較久的)
-
CSSClassList.prototype.remove = function(cls) {
var classname = this.el.className;
if (!this.contains(cls))
return -1;
else {
//indexOf还是有兼容性问题
var arr = classname.split(/\s+/), index = arrIndexOf(arr, cls);
arr.splice(index, 1);
this.el.className = arr.join(" ");
return (this.el.className);
}
}
- 设计思路:找不到要删除的class就返回-1,然后确定该元素有这个class。就要去找那个class是在哪。然后把它删除掉。还是那样子先把该元素的className转换成数组,然后能够用到ES5的Array.prototype.indexOf方法找到class相应的下标。可是被我否决了。由于这个indexOf仅仅能在IE9+才干用。如过IE9+能用的话,事实上就不是必需去实现山寨的classList,由于IE9+本身就支持,那怎么办?以下会详述。
找到相应的下标就用数组的splice去删除该class并把删除后的数组转换成字符串赋给该元素的className
-
遇到问题
- 主要还是怎么用原生的javascript去实现indexOf方法?
-
解决这个问题
function arrIndexOf(arr, searchEl) {
if (arr.indexOf) {
return arr.indexOf(searchEl);
} else {
for (var i = 0, len = arr.length; i < len; i++) {
if (arr[i] === searchEl)
return i;
}
return -1;
}
}
就不用我过多去解释了吧。应该看完代码非常easy懂吧,我也不是什么大牛级,所以我写的代码还是非常平易近人的。
- 四 toggle方法
-
CSSClassList.prototype.toggle = function(cls) {
if (!this.contains(cls))
this.add(cls);
else
this.remove(cls);
}
这个就不说了,一看就知道了。
summary
在写这个类的时候确实还是遇到非常多问题,可是总是能一一解决。
我认为一个程序猿最重要的是他的解决这个问题的能力吧。
毕竟自己写的类也不是非常多。可能是自己的处女作吧。还是会有很多问题出现的,有空的话。我会看看其它大牛写的代码。然后两者再比較,有对照才有差距才有进步。
山寨HTML5API classList类的更多相关文章
- 使用HTML5里的classList操作CSS类
在HTML5 API里,页面DOM里的每个节点上都有一个classList对象,程序员可以使用里面的方法新增.删除.修改节点上的CSS类.使用classList,程序员还可以用它来判断某个节点是否被赋 ...
- 第88天:HTML5中使用classList操作css类
在HTML5 API里,页面DOM里的每个节点上都有一个classList对象,程序员可以使用里面的方法新增.删除.修改节点上的CSS类.使用classList,程序员还可以用它来判断某个节点是否被赋 ...
- Java类的继承与多态特性-入门笔记
相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...
- javascript正則表達式 "\b"问题
preface 昨晚在看<javascript权威指南>后.看见作者自己封装一个兼容全部浏览器的山寨HTML5新API classLIst类.自己想了想认为自己也要去玩一下.可是能力还是有 ...
- 在自己的对象里实现IEnumerator和IEnumerable
平时工作中我们经常用foreach来迭代一个集合.比如 foreach (Student student in myClass) { Console.WriteLine(student); } 基本所 ...
- 机器学习之决策树(ID3 、C4.5算法)
声明:本篇博文是学习<机器学习实战>一书的方式路程,系原创,若转载请标明来源. 1 决策树的基础概念 决策树分为分类树和回归树两种,分类树对离散变量做决策树 ,回归树对连续变量做决策树.决 ...
- Jetty学习四:部署到Jetty
转自:http://www.tuicool.com/articles/NrENjq Web应用的框架 标准Jetty发布版本能部署标准servlet Spec Web应用和Jetty内部Context ...
- 别真以为JavaScript中func.call/apply/bind是万能的!
自从学会call/apply/bind这三个方法后我就各种场合各种使用各种得心应手至今还没踩过什么坑,怎么用?说直白点就是我自己的对象没有某个方法但别人有,我就可以通过call/apply/bind去 ...
- Jetty:部署到Jetty
Web应用的框架 标准Jetty公布版本号能部署标准servlet Spec Web应用和Jetty内部ContextHandler部署描写叙述符,或者两者的一个混合. Web应用是可部署的动态(se ...
随机推荐
- UVA - 11920 0 s, 1 s and ? Marks
Description 0 s, 1 s and ? Marks Given a string consisting of 0, 1 and ? only, change all the ? to ...
- weblogic安装部署war包——windows
### weblogic安装部署war包——windows#### 下载weblogic安装包[csdn下载地址](https://download.csdn.net/download/luozhua ...
- OpenCV学习:Mat结构中的数据共享机制
使用Mat类,内存管理变得简单,不再像使用IplImage那样需要自己申请和释放内存. Mat是一个类,由两个数据部分组成:矩阵头(包含矩阵尺寸,存储方法,存储地址等信息)和一个指向存储所有像素值的矩 ...
- CSS定位背景图片 background-position
网站的样式的时候经常会发现一种情况,就是在很多background属性里都调用同一张图片,来满足网页各个部分的使用.打开这种图片看一下,会发现这张图片上包含了很多小图片; 又如: 这些小图片就是整图分 ...
- 查看当前mysql数据库实例中,支持的字符集有哪些,或者是否支持某个特定字符集
需求描述: 查看当前mysql实例中支持哪些字符集,过滤特定的字符集 操作过程: 1.通过show character set来进行查看 mysql> show character set; + ...
- brew 接口的原理
请查看相关文档的第9章 该文档可以csdn silentjesse帐号下的资源去下载 http://download.csdn.net/detail/silentjesse/5859077
- 【java】 java设计模式(3):单例模式(Singleton)
单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处: 1.某些类创建比较频繁,对于一些大型的对象,这是一笔 ...
- [Scikit-learn] Dynamic Bayesian Network - HMM
Warning The sklearn.hmm module has now been deprecated due to it no longer matching the scope and th ...
- GLSL/C++ 实现滤镜效果
入门效果之浮雕 "浮雕"图象效果是指图像的前景前向凸出背景.常见于一些纪念碑的雕刻上.要实现浮雕事实上很easy.我们把图象的一个象素和左上方的象素进行求差运算.并加上一个灰度.这 ...
- 把Excel中的数据转换成Sql语句
假如excel表格中有A.B.C三列数据,希望导入到数据库users表中,相应的字段各自是name,sex,age ,在你的excel表格中添加一列.利用excel的公式自己主动生成sql语句,方法例 ...