| OLD | NEW | 
|---|
| (Empty) |  | 
|  | 1 /*! | 
|  | 2  * classList.js: Cross-browser full element.classList implementation. | 
|  | 3  * 1.2.201711092 | 
|  | 4  * | 
|  | 5  * By Eli Grey, http://eligrey.com | 
|  | 6  * License: Dedicated to the public domain. | 
|  | 7  *   See https://github.com/eligrey/classList.js/blob/master/LICENSE.md | 
|  | 8  */ | 
|  | 9 | 
|  | 10 /*global self, document, DOMException */ | 
|  | 11 | 
|  | 12 /*! @source http://purl.eligrey.com/github/classList.js/blob/master/classList.js
      */ | 
|  | 13 | 
|  | 14 if ("document" in self) { | 
|  | 15 | 
|  | 16   // Full polyfill for browsers with no classList support | 
|  | 17   // Including IE < Edge missing SVGElement.classList | 
|  | 18   if ( | 
|  | 19        !("classList" in document.createElement("_")) | 
|  | 20     || document.createElementNS | 
|  | 21     && !("classList" in document.createElementNS("http://www.w3.org/2000/svg","g
     ")) | 
|  | 22   ) { | 
|  | 23 | 
|  | 24   (function (view) { | 
|  | 25 | 
|  | 26   "use strict"; | 
|  | 27 | 
|  | 28   if (!('Element' in view)) return; | 
|  | 29 | 
|  | 30   var | 
|  | 31       classListProp = "classList" | 
|  | 32     , protoProp = "prototype" | 
|  | 33     , elemCtrProto = view.Element[protoProp] | 
|  | 34     , objCtr = Object | 
|  | 35     , strTrim = String[protoProp].trim || function () { | 
|  | 36       return this.replace(/^\s+|\s+$/g, ""); | 
|  | 37     } | 
|  | 38     , arrIndexOf = Array[protoProp].indexOf || function (item) { | 
|  | 39       var | 
|  | 40           i = 0 | 
|  | 41         , len = this.length | 
|  | 42       ; | 
|  | 43       for (; i < len; i++) { | 
|  | 44         if (i in this && this[i] === item) { | 
|  | 45           return i; | 
|  | 46         } | 
|  | 47       } | 
|  | 48       return -1; | 
|  | 49     } | 
|  | 50     // Vendors: please allow content code to instantiate DOMExceptions | 
|  | 51     , DOMEx = function (type, message) { | 
|  | 52       this.name = type; | 
|  | 53       this.code = DOMException[type]; | 
|  | 54       this.message = message; | 
|  | 55     } | 
|  | 56     , checkTokenAndGetIndex = function (classList, token) { | 
|  | 57       if (token === "") { | 
|  | 58         throw new DOMEx( | 
|  | 59             "SYNTAX_ERR" | 
|  | 60           , "The token must not be empty." | 
|  | 61         ); | 
|  | 62       } | 
|  | 63       if (/\s/.test(token)) { | 
|  | 64         throw new DOMEx( | 
|  | 65             "INVALID_CHARACTER_ERR" | 
|  | 66           , "The token must not contain space characters." | 
|  | 67         ); | 
|  | 68       } | 
|  | 69       return arrIndexOf.call(classList, token); | 
|  | 70     } | 
|  | 71     , ClassList = function (elem) { | 
|  | 72       var | 
|  | 73           trimmedClasses = strTrim.call(elem.getAttribute("class") || "") | 
|  | 74         , classes = trimmedClasses ? trimmedClasses.split(/\s+/) : [] | 
|  | 75         , i = 0 | 
|  | 76         , len = classes.length | 
|  | 77       ; | 
|  | 78       for (; i < len; i++) { | 
|  | 79         this.push(classes[i]); | 
|  | 80       } | 
|  | 81       this._updateClassName = function () { | 
|  | 82         elem.setAttribute("class", this.toString()); | 
|  | 83       }; | 
|  | 84     } | 
|  | 85     , classListProto = ClassList[protoProp] = [] | 
|  | 86     , classListGetter = function () { | 
|  | 87       return new ClassList(this); | 
|  | 88     } | 
|  | 89   ; | 
|  | 90   // Most DOMException implementations don't allow calling DOMException's toStri
     ng() | 
|  | 91   // on non-DOMExceptions. Error's toString() is sufficient here. | 
|  | 92   DOMEx[protoProp] = Error[protoProp]; | 
|  | 93   classListProto.item = function (i) { | 
|  | 94     return this[i] || null; | 
|  | 95   }; | 
|  | 96   classListProto.contains = function (token) { | 
|  | 97     return !~checkTokenAndGetIndex(this, token + ""); | 
|  | 98   }; | 
|  | 99   classListProto.add = function () { | 
|  | 100     var | 
|  | 101         tokens = arguments | 
|  | 102       , i = 0 | 
|  | 103       , l = tokens.length | 
|  | 104       , token | 
|  | 105       , updated = false | 
|  | 106     ; | 
|  | 107     do { | 
|  | 108       token = tokens[i] + ""; | 
|  | 109       if (~checkTokenAndGetIndex(this, token)) { | 
|  | 110         this.push(token); | 
|  | 111         updated = true; | 
|  | 112       } | 
|  | 113     } | 
|  | 114     while (++i < l); | 
|  | 115 | 
|  | 116     if (updated) { | 
|  | 117       this._updateClassName(); | 
|  | 118     } | 
|  | 119   }; | 
|  | 120   classListProto.remove = function () { | 
|  | 121     var | 
|  | 122         tokens = arguments | 
|  | 123       , i = 0 | 
|  | 124       , l = tokens.length | 
|  | 125       , token | 
|  | 126       , updated = false | 
|  | 127       , index | 
|  | 128     ; | 
|  | 129     do { | 
|  | 130       token = tokens[i] + ""; | 
|  | 131       index = checkTokenAndGetIndex(this, token); | 
|  | 132       while (~index) { | 
|  | 133         this.splice(index, 1); | 
|  | 134         updated = true; | 
|  | 135         index = checkTokenAndGetIndex(this, token); | 
|  | 136       } | 
|  | 137     } | 
|  | 138     while (++i < l); | 
|  | 139 | 
|  | 140     if (updated) { | 
|  | 141       this._updateClassName(); | 
|  | 142     } | 
|  | 143   }; | 
|  | 144   classListProto.toggle = function (token, force) { | 
|  | 145     var | 
|  | 146         result = this.contains(token) | 
|  | 147       , method = result ? | 
|  | 148         force !== true && "remove" | 
|  | 149       : | 
|  | 150         force !== false && "add" | 
|  | 151     ; | 
|  | 152 | 
|  | 153     if (method) { | 
|  | 154       this[method](token); | 
|  | 155     } | 
|  | 156 | 
|  | 157     if (force === true || force === false) { | 
|  | 158       return force; | 
|  | 159     } else { | 
|  | 160       return !result; | 
|  | 161     } | 
|  | 162   }; | 
|  | 163   classListProto.replace = function (token, replacement_token) { | 
|  | 164     var index = checkTokenAndGetIndex(token + ""); | 
|  | 165     if (~index) { | 
|  | 166       this.splice(index, 1, replacement_token); | 
|  | 167       this._updateClassName(); | 
|  | 168     } | 
|  | 169   } | 
|  | 170   classListProto.toString = function () { | 
|  | 171     return this.join(" "); | 
|  | 172   }; | 
|  | 173 | 
|  | 174   if (objCtr.defineProperty) { | 
|  | 175     var classListPropDesc = { | 
|  | 176         get: classListGetter | 
|  | 177       , enumerable: true | 
|  | 178       , configurable: true | 
|  | 179     }; | 
|  | 180     try { | 
|  | 181       objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc); | 
|  | 182     } catch (ex) { // IE 8 doesn't support enumerable:true | 
|  | 183       // adding undefined to fight this issue https://github.com/eligrey/classLi
     st.js/issues/36 | 
|  | 184       // modernie IE8-MSW7 machine has IE8 8.0.6001.18702 and is affected | 
|  | 185       if (ex.number === undefined || ex.number === -0x7FF5EC54) { | 
|  | 186         classListPropDesc.enumerable = false; | 
|  | 187         objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc); | 
|  | 188       } | 
|  | 189     } | 
|  | 190   } else if (objCtr[protoProp].__defineGetter__) { | 
|  | 191     elemCtrProto.__defineGetter__(classListProp, classListGetter); | 
|  | 192   } | 
|  | 193 | 
|  | 194   }(self)); | 
|  | 195 | 
|  | 196   } | 
|  | 197 | 
|  | 198   // There is full or partial native classList support, so just check if we need | 
|  | 199   // to normalize the add/remove and toggle APIs. | 
|  | 200 | 
|  | 201   (function () { | 
|  | 202     "use strict"; | 
|  | 203 | 
|  | 204     var testElement = document.createElement("_"); | 
|  | 205 | 
|  | 206     testElement.classList.add("c1", "c2"); | 
|  | 207 | 
|  | 208     // Polyfill for IE 10/11 and Firefox <26, where classList.add and | 
|  | 209     // classList.remove exist but support only one argument at a time. | 
|  | 210     if (!testElement.classList.contains("c2")) { | 
|  | 211       var createMethod = function(method) { | 
|  | 212         var original = DOMTokenList.prototype[method]; | 
|  | 213 | 
|  | 214         DOMTokenList.prototype[method] = function(token) { | 
|  | 215           var i, len = arguments.length; | 
|  | 216 | 
|  | 217           for (i = 0; i < len; i++) { | 
|  | 218             token = arguments[i]; | 
|  | 219             original.call(this, token); | 
|  | 220           } | 
|  | 221         }; | 
|  | 222       }; | 
|  | 223       createMethod('add'); | 
|  | 224       createMethod('remove'); | 
|  | 225     } | 
|  | 226 | 
|  | 227     testElement.classList.toggle("c3", false); | 
|  | 228 | 
|  | 229     // Polyfill for IE 10 and Firefox <24, where classList.toggle does not | 
|  | 230     // support the second argument. | 
|  | 231     if (testElement.classList.contains("c3")) { | 
|  | 232       var _toggle = DOMTokenList.prototype.toggle; | 
|  | 233 | 
|  | 234       DOMTokenList.prototype.toggle = function(token, force) { | 
|  | 235         if (1 in arguments && !this.contains(token) === !force) { | 
|  | 236           return force; | 
|  | 237         } else { | 
|  | 238           return _toggle.call(this, token); | 
|  | 239         } | 
|  | 240       }; | 
|  | 241 | 
|  | 242     } | 
|  | 243 | 
|  | 244     // replace() polyfill | 
|  | 245     if (!("replace" in document.createElement("_").classList)) { | 
|  | 246       DOMTokenList.prototype.replace = function (token, replacement_token) { | 
|  | 247         var | 
|  | 248             tokens = this.toString().split(" ") | 
|  | 249           , index = tokens.indexOf(token + "") | 
|  | 250         ; | 
|  | 251         if (~index) { | 
|  | 252           tokens = tokens.slice(index); | 
|  | 253           this.remove.apply(this, tokens); | 
|  | 254           this.add(replacement_token); | 
|  | 255           this.add.apply(this, tokens.slice(1)); | 
|  | 256         } | 
|  | 257       } | 
|  | 258     } | 
|  | 259 | 
|  | 260     testElement = null; | 
|  | 261   }()); | 
|  | 262 | 
|  | 263   } | 
| OLD | NEW | 
|---|