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就是相应上面的问题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类的更多相关文章

  1. 使用HTML5里的classList操作CSS类

    在HTML5 API里,页面DOM里的每个节点上都有一个classList对象,程序员可以使用里面的方法新增.删除.修改节点上的CSS类.使用classList,程序员还可以用它来判断某个节点是否被赋 ...

  2. 第88天:HTML5中使用classList操作css类

    在HTML5 API里,页面DOM里的每个节点上都有一个classList对象,程序员可以使用里面的方法新增.删除.修改节点上的CSS类.使用classList,程序员还可以用它来判断某个节点是否被赋 ...

  3. Java类的继承与多态特性-入门笔记

    相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...

  4. javascript正則表達式 &quot;\b&quot;问题

    preface 昨晚在看<javascript权威指南>后.看见作者自己封装一个兼容全部浏览器的山寨HTML5新API classLIst类.自己想了想认为自己也要去玩一下.可是能力还是有 ...

  5. 在自己的对象里实现IEnumerator和IEnumerable

    平时工作中我们经常用foreach来迭代一个集合.比如 foreach (Student student in myClass) { Console.WriteLine(student); } 基本所 ...

  6. 机器学习之决策树(ID3 、C4.5算法)

    声明:本篇博文是学习<机器学习实战>一书的方式路程,系原创,若转载请标明来源. 1 决策树的基础概念 决策树分为分类树和回归树两种,分类树对离散变量做决策树 ,回归树对连续变量做决策树.决 ...

  7. Jetty学习四:部署到Jetty

    转自:http://www.tuicool.com/articles/NrENjq Web应用的框架 标准Jetty发布版本能部署标准servlet Spec Web应用和Jetty内部Context ...

  8. 别真以为JavaScript中func.call/apply/bind是万能的!

    自从学会call/apply/bind这三个方法后我就各种场合各种使用各种得心应手至今还没踩过什么坑,怎么用?说直白点就是我自己的对象没有某个方法但别人有,我就可以通过call/apply/bind去 ...

  9. Jetty:部署到Jetty

    Web应用的框架 标准Jetty公布版本号能部署标准servlet Spec Web应用和Jetty内部ContextHandler部署描写叙述符,或者两者的一个混合. Web应用是可部署的动态(se ...

随机推荐

  1. Upgrade site collection from SP2010 to SP2013(Part 2)

    内容中包含 base64string 图片造成字符过多,拒绝显示

  2. Android 下使用 JSON 实现 HTTP 请求

    不得不说,JSON 格式的确是非常美妙的,速度快而且简化了很多操作在 Android 下,Android SDK 已经为我们封装好了整个与 JSON 有关的操作,使用非常方便 以下就是一个标准的 JS ...

  3. html5--移动端视频video的android兼容,去除播放控件、全屏等

    html5 中的video 在手机浏览器中的总结所有页面播放时, 如果选择全屏播放, 播放画面将浮动到屏幕的最上层 IOS 手机   自动播放 播放界面浮动文字 播放时是否自动全屏 能否嵌入在页面中播 ...

  4. kendo-ui的使用和开发自己的组件

    摘要: 前面介绍了一款非常不错的前端框架kendo-ui,如果你想阅读,请点这里.通过使用它一段时间,感觉是非常好用.下面就介绍一下如何使用它和开发自己的组件 引入: 只需要引进下面三个文件即可 ke ...

  5. 【java】java 设计模式(4):建造者模式(Builder)

    工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面抽象工厂模式和最后的Test结合起来得到 ...

  6. socket小实例

    服务端 using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syst ...

  7. Razor------引入css文件的方法

    MVC3.0之前版本: <link href=@Url.Content("~/Content/Styles.css") rel="stylesheet" ...

  8. 棒谷科技java岗笔试题与初试题

    选择题 1.银行家算法的作用 2.docker镜像结构 3.docker的默认网络模式 4.spring的动态代理效率比较 5.springboot默认的json 6.springboot多profi ...

  9. Android储存

    Android储存一共5种方法 一: 手机内置,外部储存 1.获取本地存储 (Android的读写文件及权限设置) getFilesDir()   data/data/包名/File getCache ...

  10. thinkjs——两表联查

    问题来源: 现有一张texture以及一张tradename表,两者的联系是texture表中有一字段名为tid对应tradename表中的id,而tradename表中却有一字段type,要求根据t ...