2.0
							parent
							
								
									49b7a26e62
								
							
						
					
					
						commit
						76ced919e0
					
				
							
								
								
									
										13
									
								
								readme.md
								
								
								
								
							
							
						
						
									
										13
									
								
								readme.md
								
								
								
								
							|  | @ -1,6 +1,7 @@ | ||||||
| ## Anot.js | ## Anot.js 2.x | ||||||
| > Anot 是Anot not only templateEngine的缩写。 它是一款迷你,易用、高性能的前端MVVM框架, fork于avalon。进行了大量的重构,精简部分冗余的API, 同时针对组件拓展进行了优化。 | > Anot 是Anot not only templateEngine的缩写。 它是一款迷你,易用、高性能的前端MVVM框架, fork于avalon。进行了大量的重构,精简部分冗余的API, 同时针对组件拓展进行了优化。 | ||||||
| 
 | 
 | ||||||
|  | >> 2.x版本为 全新版本, 只兼容支持type="module"的浏览器。 | ||||||
| 
 | 
 | ||||||
| ```bash | ```bash | ||||||
| # 开发模式 | # 开发模式 | ||||||
|  | @ -12,13 +13,9 @@ npm start | ||||||
| # 打包 | # 打包 | ||||||
| npm run prod | npm run prod | ||||||
| ``` | ``` | ||||||
| 执行完, 会打包为6个版本, 分别是 | 执行完, 会打包为2个版本, 分别是 | ||||||
| - anot.js  普通版(可用于webpack) | - anot.js  普通版(需要支持es6 module的现代浏览器) | ||||||
| - anot-touch.js 普通带触摸版(可用于webpack) | - anot-touch.js  带触摸的版本(需要支持es6 module的现代浏览器) | ||||||
| - anot.shim.js  自带AMD加载版 |  | ||||||
| - anot-touch.shim.js 自带AMD加载带触摸版 |  | ||||||
| - anot.next.js  未来版(需要支持es6 module的现代浏览器) |  | ||||||
| - anot-touch.next.js  带触摸的未来版(需要支持es6 module的现代浏览器) |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| ### 文档: | ### 文档: | ||||||
|  |  | ||||||
|  | @ -1,20 +1,20 @@ | ||||||
| /********************************************************************* | /********************************************************************* | ||||||
|  *                    全局变量及方法                                   * |  *                    全局变量及方法                                   * | ||||||
|  **********************************************************************/ |  **********************************************************************/ | ||||||
| var bindingID = 1024 | let bindingID = 1024 | ||||||
| var IEVersion = 0 | let IEVersion = 0 | ||||||
| if (window.VBArray) { | if (window.VBArray) { | ||||||
|   IEVersion = document.documentMode || (window.XMLHttpRequest ? 7 : 6) |   IEVersion = document.documentMode || (window.XMLHttpRequest ? 7 : 6) | ||||||
| } | } | ||||||
| var expose = generateID() | let expose = generateID() | ||||||
| //http://stackoverflow.com/questions/7290086/javascript-use-strict-and-nicks-find-global-function
 | //http://stackoverflow.com/questions/7290086/javascript-use-strict-and-nicks-find-global-function
 | ||||||
| var DOC = window.document | let DOC = window.document | ||||||
| var head = DOC.head //HEAD元素
 | let head = DOC.head //HEAD元素
 | ||||||
| head.insertAdjacentHTML( | head.insertAdjacentHTML( | ||||||
|   'afterBegin', |   'afterBegin', | ||||||
|   '<anot skip class="anot-hide"><style id="anot-style">.anot-hide{ display: none!important } slot{visibility:hidden;}</style></anot>' |   '<anot skip class="anot-hide"><style id="anot-style">.anot-hide{ display: none!important } slot{visibility:hidden;}</style></anot>' | ||||||
| ) | ) | ||||||
| var ifGroup = head.firstChild | let ifGroup = head.firstChild | ||||||
| 
 | 
 | ||||||
| function log() { | function log() { | ||||||
|   // http://stackoverflow.com/questions/8785624/how-to-safely-wrap-console-log
 |   // http://stackoverflow.com/questions/8785624/how-to-safely-wrap-console-log
 | ||||||
|  | @ -34,22 +34,22 @@ function createMap() { | ||||||
|   return Object.create(null) |   return Object.create(null) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| var subscribers = '$' + expose | let subscribers = '$' + expose | ||||||
| 
 | 
 | ||||||
| var nullObject = {} //作用类似于noop,只用于代码防御,千万不要在它上面添加属性
 | let nullObject = {} //作用类似于noop,只用于代码防御,千万不要在它上面添加属性
 | ||||||
| var rword = /[^, ]+/g //切割字符串为一个个小块,以空格或豆号分开它们,结合replace实现字符串的forEach
 | let rword = /[^, ]+/g //切割字符串为一个个小块,以空格或豆号分开它们,结合replace实现字符串的forEach
 | ||||||
| var rw20g = /\w+/g | let rw20g = /\w+/g | ||||||
| var rsvg = /^\[object SVG\w*Element\]$/ | let rsvg = /^\[object SVG\w*Element\]$/ | ||||||
| var oproto = Object.prototype | let oproto = Object.prototype | ||||||
| var ohasOwn = oproto.hasOwnProperty | let ohasOwn = oproto.hasOwnProperty | ||||||
| var serialize = oproto.toString | let serialize = oproto.toString | ||||||
| var ap = Array.prototype | let ap = Array.prototype | ||||||
| var aslice = ap.slice | let aslice = ap.slice | ||||||
| var W3C = window.dispatchEvent | let W3C = window.dispatchEvent | ||||||
| var root = DOC.documentElement | let root = DOC.documentElement | ||||||
| var anotFragment = DOC.createDocumentFragment() | let anotFragment = DOC.createDocumentFragment() | ||||||
| var cinerator = DOC.createElement('div') | let cinerator = DOC.createElement('div') | ||||||
| var class2type = { | let class2type = { | ||||||
|   '[object Boolean]': 'boolean', |   '[object Boolean]': 'boolean', | ||||||
|   '[object Number]': 'number', |   '[object Number]': 'number', | ||||||
|   '[object String]': 'string', |   '[object String]': 'string', | ||||||
|  | @ -74,9 +74,9 @@ function oneObject(array, val) { | ||||||
|   if (typeof array === 'string') { |   if (typeof array === 'string') { | ||||||
|     array = array.match(rword) || [] |     array = array.match(rword) || [] | ||||||
|   } |   } | ||||||
|   var result = {}, |   let result = {}, | ||||||
|     value = val !== void 0 ? val : 1 |     value = val !== void 0 ? val : 1 | ||||||
|   for (var i = 0, n = array.length; i < n; i++) { |   for (let i = 0, n = array.length; i < n; i++) { | ||||||
|     result[array[i]] = value |     result[array[i]] = value | ||||||
|   } |   } | ||||||
|   return result |   return result | ||||||
|  |  | ||||||
|  | @ -3,352 +3,24 @@ | ||||||
| // ===============================
 | // ===============================
 | ||||||
| // ========== Promise ============
 | // ========== Promise ============
 | ||||||
| // ===============================
 | // ===============================
 | ||||||
| ;(function(nativePromise) { |  | ||||||
|   function _yes(val) { |  | ||||||
|     return val |  | ||||||
|   } |  | ||||||
| 
 | 
 | ||||||
|   function _no(err) { | if (!Promise.defer) { | ||||||
|     throw err |   Promise.defer = function() { | ||||||
|   } |     let obj = {} | ||||||
| 
 |     obj.promise = new Promise((resolve, reject) => { | ||||||
|   function done(callback) { |       obj.resolve = resolve | ||||||
|     return this.then(callback, _no) |       obj.reject = reject | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   function fail(callback) { |  | ||||||
|     return this.then(_yes, callback) |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   function defer() { |  | ||||||
|     var obj = {} |  | ||||||
|     obj.promise = new _Promise(function(yes, no) { |  | ||||||
|       obj.resolve = yes |  | ||||||
|       obj.reject = no |  | ||||||
|     }) |     }) | ||||||
|     return obj |     return obj | ||||||
|   } |   } | ||||||
| 
 |  | ||||||
|   //成功的回调
 |  | ||||||
|   function _resolve(obj, val) { |  | ||||||
|     if (obj._state !== 'pending') { |  | ||||||
|       return |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (val && typeof val.then === 'function') { |  | ||||||
|       var method = val instanceof _Promise ? '_then' : 'then' |  | ||||||
|       val[method]( |  | ||||||
|         function(v) { |  | ||||||
|           _transmit(obj, v, true) |  | ||||||
|         }, |  | ||||||
|         function(v) { |  | ||||||
|           _transmit(obj, v, false) |  | ||||||
|         } |  | ||||||
|       ) |  | ||||||
|     } else { |  | ||||||
|       _transmit(obj, val, true) |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   //失败的回调
 |  | ||||||
|   function _reject(obj, val) { |  | ||||||
|     if (obj._state !== 'pending') { |  | ||||||
|       return |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     _transmit(obj, val, false) |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   // 改变Promise的_fired值,并保持用户传参,触发所有回调
 |  | ||||||
|   function _transmit(obj, val, isResolved) { |  | ||||||
|     obj._fired = true |  | ||||||
|     obj._val = val |  | ||||||
|     obj._state = isResolved ? 'fulfilled' : 'rejected' |  | ||||||
| 
 |  | ||||||
|     fireCallback(obj, function() { |  | ||||||
|       for (var i in obj.callback) { |  | ||||||
|         obj._fire(obj.callback[i].yes, obj.callback[i].no) |  | ||||||
|       } |  | ||||||
|     }) |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   function fireCallback(obj, callback) { |  | ||||||
|     var isAsync = false |  | ||||||
| 
 |  | ||||||
|     if (typeof obj.async === 'boolean') { |  | ||||||
|       isAsync = obj.async |  | ||||||
|     } else { |  | ||||||
|       isAsync = obj.async = true |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (isAsync) { |  | ||||||
|       setTimeout(callback, 0) |  | ||||||
|     } else { |  | ||||||
|       callback() |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   function _some(bool, iterable) { |  | ||||||
|     iterable = Array.isArray(iterable) ? iterable : [] |  | ||||||
| 
 |  | ||||||
|     var n = 0 |  | ||||||
|     var res = [] |  | ||||||
|     var end = false |  | ||||||
| 
 |  | ||||||
|     return new _Promise(function(yes, no) { |  | ||||||
|       if (!iterable.length) no(res) |  | ||||||
| 
 |  | ||||||
|       function loop(obj, idx) { |  | ||||||
|         obj.then( |  | ||||||
|           function(val) { |  | ||||||
|             if (!end) { |  | ||||||
|               res[idx] = val |  | ||||||
|               n++ |  | ||||||
|               if (bool || n >= iterable.length) { |  | ||||||
|                 yes(bool ? val : res) |  | ||||||
|                 end = true |  | ||||||
|               } |  | ||||||
|             } |  | ||||||
|           }, |  | ||||||
|           function(val) { |  | ||||||
|             end = true |  | ||||||
|             no(val) |  | ||||||
|           } |  | ||||||
|         ) |  | ||||||
|       } |  | ||||||
| 
 |  | ||||||
|       for (var i = 0, len = iterable.length; i < len; i++) { |  | ||||||
|         loop(iterable[i], i) |  | ||||||
|       } |  | ||||||
|     }) |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   //---------------------------
 |  | ||||||
|   var _Promise = function(callback) { |  | ||||||
|     this.callback = [] |  | ||||||
|     var _this = this |  | ||||||
| 
 |  | ||||||
|     if (typeof this !== 'object') { |  | ||||||
|       throw new TypeError('Promises must be constructed via new') |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (typeof callback !== 'function') { |  | ||||||
|       throw new TypeError('Argument must be a function') |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     callback( |  | ||||||
|       function(val) { |  | ||||||
|         _resolve(_this, val) |  | ||||||
|       }, |  | ||||||
|       function(val) { |  | ||||||
|         _reject(_this, val) |  | ||||||
|       } |  | ||||||
|     ) |  | ||||||
|   } |  | ||||||
|   var self = { |  | ||||||
|     _state: 1, |  | ||||||
|     _fired: 1, |  | ||||||
|     _val: 1, |  | ||||||
|     callback: 1 |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   _Promise.prototype = { |  | ||||||
|     constructor: _Promise, |  | ||||||
|     _state: 'pending', |  | ||||||
|     _fired: false, |  | ||||||
|     _fire: function(yes, no) { |  | ||||||
|       if (this._state === 'rejected') { |  | ||||||
|         if (typeof no === 'function') no(this._val) |  | ||||||
|         else throw this._val |  | ||||||
|       } else { |  | ||||||
|         if (typeof yes === 'function') yes(this._val) |  | ||||||
|       } |  | ||||||
|     }, |  | ||||||
|     _then: function(yes, no) { |  | ||||||
|       if (this._fired) { |  | ||||||
|         var _this = this |  | ||||||
|         fireCallback(_this, function() { |  | ||||||
|           _this._fire(yes, no) |  | ||||||
|         }) |  | ||||||
|       } else { |  | ||||||
|         this.callback.push({ yes: yes, no: no }) |  | ||||||
|       } |  | ||||||
|     }, |  | ||||||
|     then: function(yes, no) { |  | ||||||
|       yes = typeof yes === 'function' ? yes : _yes |  | ||||||
|       no = typeof no === 'function' ? no : _no |  | ||||||
|       var _this = this |  | ||||||
|       var next = new _Promise(function(resolve, reject) { |  | ||||||
|         _this._then( |  | ||||||
|           function(val) { |  | ||||||
|             try { |  | ||||||
|               val = yes(val) |  | ||||||
|             } catch (err) { |  | ||||||
|               return reject(err) |  | ||||||
|             } |  | ||||||
|             resolve(val) |  | ||||||
|           }, |  | ||||||
|           function(val) { |  | ||||||
|             try { |  | ||||||
|               val = no(val) |  | ||||||
|             } catch (err) { |  | ||||||
|               return reject(err) |  | ||||||
|             } |  | ||||||
|             resolve(val) |  | ||||||
|           } |  | ||||||
|         ) |  | ||||||
|       }) |  | ||||||
|       for (var i in _this) { |  | ||||||
|         if (!self[i]) next[i] = _this[i] |  | ||||||
|       } |  | ||||||
|       return next |  | ||||||
|     }, |  | ||||||
|     done: done, |  | ||||||
|     catch: fail, |  | ||||||
|     fail: fail |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   _Promise.all = function(arr) { |  | ||||||
|     return _some(false, arr) |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   _Promise.race = function(arr) { |  | ||||||
|     return _some(true, arr) |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   _Promise.defer = defer |  | ||||||
| 
 |  | ||||||
|   _Promise.resolve = function(val) { |  | ||||||
|     var obj = this.defer() |  | ||||||
|     obj.resolve(val) |  | ||||||
|     return obj.promise |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   _Promise.reject = function(val) { |  | ||||||
|     var obj = this.defer() |  | ||||||
|     obj.reject(val) |  | ||||||
|     return obj.promise |  | ||||||
|   } |  | ||||||
|   if (/native code/.test(nativePromise)) { |  | ||||||
|     nativePromise.prototype.done = done |  | ||||||
|     nativePromise.prototype.fail = fail |  | ||||||
|     if (!nativePromise.defer) { |  | ||||||
|       nativePromise.defer = defer |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|   window.Promise = nativePromise || _Promise |  | ||||||
| })(window.Promise) |  | ||||||
| 
 |  | ||||||
| if (!Object.assign) { |  | ||||||
|   Object.defineProperty(Object, 'assign', { |  | ||||||
|     enumerable: false, |  | ||||||
|     value: function(target, first) { |  | ||||||
|       'use strict' |  | ||||||
|       if (target === undefined || target === null) |  | ||||||
|         throw new TypeError('Can not convert first argument to object') |  | ||||||
| 
 |  | ||||||
|       var to = Object(target) |  | ||||||
|       for (var i = 0, len = arguments.length; i < len; i++) { |  | ||||||
|         var next = arguments[i] |  | ||||||
|         if (next === undefined || next === null) continue |  | ||||||
| 
 |  | ||||||
|         var keys = Object.keys(Object(next)) |  | ||||||
|         for (var j = 0, n = keys.length; j < n; j++) { |  | ||||||
|           var key = keys[j] |  | ||||||
|           var desc = Object.getOwnPropertyDescriptor(next, key) |  | ||||||
|           if (desc !== undefined && desc.enumerable) to[key] = next[key] |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
|       return to |  | ||||||
|     } |  | ||||||
|   }) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| if (!Array.from) { |  | ||||||
|   Object.defineProperty(Array, 'from', { |  | ||||||
|     enumerable: false, |  | ||||||
|     value: (function() { |  | ||||||
|       var toStr = Object.prototype.toString |  | ||||||
|       var isCallable = function(fn) { |  | ||||||
|         return ( |  | ||||||
|           typeof fn === 'function' || toStr.call(fn) === '[object Function]' |  | ||||||
|         ) |  | ||||||
|       } |  | ||||||
| 
 |  | ||||||
|       var toInt = function(val) { |  | ||||||
|         var num = val - 0 |  | ||||||
|         if (isNaN(num)) return 0 |  | ||||||
| 
 |  | ||||||
|         if (num === 0 || isFinite(num)) return num |  | ||||||
| 
 |  | ||||||
|         return (num > 0 ? 1 : -1) * Math.floor(Math.abs(num)) |  | ||||||
|       } |  | ||||||
|       var maxInt = Math.pow(2, 53) - 1 |  | ||||||
|       var toLen = function(val) { |  | ||||||
|         var len = toInt(val) |  | ||||||
|         return Math.min(Math.max(len, 0), maxInt) |  | ||||||
|       } |  | ||||||
| 
 |  | ||||||
|       return function(arrLike) { |  | ||||||
|         var _this = this |  | ||||||
|         var items = Object(arrLike) |  | ||||||
|         if (arrLike === null) |  | ||||||
|           throw new TypeError( |  | ||||||
|             'Array.from requires an array-like object - not null or undefined' |  | ||||||
|           ) |  | ||||||
| 
 |  | ||||||
|         var mapFn = arguments.length > 1 ? arguments[1] : undefined |  | ||||||
|         var other |  | ||||||
|         if (mapFn !== undefined) { |  | ||||||
|           if (!isCallable(mapFn)) |  | ||||||
|             throw new TypeError( |  | ||||||
|               'Array.from: when provided, the second argument must be a function' |  | ||||||
|             ) |  | ||||||
| 
 |  | ||||||
|           if (arguments.length > 2) other = arguments[2] |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         var len = toLen(items.length) |  | ||||||
|         var arr = isCallable(_this) ? Object(new _this(len)) : new Array(len) |  | ||||||
|         var k = 0 |  | ||||||
|         var kVal |  | ||||||
|         while (k < len) { |  | ||||||
|           kVal = items[k] |  | ||||||
|           if (mapFn) |  | ||||||
|             arr[k] = |  | ||||||
|               other === 'undefined' |  | ||||||
|                 ? mapFn(kVal, k) |  | ||||||
|                 : mapFn.call(other, kVal, k) |  | ||||||
|           else arr[k] = kVal |  | ||||||
| 
 |  | ||||||
|           k++ |  | ||||||
|         } |  | ||||||
|         arr.length = len |  | ||||||
|         return arr |  | ||||||
|       } |  | ||||||
|     })() |  | ||||||
|   }) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // 判断数组是否包含指定元素
 |  | ||||||
| if (!Array.prototype.includes) { |  | ||||||
|   Object.defineProperty(Array.prototype, 'includes', { |  | ||||||
|     value: function(val) { |  | ||||||
|       for (var i in this) { |  | ||||||
|         if (this[i] === val) return true |  | ||||||
|       } |  | ||||||
|       return false |  | ||||||
|     }, |  | ||||||
|     enumerable: false |  | ||||||
|   }) |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| //类似于Array 的splice方法
 | //类似于Array 的splice方法
 | ||||||
| if (!String.prototype.splice) { | if (!String.prototype.splice) { | ||||||
|   Object.defineProperty(String.prototype, 'splice', { |   Object.defineProperty(String.prototype, 'splice', { | ||||||
|     value: function(start, len, fill) { |     value: function(start, len, fill) { | ||||||
|       var length = this.length, |       let length = this.length | ||||||
|         argLen = arguments.length |       let argLen = arguments.length | ||||||
| 
 | 
 | ||||||
|       fill = fill === undefined ? '' : fill |       fill = fill === undefined ? '' : fill | ||||||
| 
 | 
 | ||||||
|  | @ -358,8 +30,11 @@ if (!String.prototype.splice) { | ||||||
| 
 | 
 | ||||||
|       //处理负数
 |       //处理负数
 | ||||||
|       if (start < 0) { |       if (start < 0) { | ||||||
|         if (Math.abs(start) >= length) start = 0 |         if (Math.abs(start) >= length) { | ||||||
|         else start = length + start |           start = 0 | ||||||
|  |         } else { | ||||||
|  |           start = length + start | ||||||
|  |         } | ||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|       if (argLen === 1) { |       if (argLen === 1) { | ||||||
|  | @ -367,8 +42,8 @@ if (!String.prototype.splice) { | ||||||
|       } else { |       } else { | ||||||
|         len -= 0 |         len -= 0 | ||||||
| 
 | 
 | ||||||
|         var strl = this.slice(0, start), |         let strl = this.slice(0, start) | ||||||
|           strr = this.slice(start + len) |         let strr = this.slice(start + len) | ||||||
| 
 | 
 | ||||||
|         return strl + fill + strr |         return strl + fill + strr | ||||||
|       } |       } | ||||||
|  | @ -381,10 +56,10 @@ if (!Date.prototype.getFullWeek) { | ||||||
|   //获取当天是本年度第几周
 |   //获取当天是本年度第几周
 | ||||||
|   Object.defineProperty(Date.prototype, 'getFullWeek', { |   Object.defineProperty(Date.prototype, 'getFullWeek', { | ||||||
|     value: function() { |     value: function() { | ||||||
|       var thisYear = this.getFullYear(), |       let thisYear = this.getFullYear() | ||||||
|         that = new Date(thisYear, 0, 1), |       let that = new Date(thisYear, 0, 1) | ||||||
|         firstDay = that.getDay() || 1, |       let firstDay = that.getDay() || 1 | ||||||
|         numsOfToday = (this - that) / 86400000 |       let numsOfToday = (this - that) / 86400000 | ||||||
|       return Math.ceil((numsOfToday + firstDay) / 7) |       return Math.ceil((numsOfToday + firstDay) / 7) | ||||||
|     }, |     }, | ||||||
|     enumerable: false |     enumerable: false | ||||||
|  | @ -393,10 +68,10 @@ if (!Date.prototype.getFullWeek) { | ||||||
|   //获取当天是本月第几周
 |   //获取当天是本月第几周
 | ||||||
|   Object.defineProperty(Date.prototype, 'getWeek', { |   Object.defineProperty(Date.prototype, 'getWeek', { | ||||||
|     value: function() { |     value: function() { | ||||||
|       var today = this.getDate(), |       let today = this.getDate() | ||||||
|         thisMonth = this.getMonth(), |       let thisMonth = this.getMonth() | ||||||
|         thisYear = this.getFullYear(), |       let thisYear = this.getFullYear() | ||||||
|         firstDay = new Date(thisYear, thisMonth, 1).getDay() |       let firstDay = new Date(thisYear, thisMonth, 1).getDay() | ||||||
|       return Math.ceil((today + firstDay) / 7) |       return Math.ceil((today + firstDay) / 7) | ||||||
|     }, |     }, | ||||||
|     enumerable: false |     enumerable: false | ||||||
|  | @ -417,20 +92,20 @@ if (!Date.prototype.format) { | ||||||
|   Object.defineProperty(Date.prototype, 'format', { |   Object.defineProperty(Date.prototype, 'format', { | ||||||
|     value: function(str) { |     value: function(str) { | ||||||
|       str = str || 'Y-m-d H:i:s' |       str = str || 'Y-m-d H:i:s' | ||||||
|       var week = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], |       let week = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] | ||||||
|         dt = { |       let dt = { | ||||||
|           fullyear: this.getFullYear(), |         fullyear: this.getFullYear(), | ||||||
|           year: this.getYear(), |         year: this.getYear(), | ||||||
|           fullweek: this.getFullWeek(), |         fullweek: this.getFullWeek(), | ||||||
|           week: this.getWeek(), |         week: this.getWeek(), | ||||||
|           month: this.getMonth() + 1, |         month: this.getMonth() + 1, | ||||||
|           date: this.getDate(), |         date: this.getDate(), | ||||||
|           day: week[this.getDay()], |         day: week[this.getDay()], | ||||||
|           hours: this.getHours(), |         hours: this.getHours(), | ||||||
|           minutes: this.getMinutes(), |         minutes: this.getMinutes(), | ||||||
|           seconds: this.getSeconds() |         seconds: this.getSeconds() | ||||||
|         }, |       } | ||||||
|         re |       let re | ||||||
| 
 | 
 | ||||||
|       dt.g = dt.hours > 12 ? dt.hours - 12 : dt.hours |       dt.g = dt.hours > 12 ? dt.hours - 12 : dt.hours | ||||||
| 
 | 
 | ||||||
|  | @ -452,7 +127,7 @@ if (!Date.prototype.format) { | ||||||
|         D: dt.day |         D: dt.day | ||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|       for (var i in re) { |       for (let i in re) { | ||||||
|         str = str.replace(new RegExp(i, 'g'), re[i]) |         str = str.replace(new RegExp(i, 'g'), re[i]) | ||||||
|       } |       } | ||||||
|       return str |       return str | ||||||
|  |  | ||||||
|  | @ -1,4 +1,4 @@ | ||||||
| var Anot = function(el) { | let Anot = function(el) { | ||||||
|   //创建jQuery式的无new 实例化结构
 |   //创建jQuery式的无new 实例化结构
 | ||||||
|   return new Anot.init(el) |   return new Anot.init(el) | ||||||
| } | } | ||||||
|  | @ -6,25 +6,25 @@ var Anot = function(el) { | ||||||
| /*视浏览器情况采用最快的异步回调*/ | /*视浏览器情况采用最快的异步回调*/ | ||||||
| Anot.nextTick = new function() { | Anot.nextTick = new function() { | ||||||
|   // jshint ignore:line
 |   // jshint ignore:line
 | ||||||
|   var tickImmediate = window.setImmediate |   let tickImmediate = window.setImmediate | ||||||
|   var tickObserver = window.MutationObserver |   let tickObserver = window.MutationObserver | ||||||
|   if (tickImmediate) { |   if (tickImmediate) { | ||||||
|     return tickImmediate.bind(window) |     return tickImmediate.bind(window) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   var queue = [] |   let queue = [] | ||||||
|   function callback() { |   function callback() { | ||||||
|     var n = queue.length |     let n = queue.length | ||||||
|     for (var i = 0; i < n; i++) { |     for (let i = 0; i < n; i++) { | ||||||
|       queue[i]() |       queue[i]() | ||||||
|     } |     } | ||||||
|     queue = queue.slice(n) |     queue = queue.slice(n) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   if (tickObserver) { |   if (tickObserver) { | ||||||
|     var node = document.createTextNode('anot') |     let node = document.createTextNode('anot') | ||||||
|     new tickObserver(callback).observe(node, { characterData: true }) // jshint ignore:line
 |     new tickObserver(callback).observe(node, { characterData: true }) // jshint ignore:line
 | ||||||
|     var bool = false |     let bool = false | ||||||
|     return function(fn) { |     return function(fn) { | ||||||
|       queue.push(fn) |       queue.push(fn) | ||||||
|       bool = !bool |       bool = !bool | ||||||
|  | @ -103,11 +103,11 @@ Anot.isPlainObject = function(obj) { | ||||||
|   ) |   ) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| var VMODELS = (Anot.vmodels = {}) //所有vmodel都储存在这里
 | let VMODELS = (Anot.vmodels = {}) //所有vmodel都储存在这里
 | ||||||
| Anot.init = function(source) { | Anot.init = function(source) { | ||||||
|   if (Anot.isPlainObject(source)) { |   if (Anot.isPlainObject(source)) { | ||||||
|     var $id = source.$id |     let $id = source.$id | ||||||
|     var vm = null |     let vm = null | ||||||
|     if (!$id) { |     if (!$id) { | ||||||
|       log('warning: vm必须指定id') |       log('warning: vm必须指定id') | ||||||
|     } |     } | ||||||
|  | @ -116,12 +116,12 @@ Anot.init = function(source) { | ||||||
|     VMODELS[$id] = vm |     VMODELS[$id] = vm | ||||||
| 
 | 
 | ||||||
|     Anot.nextTick(function() { |     Anot.nextTick(function() { | ||||||
|       var $elem = document.querySelector('[anot=' + vm.$id + ']') |       let $elem = document.querySelector('[anot=' + vm.$id + ']') | ||||||
|       if ($elem) { |       if ($elem) { | ||||||
|         if ($elem === DOC.body) { |         if ($elem === DOC.body) { | ||||||
|           scanTag($elem, []) |           scanTag($elem, []) | ||||||
|         } else { |         } else { | ||||||
|           var _parent = $elem |           let _parent = $elem | ||||||
|           while ((_parent = _parent.parentNode)) { |           while ((_parent = _parent.parentNode)) { | ||||||
|             if (_parent.__VM__) { |             if (_parent.__VM__) { | ||||||
|               break |               break | ||||||
|  | @ -141,7 +141,7 @@ Anot.fn = Anot.prototype = Anot.init.prototype | ||||||
| 
 | 
 | ||||||
| //与jQuery.extend方法,可用于浅拷贝,深拷贝
 | //与jQuery.extend方法,可用于浅拷贝,深拷贝
 | ||||||
| Anot.mix = Anot.fn.mix = function() { | Anot.mix = Anot.fn.mix = function() { | ||||||
|   var options, |   let options, | ||||||
|     name, |     name, | ||||||
|     src, |     src, | ||||||
|     copy, |     copy, | ||||||
|  | @ -208,7 +208,7 @@ function cacheStore(tpye, key, val) { | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   if (this.type(key) === 'object') { |   if (this.type(key) === 'object') { | ||||||
|     for (var i in key) { |     for (let i in key) { | ||||||
|       window[tpye].setItem(i, key[i]) |       window[tpye].setItem(i, key[i]) | ||||||
|     } |     } | ||||||
|     return |     return | ||||||
|  | @ -233,7 +233,7 @@ function cacheStore(tpye, key, val) { | ||||||
| /*判定是否类数组,如节点集合,纯数组,arguments与拥有非负整数的length属性的纯JS对象*/ | /*判定是否类数组,如节点集合,纯数组,arguments与拥有非负整数的length属性的纯JS对象*/ | ||||||
| function isArrayLike(obj) { | function isArrayLike(obj) { | ||||||
|   if (obj && typeof obj === 'object') { |   if (obj && typeof obj === 'object') { | ||||||
|     var n = obj.length, |     let n = obj.length, | ||||||
|       str = serialize.call(obj) |       str = serialize.call(obj) | ||||||
|     if (/(Array|List|Collection|Map|Arguments)\]$/.test(str)) { |     if (/(Array|List|Collection|Map|Arguments)\]$/.test(str)) { | ||||||
|       return true |       return true | ||||||
|  | @ -275,7 +275,7 @@ Anot.mix({ | ||||||
|       end = start || 0 |       end = start || 0 | ||||||
|       start = 0 |       start = 0 | ||||||
|     } |     } | ||||||
|     var index = -1, |     let index = -1, | ||||||
|       length = Math.max(0, Math.ceil((end - start) / step)), |       length = Math.max(0, Math.ceil((end - start) / step)), | ||||||
|       result = new Array(length) |       result = new Array(length) | ||||||
|     while (++index < length) { |     while (++index < length) { | ||||||
|  | @ -288,11 +288,11 @@ Anot.mix({ | ||||||
|   eventHooks: {}, |   eventHooks: {}, | ||||||
|   /*绑定事件*/ |   /*绑定事件*/ | ||||||
|   bind: function(el, type, fn, phase) { |   bind: function(el, type, fn, phase) { | ||||||
|     var hooks = Anot.eventHooks |     let hooks = Anot.eventHooks | ||||||
|     type = type.split(',') |     type = type.split(',') | ||||||
|     Anot.each(type, function(i, t) { |     Anot.each(type, function(i, t) { | ||||||
|       t = t.trim() |       t = t.trim() | ||||||
|       var hook = hooks[t] |       let hook = hooks[t] | ||||||
|       if (typeof hook === 'object') { |       if (typeof hook === 'object') { | ||||||
|         type = hook.type || type |         type = hook.type || type | ||||||
|         phase = hook.phase || !!phase |         phase = hook.phase || !!phase | ||||||
|  | @ -304,12 +304,12 @@ Anot.mix({ | ||||||
|   }, |   }, | ||||||
|   /*卸载事件*/ |   /*卸载事件*/ | ||||||
|   unbind: function(el, type, fn, phase) { |   unbind: function(el, type, fn, phase) { | ||||||
|     var hooks = Anot.eventHooks |     let hooks = Anot.eventHooks | ||||||
|     type = type.split(',') |     type = type.split(',') | ||||||
|     fn = fn || noop |     fn = fn || noop | ||||||
|     Anot.each(type, function(i, t) { |     Anot.each(type, function(i, t) { | ||||||
|       t = t.trim() |       t = t.trim() | ||||||
|       var hook = hooks[t] |       let hook = hooks[t] | ||||||
|       if (typeof hook === 'object') { |       if (typeof hook === 'object') { | ||||||
|         type = hook.type || type |         type = hook.type || type | ||||||
|         phase = hook.phase || !!phase |         phase = hook.phase || !!phase | ||||||
|  | @ -322,7 +322,7 @@ Anot.mix({ | ||||||
|     if (node instanceof Anot) { |     if (node instanceof Anot) { | ||||||
|       node = node[0] |       node = node[0] | ||||||
|     } |     } | ||||||
|     var prop = /[_-]/.test(name) ? camelize(name) : name, |     let prop = /[_-]/.test(name) ? camelize(name) : name, | ||||||
|       fn |       fn | ||||||
|     name = Anot.cssName(prop) || prop |     name = Anot.cssName(prop) || prop | ||||||
|     if (value === void 0 || typeof value === 'boolean') { |     if (value === void 0 || typeof value === 'boolean') { | ||||||
|  | @ -331,7 +331,7 @@ Anot.mix({ | ||||||
|       if (name === 'background') { |       if (name === 'background') { | ||||||
|         name = 'backgroundColor' |         name = 'backgroundColor' | ||||||
|       } |       } | ||||||
|       var val = fn(node, name) |       let val = fn(node, name) | ||||||
|       return value === true ? parseFloat(val) || 0 : val |       return value === true ? parseFloat(val) || 0 : val | ||||||
|     } else if (value === '') { |     } else if (value === '') { | ||||||
|       //请除样式
 |       //请除样式
 | ||||||
|  | @ -352,9 +352,9 @@ Anot.mix({ | ||||||
|   each: function(obj, fn) { |   each: function(obj, fn) { | ||||||
|     if (obj) { |     if (obj) { | ||||||
|       //排除null, undefined
 |       //排除null, undefined
 | ||||||
|       var i = 0 |       let i = 0 | ||||||
|       if (isArrayLike(obj)) { |       if (isArrayLike(obj)) { | ||||||
|         for (var n = obj.length; i < n; i++) { |         for (let n = obj.length; i < n; i++) { | ||||||
|           if (fn(i, obj[i]) === false) break |           if (fn(i, obj[i]) === false) break | ||||||
|         } |         } | ||||||
|       } else { |       } else { | ||||||
|  | @ -379,7 +379,7 @@ Anot.mix({ | ||||||
|     }, |     }, | ||||||
|     /*移除数组中第一个匹配传参的那个元素,返回布尔表示成功与否*/ |     /*移除数组中第一个匹配传参的那个元素,返回布尔表示成功与否*/ | ||||||
|     remove: function(target, item) { |     remove: function(target, item) { | ||||||
|       var index = target.indexOf(item) |       let index = target.indexOf(item) | ||||||
|       if (~index) return Anot.Array.removeAt(target, index) |       if (~index) return Anot.Array.removeAt(target, index) | ||||||
|       return false |       return false | ||||||
|     } |     } | ||||||
|  | @ -391,12 +391,12 @@ Anot.mix({ | ||||||
|    * @return |    * @return | ||||||
|    */ |    */ | ||||||
|   ls: function() { |   ls: function() { | ||||||
|     var args = aslice.call(arguments, 0) |     let args = aslice.call(arguments, 0) | ||||||
|     args.unshift('localStorage') |     args.unshift('localStorage') | ||||||
|     return cacheStore.apply(this, args) |     return cacheStore.apply(this, args) | ||||||
|   }, |   }, | ||||||
|   ss: function() { |   ss: function() { | ||||||
|     var args = aslice.call(arguments, 0) |     let args = aslice.call(arguments, 0) | ||||||
|     args.unshift('sessionStorage') |     args.unshift('sessionStorage') | ||||||
|     return cacheStore.apply(this, args) |     return cacheStore.apply(this, args) | ||||||
|   }, |   }, | ||||||
|  | @ -483,16 +483,16 @@ Anot.mix({ | ||||||
|   //获取url的参数
 |   //获取url的参数
 | ||||||
|   search: function(key) { |   search: function(key) { | ||||||
|     key += '' |     key += '' | ||||||
|     var uri = location.search |     let uri = location.search | ||||||
| 
 | 
 | ||||||
|     if (!key || !uri) return null |     if (!key || !uri) return null | ||||||
| 
 | 
 | ||||||
|     uri = uri.slice(1) |     uri = uri.slice(1) | ||||||
|     uri = uri.split('&') |     uri = uri.split('&') | ||||||
| 
 | 
 | ||||||
|     var obj = {} |     let obj = {} | ||||||
|     for (var i = 0, item; (item = uri[i++]); ) { |     for (let i = 0, item; (item = uri[i++]); ) { | ||||||
|       var tmp = item.split('=') |       let tmp = item.split('=') | ||||||
|       tmp[1] = tmp.length < 2 ? null : tmp[1] |       tmp[1] = tmp.length < 2 ? null : tmp[1] | ||||||
|       tmp[1] = decodeURIComponent(tmp[1]) |       tmp[1] = decodeURIComponent(tmp[1]) | ||||||
|       if (obj.hasOwnProperty(tmp[0])) { |       if (obj.hasOwnProperty(tmp[0])) { | ||||||
|  | @ -514,7 +514,7 @@ Anot.mix({ | ||||||
|       return log('该浏览器不支持复制到粘贴板') |       return log('该浏览器不支持复制到粘贴板') | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     var ta = DOC.createElement('textarea') |     let ta = DOC.createElement('textarea') | ||||||
|     ta.textContent = txt |     ta.textContent = txt | ||||||
|     ta.style.position = 'fixed' |     ta.style.position = 'fixed' | ||||||
|     ta.style.bottom = '-1000px' |     ta.style.bottom = '-1000px' | ||||||
|  | @ -529,10 +529,10 @@ Anot.mix({ | ||||||
|   } |   } | ||||||
| }) | }) | ||||||
| 
 | 
 | ||||||
| var bindingHandlers = (Anot.bindingHandlers = {}) | let bindingHandlers = (Anot.bindingHandlers = {}) | ||||||
| var bindingExecutors = (Anot.bindingExecutors = {}) | let bindingExecutors = (Anot.bindingExecutors = {}) | ||||||
| 
 | 
 | ||||||
| var directives = (Anot.directives = {}) | let directives = (Anot.directives = {}) | ||||||
| Anot.directive = function(name, obj) { | Anot.directive = function(name, obj) { | ||||||
|   bindingHandlers[name] = obj.init = obj.init || noop |   bindingHandlers[name] = obj.init = obj.init || noop | ||||||
|   bindingExecutors[name] = obj.update = obj.update || noop |   bindingExecutors[name] = obj.update = obj.update || noop | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| // https://github.com/rsms/js-lru
 | // https://github.com/rsms/js-lru
 | ||||||
| var Cache = new function() { | let Cache = new function() { | ||||||
|   // jshint ignore:line
 |   // jshint ignore:line
 | ||||||
|   function LRU(maxLength) { |   function LRU(maxLength) { | ||||||
|     this.size = 0 |     this.size = 0 | ||||||
|  | @ -8,10 +8,10 @@ var Cache = new function() { | ||||||
|     this._keymap = {} |     this._keymap = {} | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   var p = LRU.prototype |   let p = LRU.prototype | ||||||
| 
 | 
 | ||||||
|   p.put = function(key, value) { |   p.put = function(key, value) { | ||||||
|     var entry = { |     let entry = { | ||||||
|       key: key, |       key: key, | ||||||
|       value: value |       value: value | ||||||
|     } |     } | ||||||
|  | @ -32,7 +32,7 @@ var Cache = new function() { | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   p.shift = function() { |   p.shift = function() { | ||||||
|     var entry = this.head |     let entry = this.head | ||||||
|     if (entry) { |     if (entry) { | ||||||
|       this.head = this.head.newer |       this.head = this.head.newer | ||||||
|       this.head.older = entry.newer = entry.older = this._keymap[ |       this.head.older = entry.newer = entry.older = this._keymap[ | ||||||
|  | @ -42,7 +42,7 @@ var Cache = new function() { | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   p.get = function(key) { |   p.get = function(key) { | ||||||
|     var entry = this._keymap[key] |     let entry = this._keymap[key] | ||||||
|     if (entry === void 0) return |     if (entry === void 0) return | ||||||
|     if (entry === this.tail) { |     if (entry === this.tail) { | ||||||
|       return entry.value |       return entry.value | ||||||
|  |  | ||||||
|  | @ -18,18 +18,18 @@ Anot.contains = function(root, el) { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| if (window.SVGElement) { | if (window.SVGElement) { | ||||||
|   var svgns = 'http://www.w3.org/2000/svg' |   let svgns = 'http://www.w3.org/2000/svg' | ||||||
|   var svg = DOC.createElementNS(svgns, 'svg') |   let svg = DOC.createElementNS(svgns, 'svg') | ||||||
|   svg.innerHTML = '<circle cx="50" cy="50" r="40" fill="red" />' |   svg.innerHTML = '<circle cx="50" cy="50" r="40" fill="red" />' | ||||||
|   if (!rsvg.test(svg.firstChild)) { |   if (!rsvg.test(svg.firstChild)) { | ||||||
|     // #409
 |     // #409
 | ||||||
|     /* jshint ignore:start */ |     /* jshint ignore:start */ | ||||||
|     function enumerateNode(node, targetNode) { |     function enumerateNode(node, targetNode) { | ||||||
|       if (node && node.childNodes) { |       if (node && node.childNodes) { | ||||||
|         var nodes = node.childNodes |         let nodes = node.childNodes | ||||||
|         for (var i = 0, el; (el = nodes[i++]); ) { |         for (let i = 0, el; (el = nodes[i++]); ) { | ||||||
|           if (el.tagName) { |           if (el.tagName) { | ||||||
|             var svg = DOC.createElementNS(svgns, el.tagName.toLowerCase()) |             let svg = DOC.createElementNS(svgns, el.tagName.toLowerCase()) | ||||||
|             // copy attrs
 |             // copy attrs
 | ||||||
|             ap.forEach.call(el.attributes, function(attr) { |             ap.forEach.call(el.attributes, function(attr) { | ||||||
|               svg.setAttribute(attr.name, attr.value) |               svg.setAttribute(attr.name, attr.value) | ||||||
|  | @ -51,7 +51,7 @@ if (window.SVGElement) { | ||||||
|           return new XMLSerializer().serializeToString(this) |           return new XMLSerializer().serializeToString(this) | ||||||
|         }, |         }, | ||||||
|         set: function(html) { |         set: function(html) { | ||||||
|           var tagName = this.tagName.toLowerCase(), |           let tagName = this.tagName.toLowerCase(), | ||||||
|             par = this.parentNode, |             par = this.parentNode, | ||||||
|             frag = Anot.parseHTML(html) |             frag = Anot.parseHTML(html) | ||||||
|           // 操作的svg,直接插入
 |           // 操作的svg,直接插入
 | ||||||
|  | @ -59,7 +59,7 @@ if (window.SVGElement) { | ||||||
|             par.insertBefore(frag, this) |             par.insertBefore(frag, this) | ||||||
|             // svg节点的子节点类似
 |             // svg节点的子节点类似
 | ||||||
|           } else { |           } else { | ||||||
|             var newFrag = DOC.createDocumentFragment() |             let newFrag = DOC.createDocumentFragment() | ||||||
|             enumerateNode(frag, newFrag) |             enumerateNode(frag, newFrag) | ||||||
|             par.insertBefore(newFrag, this) |             par.insertBefore(newFrag, this) | ||||||
|           } |           } | ||||||
|  | @ -70,18 +70,18 @@ if (window.SVGElement) { | ||||||
|         enumerable: true, |         enumerable: true, | ||||||
|         configurable: true, |         configurable: true, | ||||||
|         get: function() { |         get: function() { | ||||||
|           var s = this.outerHTML |           let s = this.outerHTML | ||||||
|           var ropen = new RegExp( |           let ropen = new RegExp( | ||||||
|             '<' + this.nodeName + '\\b(?:(["\'])[^"]*?(\\1)|[^>])*>', |             '<' + this.nodeName + '\\b(?:(["\'])[^"]*?(\\1)|[^>])*>', | ||||||
|             'i' |             'i' | ||||||
|           ) |           ) | ||||||
|           var rclose = new RegExp('</' + this.nodeName + '>$', 'i') |           let rclose = new RegExp('</' + this.nodeName + '>$', 'i') | ||||||
|           return s.replace(ropen, '').replace(rclose, '') |           return s.replace(ropen, '').replace(rclose, '') | ||||||
|         }, |         }, | ||||||
|         set: function(html) { |         set: function(html) { | ||||||
|           if (Anot.clearHTML) { |           if (Anot.clearHTML) { | ||||||
|             Anot.clearHTML(this) |             Anot.clearHTML(this) | ||||||
|             var frag = Anot.parseHTML(html) |             let frag = Anot.parseHTML(html) | ||||||
|             enumerateNode(frag, this) |             enumerateNode(frag, this) | ||||||
|           } |           } | ||||||
|         } |         } | ||||||
|  | @ -92,7 +92,7 @@ if (window.SVGElement) { | ||||||
| 
 | 
 | ||||||
| //========================= event binding ====================
 | //========================= event binding ====================
 | ||||||
| 
 | 
 | ||||||
| var eventHooks = Anot.eventHooks | let eventHooks = Anot.eventHooks | ||||||
| 
 | 
 | ||||||
| //针对firefox, chrome修正mouseenter, mouseleave(chrome30+)
 | //针对firefox, chrome修正mouseenter, mouseleave(chrome30+)
 | ||||||
| if (!('onmouseenter' in root)) { | if (!('onmouseenter' in root)) { | ||||||
|  | @ -106,7 +106,7 @@ if (!('onmouseenter' in root)) { | ||||||
|         type: fixType, |         type: fixType, | ||||||
|         fix: function(elem, fn) { |         fix: function(elem, fn) { | ||||||
|           return function(e) { |           return function(e) { | ||||||
|             var t = e.relatedTarget |             let t = e.relatedTarget | ||||||
|             if (!t || (t !== elem && !(elem.compareDocumentPosition(t) & 16))) { |             if (!t || (t !== elem && !(elem.compareDocumentPosition(t) & 16))) { | ||||||
|               delete e.type |               delete e.type | ||||||
|               e.type = origType |               e.type = origType | ||||||
|  |  | ||||||
		Reference in New Issue
	
	 宇天
						宇天