zoukankan      html  css  js  c++  java
  • 温习classList api

      有道题是一个removeClass的功能,代码里是正则分隔了传入的name,根据name的个数,循环移除掉,让寻找bug。。看了了这几行代码,首先想到的是我会如何去优化。 如果看代码一两分钟就能找到公司js框架中的bug,那也太。。。

      改为如何优化算是不错的面试题,

        first,去掉正则表达式,使用split字符串内置方法分隔,

        second,支持html5的浏览器使用classList api,

        第三,类似jq,hasClass、remove、togglle都是用了字符串内置方法,indexOf、replace、字符串相加。

    周末试着coding。代码如下

     1             var className = (function() {
     2                 //设置的方法list
     3                 var fnName = 'add,remove,contains,toggle'.split(',');
     4                 var _trim = function(str) {
     5                     return str.trim ? str.trim() : str.replace(/(^s*)|(s*$)/g, "");
     6                 };
     7 
     8                 //不支持H5的classList,使用自定义方法实现
     9                 var cClassList = {
    10                     add: function(el, name) {
    11                         if (!this.contains(el, name)) {
    12                             el.className = _trim(el.className + ' ' + name + ' ');
    13                         }
    14                     },
    15                     remove: function(el, name) {
    16                         if (this.contains(el, name)) {
    17                             var _class = (' ' + el.className + ' ').replace(' ' + name + ' ', ' ');
    18                             el.className = _class ? _trim(_class) : '';
    19                         }
    20                     },
    21                     contains: function(el, name) {
    22                         if (el && el.nodeType == 1 && (" " + el.className + " ").indexOf(" " + name + " ") >= 0) {
    23                             return true;
    24                         }
    25                         return false;
    26                     },
    27                     toggle: function(el, name) {
    28                         if (this.contains(el, name)) {
    29                             this.remove(el, name);
    30                         } else {
    31                             this.add(el, name);
    32                         }
    33                     }
    34                 };
    35 
    36                 var _classList = {};
    37                 /*
    38                  * 如果name为多个(空格分隔),那么循环设置,反之调用classList设置
    39                  * @param {HtmlNode} type
    40                  * @param {String} name
    41                  * @returns {undefined}
    42                  */
    43                 var _eachDo = function(type, name) {
    44                     if (typeof name === 'string' && name.length) {
    45                         name = _trim(name).split(' ');
    46                         var len = name.length;
    47                         if (len === 1) {
    48                             if (this.classList) {//使用h5的classList,非hasClass 则return undefined
    49                                 return this.classList[type](name[0]);
    50                             } else {
    51                                 return cClassList[type](this, name);//使用自定义设置
    52                             }
    53                         } else {
    54                             var Return = true;
    55                             for (var j = 0; j < len; j++) {
    56                                 if (_eachDo.call(this, type, name[j]) == false) {
    57                                     Return = false;
    58                                 }
    59                                 ;
    60                             }
    61                             return Return;
    62                         }
    63                     }
    64                 };
    65                 //添加上 add、toggle、contains、remove方法
    66                 for (var i = 0; i < fnName.length; i++) {
    67                     (function(key) {
    68                         _classList[key] = function(el, name) {
    69                             //如果传入的className是个function,那么得到计算结果
    70                             if (typeof name === 'function') {
    71                                 name = name.call(this);
    72                             }
    73                             return _eachDo.call(el, key, name);
    74                         };
    75                     })(fnName[i]);
    76                 }
    77                 //hasClass
    78                 _classList['has'] = _classList.contains;
    79                 return _classList;
    80             })();
    81 
    82             var div1 = document.getElementById('div1');
    83             className.add(div1, 'asd fv');
    84             alert(div1.className)
    85             className.remove(div1, 'asd');
    86             alert(div1.className)
    87             className.toggle(div1, 'asd sd');
    88             alert(div1.className)
    89             className.add(div1, 'asd sd fv');
    90             alert(div1.className)
    91             alert(className.has(div1, 'asd fv'))
    View Code
  • 相关阅读:
    线程
    ACM/OJ输入输出Tips
    Maven---pom.xml详解
    通过chrome分析知乎的登录过程学习cookie原理
    Javaweb日志系统
    SpingMVC+AJAX+jquery表单数据交互
    SpringMVC Controller 失效 404错误 IEDA
    【JavaSE】Properties类
    freemaker判断对象非空
    移植openssh时could not load host key: /etc/ssh/ssh_host_rsa_key 无法启动ssh的一个解决办法
  • 原文地址:https://www.cnblogs.com/henryli/p/3427815.html
Copyright © 2011-2022 走看看