From 76ced919e0ed33da36a0a7e8c19e2eeb30c35de5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=87=E5=A4=A9?= Date: Mon, 28 Jan 2019 15:22:05 +0800 Subject: [PATCH] 2.0 --- readme.md | 13 +- src/00-generate.js | 46 ++--- src/01-profill.js | 401 +++++--------------------------------------- src/02-core.js | 72 ++++---- src/03-cache.js | 10 +- src/04-dom.patch.js | 26 +-- 6 files changed, 120 insertions(+), 448 deletions(-) diff --git a/readme.md b/readme.md index 5ea8cde..e519c49 100644 --- a/readme.md +++ b/readme.md @@ -1,6 +1,7 @@ -## Anot.js +## Anot.js 2.x > Anot 是Anot not only templateEngine的缩写。 它是一款迷你,易用、高性能的前端MVVM框架, fork于avalon。进行了大量的重构,精简部分冗余的API, 同时针对组件拓展进行了优化。 +>> 2.x版本为 全新版本, 只兼容支持type="module"的浏览器。 ```bash # 开发模式 @@ -12,13 +13,9 @@ npm start # 打包 npm run prod ``` -执行完, 会打包为6个版本, 分别是 -- anot.js 普通版(可用于webpack) -- anot-touch.js 普通带触摸版(可用于webpack) -- anot.shim.js 自带AMD加载版 -- anot-touch.shim.js 自带AMD加载带触摸版 -- anot.next.js 未来版(需要支持es6 module的现代浏览器) -- anot-touch.next.js 带触摸的未来版(需要支持es6 module的现代浏览器) +执行完, 会打包为2个版本, 分别是 +- anot.js 普通版(需要支持es6 module的现代浏览器) +- anot-touch.js 带触摸的版本(需要支持es6 module的现代浏览器) ### 文档: diff --git a/src/00-generate.js b/src/00-generate.js index f9e3f3b..d0c65e9 100644 --- a/src/00-generate.js +++ b/src/00-generate.js @@ -1,20 +1,20 @@ /********************************************************************* * 全局变量及方法 * **********************************************************************/ -var bindingID = 1024 -var IEVersion = 0 +let bindingID = 1024 +let IEVersion = 0 if (window.VBArray) { 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 -var DOC = window.document -var head = DOC.head //HEAD元素 +let DOC = window.document +let head = DOC.head //HEAD元素 head.insertAdjacentHTML( 'afterBegin', '' ) -var ifGroup = head.firstChild +let ifGroup = head.firstChild function log() { // http://stackoverflow.com/questions/8785624/how-to-safely-wrap-console-log @@ -34,22 +34,22 @@ function createMap() { return Object.create(null) } -var subscribers = '$' + expose +let subscribers = '$' + expose -var nullObject = {} //作用类似于noop,只用于代码防御,千万不要在它上面添加属性 -var rword = /[^, ]+/g //切割字符串为一个个小块,以空格或豆号分开它们,结合replace实现字符串的forEach -var rw20g = /\w+/g -var rsvg = /^\[object SVG\w*Element\]$/ -var oproto = Object.prototype -var ohasOwn = oproto.hasOwnProperty -var serialize = oproto.toString -var ap = Array.prototype -var aslice = ap.slice -var W3C = window.dispatchEvent -var root = DOC.documentElement -var anotFragment = DOC.createDocumentFragment() -var cinerator = DOC.createElement('div') -var class2type = { +let nullObject = {} //作用类似于noop,只用于代码防御,千万不要在它上面添加属性 +let rword = /[^, ]+/g //切割字符串为一个个小块,以空格或豆号分开它们,结合replace实现字符串的forEach +let rw20g = /\w+/g +let rsvg = /^\[object SVG\w*Element\]$/ +let oproto = Object.prototype +let ohasOwn = oproto.hasOwnProperty +let serialize = oproto.toString +let ap = Array.prototype +let aslice = ap.slice +let W3C = window.dispatchEvent +let root = DOC.documentElement +let anotFragment = DOC.createDocumentFragment() +let cinerator = DOC.createElement('div') +let class2type = { '[object Boolean]': 'boolean', '[object Number]': 'number', '[object String]': 'string', @@ -74,9 +74,9 @@ function oneObject(array, val) { if (typeof array === 'string') { array = array.match(rword) || [] } - var result = {}, + let result = {}, 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 } return result diff --git a/src/01-profill.js b/src/01-profill.js index 56590e4..bf862f9 100644 --- a/src/01-profill.js +++ b/src/01-profill.js @@ -3,352 +3,24 @@ // =============================== // ========== Promise ============ // =============================== -;(function(nativePromise) { - function _yes(val) { - return val - } - function _no(err) { - throw err - } - - function done(callback) { - return this.then(callback, _no) - } - - 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 +if (!Promise.defer) { + Promise.defer = function() { + let obj = {} + obj.promise = new Promise((resolve, reject) => { + obj.resolve = resolve + obj.reject = reject }) 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方法 if (!String.prototype.splice) { Object.defineProperty(String.prototype, 'splice', { value: function(start, len, fill) { - var length = this.length, - argLen = arguments.length + let length = this.length + let argLen = arguments.length fill = fill === undefined ? '' : fill @@ -358,8 +30,11 @@ if (!String.prototype.splice) { //处理负数 if (start < 0) { - if (Math.abs(start) >= length) start = 0 - else start = length + start + if (Math.abs(start) >= length) { + start = 0 + } else { + start = length + start + } } if (argLen === 1) { @@ -367,8 +42,8 @@ if (!String.prototype.splice) { } else { len -= 0 - var strl = this.slice(0, start), - strr = this.slice(start + len) + let strl = this.slice(0, start) + let strr = this.slice(start + len) return strl + fill + strr } @@ -381,10 +56,10 @@ if (!Date.prototype.getFullWeek) { //获取当天是本年度第几周 Object.defineProperty(Date.prototype, 'getFullWeek', { value: function() { - var thisYear = this.getFullYear(), - that = new Date(thisYear, 0, 1), - firstDay = that.getDay() || 1, - numsOfToday = (this - that) / 86400000 + let thisYear = this.getFullYear() + let that = new Date(thisYear, 0, 1) + let firstDay = that.getDay() || 1 + let numsOfToday = (this - that) / 86400000 return Math.ceil((numsOfToday + firstDay) / 7) }, enumerable: false @@ -393,10 +68,10 @@ if (!Date.prototype.getFullWeek) { //获取当天是本月第几周 Object.defineProperty(Date.prototype, 'getWeek', { value: function() { - var today = this.getDate(), - thisMonth = this.getMonth(), - thisYear = this.getFullYear(), - firstDay = new Date(thisYear, thisMonth, 1).getDay() + let today = this.getDate() + let thisMonth = this.getMonth() + let thisYear = this.getFullYear() + let firstDay = new Date(thisYear, thisMonth, 1).getDay() return Math.ceil((today + firstDay) / 7) }, enumerable: false @@ -417,20 +92,20 @@ if (!Date.prototype.format) { Object.defineProperty(Date.prototype, 'format', { value: function(str) { str = str || 'Y-m-d H:i:s' - var week = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], - dt = { - fullyear: this.getFullYear(), - year: this.getYear(), - fullweek: this.getFullWeek(), - week: this.getWeek(), - month: this.getMonth() + 1, - date: this.getDate(), - day: week[this.getDay()], - hours: this.getHours(), - minutes: this.getMinutes(), - seconds: this.getSeconds() - }, - re + let week = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] + let dt = { + fullyear: this.getFullYear(), + year: this.getYear(), + fullweek: this.getFullWeek(), + week: this.getWeek(), + month: this.getMonth() + 1, + date: this.getDate(), + day: week[this.getDay()], + hours: this.getHours(), + minutes: this.getMinutes(), + seconds: this.getSeconds() + } + let re dt.g = dt.hours > 12 ? dt.hours - 12 : dt.hours @@ -452,7 +127,7 @@ if (!Date.prototype.format) { D: dt.day } - for (var i in re) { + for (let i in re) { str = str.replace(new RegExp(i, 'g'), re[i]) } return str diff --git a/src/02-core.js b/src/02-core.js index 7e870a3..3996328 100644 --- a/src/02-core.js +++ b/src/02-core.js @@ -1,4 +1,4 @@ -var Anot = function(el) { +let Anot = function(el) { //创建jQuery式的无new 实例化结构 return new Anot.init(el) } @@ -6,25 +6,25 @@ var Anot = function(el) { /*视浏览器情况采用最快的异步回调*/ Anot.nextTick = new function() { // jshint ignore:line - var tickImmediate = window.setImmediate - var tickObserver = window.MutationObserver + let tickImmediate = window.setImmediate + let tickObserver = window.MutationObserver if (tickImmediate) { return tickImmediate.bind(window) } - var queue = [] + let queue = [] function callback() { - var n = queue.length - for (var i = 0; i < n; i++) { + let n = queue.length + for (let i = 0; i < n; i++) { queue[i]() } queue = queue.slice(n) } if (tickObserver) { - var node = document.createTextNode('anot') + let node = document.createTextNode('anot') new tickObserver(callback).observe(node, { characterData: true }) // jshint ignore:line - var bool = false + let bool = false return function(fn) { queue.push(fn) bool = !bool @@ -103,11 +103,11 @@ Anot.isPlainObject = function(obj) { ) } -var VMODELS = (Anot.vmodels = {}) //所有vmodel都储存在这里 +let VMODELS = (Anot.vmodels = {}) //所有vmodel都储存在这里 Anot.init = function(source) { if (Anot.isPlainObject(source)) { - var $id = source.$id - var vm = null + let $id = source.$id + let vm = null if (!$id) { log('warning: vm必须指定id') } @@ -116,12 +116,12 @@ Anot.init = function(source) { VMODELS[$id] = vm Anot.nextTick(function() { - var $elem = document.querySelector('[anot=' + vm.$id + ']') + let $elem = document.querySelector('[anot=' + vm.$id + ']') if ($elem) { if ($elem === DOC.body) { scanTag($elem, []) } else { - var _parent = $elem + let _parent = $elem while ((_parent = _parent.parentNode)) { if (_parent.__VM__) { break @@ -141,7 +141,7 @@ Anot.fn = Anot.prototype = Anot.init.prototype //与jQuery.extend方法,可用于浅拷贝,深拷贝 Anot.mix = Anot.fn.mix = function() { - var options, + let options, name, src, copy, @@ -208,7 +208,7 @@ function cacheStore(tpye, key, val) { } if (this.type(key) === 'object') { - for (var i in key) { + for (let i in key) { window[tpye].setItem(i, key[i]) } return @@ -233,7 +233,7 @@ function cacheStore(tpye, key, val) { /*判定是否类数组,如节点集合,纯数组,arguments与拥有非负整数的length属性的纯JS对象*/ function isArrayLike(obj) { if (obj && typeof obj === 'object') { - var n = obj.length, + let n = obj.length, str = serialize.call(obj) if (/(Array|List|Collection|Map|Arguments)\]$/.test(str)) { return true @@ -275,7 +275,7 @@ Anot.mix({ end = start || 0 start = 0 } - var index = -1, + let index = -1, length = Math.max(0, Math.ceil((end - start) / step)), result = new Array(length) while (++index < length) { @@ -288,11 +288,11 @@ Anot.mix({ eventHooks: {}, /*绑定事件*/ bind: function(el, type, fn, phase) { - var hooks = Anot.eventHooks + let hooks = Anot.eventHooks type = type.split(',') Anot.each(type, function(i, t) { t = t.trim() - var hook = hooks[t] + let hook = hooks[t] if (typeof hook === 'object') { type = hook.type || type phase = hook.phase || !!phase @@ -304,12 +304,12 @@ Anot.mix({ }, /*卸载事件*/ unbind: function(el, type, fn, phase) { - var hooks = Anot.eventHooks + let hooks = Anot.eventHooks type = type.split(',') fn = fn || noop Anot.each(type, function(i, t) { t = t.trim() - var hook = hooks[t] + let hook = hooks[t] if (typeof hook === 'object') { type = hook.type || type phase = hook.phase || !!phase @@ -322,7 +322,7 @@ Anot.mix({ if (node instanceof Anot) { node = node[0] } - var prop = /[_-]/.test(name) ? camelize(name) : name, + let prop = /[_-]/.test(name) ? camelize(name) : name, fn name = Anot.cssName(prop) || prop if (value === void 0 || typeof value === 'boolean') { @@ -331,7 +331,7 @@ Anot.mix({ if (name === 'background') { name = 'backgroundColor' } - var val = fn(node, name) + let val = fn(node, name) return value === true ? parseFloat(val) || 0 : val } else if (value === '') { //请除样式 @@ -352,9 +352,9 @@ Anot.mix({ each: function(obj, fn) { if (obj) { //排除null, undefined - var i = 0 + let i = 0 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 } } else { @@ -379,7 +379,7 @@ Anot.mix({ }, /*移除数组中第一个匹配传参的那个元素,返回布尔表示成功与否*/ remove: function(target, item) { - var index = target.indexOf(item) + let index = target.indexOf(item) if (~index) return Anot.Array.removeAt(target, index) return false } @@ -391,12 +391,12 @@ Anot.mix({ * @return */ ls: function() { - var args = aslice.call(arguments, 0) + let args = aslice.call(arguments, 0) args.unshift('localStorage') return cacheStore.apply(this, args) }, ss: function() { - var args = aslice.call(arguments, 0) + let args = aslice.call(arguments, 0) args.unshift('sessionStorage') return cacheStore.apply(this, args) }, @@ -483,16 +483,16 @@ Anot.mix({ //获取url的参数 search: function(key) { key += '' - var uri = location.search + let uri = location.search if (!key || !uri) return null uri = uri.slice(1) uri = uri.split('&') - var obj = {} - for (var i = 0, item; (item = uri[i++]); ) { - var tmp = item.split('=') + let obj = {} + for (let i = 0, item; (item = uri[i++]); ) { + let tmp = item.split('=') tmp[1] = tmp.length < 2 ? null : tmp[1] tmp[1] = decodeURIComponent(tmp[1]) if (obj.hasOwnProperty(tmp[0])) { @@ -514,7 +514,7 @@ Anot.mix({ return log('该浏览器不支持复制到粘贴板') } - var ta = DOC.createElement('textarea') + let ta = DOC.createElement('textarea') ta.textContent = txt ta.style.position = 'fixed' ta.style.bottom = '-1000px' @@ -529,10 +529,10 @@ Anot.mix({ } }) -var bindingHandlers = (Anot.bindingHandlers = {}) -var bindingExecutors = (Anot.bindingExecutors = {}) +let bindingHandlers = (Anot.bindingHandlers = {}) +let bindingExecutors = (Anot.bindingExecutors = {}) -var directives = (Anot.directives = {}) +let directives = (Anot.directives = {}) Anot.directive = function(name, obj) { bindingHandlers[name] = obj.init = obj.init || noop bindingExecutors[name] = obj.update = obj.update || noop diff --git a/src/03-cache.js b/src/03-cache.js index fc01d26..305b1a6 100644 --- a/src/03-cache.js +++ b/src/03-cache.js @@ -1,5 +1,5 @@ // https://github.com/rsms/js-lru -var Cache = new function() { +let Cache = new function() { // jshint ignore:line function LRU(maxLength) { this.size = 0 @@ -8,10 +8,10 @@ var Cache = new function() { this._keymap = {} } - var p = LRU.prototype + let p = LRU.prototype p.put = function(key, value) { - var entry = { + let entry = { key: key, value: value } @@ -32,7 +32,7 @@ var Cache = new function() { } p.shift = function() { - var entry = this.head + let entry = this.head if (entry) { this.head = this.head.newer this.head.older = entry.newer = entry.older = this._keymap[ @@ -42,7 +42,7 @@ var Cache = new function() { } } p.get = function(key) { - var entry = this._keymap[key] + let entry = this._keymap[key] if (entry === void 0) return if (entry === this.tail) { return entry.value diff --git a/src/04-dom.patch.js b/src/04-dom.patch.js index 05df89b..e10e1ca 100644 --- a/src/04-dom.patch.js +++ b/src/04-dom.patch.js @@ -18,18 +18,18 @@ Anot.contains = function(root, el) { } if (window.SVGElement) { - var svgns = 'http://www.w3.org/2000/svg' - var svg = DOC.createElementNS(svgns, 'svg') + let svgns = 'http://www.w3.org/2000/svg' + let svg = DOC.createElementNS(svgns, 'svg') svg.innerHTML = '' if (!rsvg.test(svg.firstChild)) { // #409 /* jshint ignore:start */ function enumerateNode(node, targetNode) { if (node && node.childNodes) { - var nodes = node.childNodes - for (var i = 0, el; (el = nodes[i++]); ) { + let nodes = node.childNodes + for (let i = 0, el; (el = nodes[i++]); ) { if (el.tagName) { - var svg = DOC.createElementNS(svgns, el.tagName.toLowerCase()) + let svg = DOC.createElementNS(svgns, el.tagName.toLowerCase()) // copy attrs ap.forEach.call(el.attributes, function(attr) { svg.setAttribute(attr.name, attr.value) @@ -51,7 +51,7 @@ if (window.SVGElement) { return new XMLSerializer().serializeToString(this) }, set: function(html) { - var tagName = this.tagName.toLowerCase(), + let tagName = this.tagName.toLowerCase(), par = this.parentNode, frag = Anot.parseHTML(html) // 操作的svg,直接插入 @@ -59,7 +59,7 @@ if (window.SVGElement) { par.insertBefore(frag, this) // svg节点的子节点类似 } else { - var newFrag = DOC.createDocumentFragment() + let newFrag = DOC.createDocumentFragment() enumerateNode(frag, newFrag) par.insertBefore(newFrag, this) } @@ -70,18 +70,18 @@ if (window.SVGElement) { enumerable: true, configurable: true, get: function() { - var s = this.outerHTML - var ropen = new RegExp( + let s = this.outerHTML + let ropen = new RegExp( '<' + this.nodeName + '\\b(?:(["\'])[^"]*?(\\1)|[^>])*>', 'i' ) - var rclose = new RegExp('$', 'i') + let rclose = new RegExp('$', 'i') return s.replace(ropen, '').replace(rclose, '') }, set: function(html) { if (Anot.clearHTML) { Anot.clearHTML(this) - var frag = Anot.parseHTML(html) + let frag = Anot.parseHTML(html) enumerateNode(frag, this) } } @@ -92,7 +92,7 @@ if (window.SVGElement) { //========================= event binding ==================== -var eventHooks = Anot.eventHooks +let eventHooks = Anot.eventHooks //针对firefox, chrome修正mouseenter, mouseleave(chrome30+) if (!('onmouseenter' in root)) { @@ -106,7 +106,7 @@ if (!('onmouseenter' in root)) { type: fixType, fix: function(elem, fn) { return function(e) { - var t = e.relatedTarget + let t = e.relatedTarget if (!t || (t !== elem && !(elem.compareDocumentPosition(t) & 16))) { delete e.type e.type = origType