每日一库:classList.js

地址:https://github.com/eligrey/classList.js

疑问:

function Ctor(){

}

Ctor.prototype = [];

Ctor.prototype.show = function (){

  console.log(this.join(''));
  
}


var  c = new Ctor();
c.push('a');
c.push('b');
c.show();

  ie下为什么不行?

源码:

<!doctype html>
<html>
<head>
<meta charset="gb2312" />
<title></title>
<meta name="description" content=" ">
<meta name="keywords" content=" ">
</head>
<body>
<!--header-->
<style>
.cls1{background-color:blue;}
.cls2{background-color:red;}
.cls3{background-color:green;}
</style>
<div id="test">aaa </div>
<script> 
/*
 * classList.js: Cross-browser full element.classList implementation.
 * 2012-11-15
 *
 * By Eli Grey, http://eligrey.com
 * Public Domain.
 * NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
 */

/*global self, document, DOMException */

/*! @source http://purl.eligrey.com/github/classList.js/blob/master/classList.js*/

if (typeof document !== "undefined" && !("classList" in document.createElement("a"))) {

  (function (view) {

    "use strict";

    if (!('HTMLElement' in view) && !('Element' in view)) return;

    var classListProp = "classList",
       protoProp = "prototype" , 
       elemCtrProto = (view.HTMLElement || view.Element)[protoProp], 
       objCtr = Object, 

       strTrim = String[protoProp].trim || function () {
        return this.replace(/^\s+|\s+$/g, "");
       },
       arrIndexOf = Array[protoProp].indexOf || function (item) {
        var i = 0, 
          len = this.length;

        for (; i < len; i++) {
          if (i in this && this[i] === item) {
            return i;
          }
        }
        return -1;
      },

      // Vendors: please allow content code to instantiate DOMExceptions
       DOMEx = function (type, message) {
        this.name = type;
        this.code = DOMException[type];
        this.message = message;
      },
      checkTokenAndGetIndex = function (classList, token) {
        if (token === "") {
          throw new DOMEx(
             "SYNTAX_ERR" ,
             "An invalid or illegal string was specified"
          );
        }
        if (/\s/.test(token)) {
          throw new DOMEx(
             "INVALID_CHARACTER_ERR" ,
             "String contains an invalid character"
          );
        }
        return arrIndexOf.call(classList, token);
      },

      ClassList = function (elem) {
        var trimmedClasses = strTrim.call(elem.className),
           classes = trimmedClasses ? trimmedClasses.split(/\s+/) : [],
           i = 0,
           len = classes.length ;
       
        for (; i < len; i++) {
          this.push(classes[i]);
        }
        this._updateClassName = function () {
          elem.className = this.toString();
        };
      }, 

      classListProto = ClassList[protoProp] = [], //继承自数组
      classListGetter = function () {
        return new ClassList(this); //this elem
      };
  

    // Most DOMException implementations don't allow calling DOMException's toString()
    // on non-DOMExceptions. Error's toString() is sufficient here. 足够的,充足的;[逻辑学](条件)必然的;〈古〉有能力的,能胜任的,够资格的

    DOMEx[protoProp] = Error[protoProp];

    classListProto.item = function (i) {
      return this[i] || null;
    };
    classListProto.contains = function (token) {
      token += "";
      return checkTokenAndGetIndex(this, token) !== -1;
    };
    classListProto.add = function () {
      var tokens = arguments, 
          i = 0,
          l = tokens.length,
          token,
          updated = false;

      do {
        token = tokens[i] + "";
        if (checkTokenAndGetIndex(this, token) === -1) {
          this.push(token);
          updated = true;
        }
      }
      while (++i < l);

      if (updated) {
        this._updateClassName();
      }
    };
    classListProto.remove = function () {
      var tokens = arguments, 
          i = 0, 
          l = tokens.length,
          token , 
          updated = false;
      
      do {
        token = tokens[i] + "";
        var index = checkTokenAndGetIndex(this, token);
        if (index !== -1) {
          this.splice(index, 1);
          updated = true;
        }
      }
      while (++i < l);

      if (updated) {
        this._updateClassName();
      }
    };
    classListProto.toggle = function (token, forse) {
      token += "";

      var result = this.contains(token),
         method = result ? forse !== true && "remove":forse !== false && "add";

      if (method) {
        this[method](token);
      }

      return result;
    };
    classListProto.toString = function () {
      return this.join(" ");
    };

    if (objCtr.defineProperty) {
      var classListPropDesc = {
          get: classListGetter,
          enumerable: true,
          configurable: true
      };
      try {
        objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc);
      } catch (ex) { // IE 8 doesn't support enumerable:true
        if (ex.number === -0x7FF5EC54) {
          classListPropDesc.enumerable = false;
          objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc);
        }
      }
    } else if (objCtr[protoProp].__defineGetter__) {
      elemCtrProto.__defineGetter__(classListProp, classListGetter);
    }

  }(self));

}

</script>
<!--/header-->
</body>
</html>

  

posted @ 2013-02-22 12:04  zhuzefu  阅读(682)  评论(0编辑  收藏  举报