From 19f429d1631544021736145d238ba02005a227a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=87=E5=A4=A9?= Date: Tue, 5 Nov 2019 23:57:24 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=BB=84=E4=BB=B6=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 4 +- src/lib/anot.js | 5229 +-------------------------------- src/lib/form/button.js | 4 +- src/lib/form/checkbox.js | 4 +- src/lib/form/input.js | 4 +- src/lib/form/number.js | 4 +- src/lib/form/progress.js | 2 +- src/lib/form/radio.js | 4 +- src/lib/form/select.js | 4 +- src/lib/form/star.js | 15 + src/lib/form/switch.js | 4 +- src/lib/icon/index.js | 2 +- src/lib/layer/index.js | 4 +- src/lib/pager/index.js | 4 +- src/lib/request/index.js | 448 +-- src/lib/request/lib/format.js | 226 +- src/lib/scroll/index.js | 4 +- src/tools/windows.js | 4 +- 18 files changed, 51 insertions(+), 5919 deletions(-) create mode 100644 src/lib/form/star.js diff --git a/package.json b/package.json index fcc0a80..6104467 100644 --- a/package.json +++ b/package.json @@ -18,8 +18,8 @@ "iofs": "^1.1.0" }, "devDependencies": { - "electron": "^6.0.0", - "electron-builder": "^20.38.5" + "electron": "^7.1.0", + "electron-builder": "^22.1.0" }, "build": { "appId": "cc.doui.sonist", diff --git a/src/lib/anot.js b/src/lib/anot.js index 252027b..6cc6bec 100644 --- a/src/lib/anot.js +++ b/src/lib/anot.js @@ -1,5221 +1,8 @@ - -const _Anot = (function() { -/********************************************************************* - * 全局变量及方法 * - **********************************************************************/ -var bindingID = 1024 - -var expose = generateID() -//http://stackoverflow.com/questions/7290086/javascript-use-strict-and-nicks-find-global-function -var DOC = window.document -var head = DOC.head //HEAD元素 -head.insertAdjacentHTML( - 'afterbegin', - '' -) -var ifGroup = head.firstChild - -function log() { - // http://stackoverflow.com/questions/8785624/how-to-safely-wrap-console-log - console.log.apply(console, arguments) -} - -/** - * Creates a new object without a prototype. This object is useful for lookup without having to - * guard against prototypically inherited properties via hasOwnProperty. - * - * Related micro-benchmarks: - * - http://jsperf.com/object-create2 - * - http://jsperf.com/proto-map-lookup/2 - * - http://jsperf.com/for-in-vs-object-keys2 - */ -function createMap() { - return Object.create(null) -} - -var 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 root = DOC.documentElement -var anotFragment = DOC.createDocumentFragment() -var cinerator = DOC.createElement('div') -var class2type = { - '[object Boolean]': 'boolean', - '[object Number]': 'number', - '[object String]': 'string', - '[object Function]': 'function', - '[object Array]': 'array', - '[object Date]': 'date', - '[object RegExp]': 'regexp', - '[object Object]': 'object', - '[object Error]': 'error', - '[object AsyncFunction]': 'asyncfunction', - '[object Promise]': 'promise', - '[object Generator]': 'generator', - '[object GeneratorFunction]': 'generatorfunction' -} - -function noop() {} -function scpCompile(array) { - return Function.apply(noop, array) -} - -function oneObject(array, val) { - if (typeof array === 'string') { - array = array.match(rword) || [] - } - var result = {}, - value = val !== void 0 ? val : 1 - for (var i = 0, n = array.length; i < n; i++) { - result[array[i]] = value - } - return result -} - -function generateID(mark) { - mark = (mark && mark + '-') || 'anot-' - return mark + (++bindingID).toString(16) -} -/*-----------------部分ES6的JS实现 start---------------*/ - -// =============================== -// ========== Promise ============ -// =============================== - -if (!Promise.defer) { - Promise.defer = function() { - let obj = {} - obj.promise = new Promise((resolve, reject) => { - obj.resolve = resolve - obj.reject = reject - }) - return obj - } -} - -//类似于Array 的splice方法 -if (!String.prototype.splice) { - Object.defineProperty(String.prototype, 'splice', { - value: function(start, len, fill) { - let length = this.length - let argLen = arguments.length - - fill = fill === undefined ? '' : fill - - if (argLen < 1) { - return this - } - - //处理负数 - if (start < 0) { - if (Math.abs(start) >= length) { - start = 0 - } else { - start = length + start - } - } - - if (argLen === 1) { - return this.slice(0, start) - } else { - len -= 0 - - let strl = this.slice(0, start) - let strr = this.slice(start + len) - - return strl + fill + strr - } - }, - enumerable: false - }) -} - -if (!Date.prototype.getFullWeek) { - //获取当天是本年度第几周 - Object.defineProperty(Date.prototype, 'getFullWeek', { - value: function() { - 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 - }) - - //获取当天是本月第几周 - Object.defineProperty(Date.prototype, 'getWeek', { - value: function() { - 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 - }) -} - -if (!Date.isDate) { - Object.defineProperty(Date, 'isDate', { - value: function(obj) { - return typeof obj === 'object' && obj.getTime ? true : false - }, - enumerable: false - }) -} - -//时间格式化 -if (!Date.prototype.format) { - Object.defineProperty(Date.prototype, 'format', { - value: function(str) { - str = str || 'Y-m-d H:i:s' - 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 - - re = { - Y: dt.fullyear, - y: dt.year, - m: dt.month < 10 ? '0' + dt.month : dt.month, - n: dt.month, - d: dt.date < 10 ? '0' + dt.date : dt.date, - j: dt.date, - H: dt.hours < 10 ? '0' + dt.hours : dt.hours, - h: dt.g < 10 ? '0' + dt.g : dt.g, - G: dt.hours, - g: dt.g, - i: dt.minutes < 10 ? '0' + dt.minutes : dt.minutes, - s: dt.seconds < 10 ? '0' + dt.seconds : dt.seconds, - W: dt.fullweek, - w: dt.week, - D: dt.day - } - - for (let i in re) { - str = str.replace(new RegExp(i, 'g'), re[i]) - } - return str - }, - enumerable: false - }) -} -/*-----------------部分ES6的JS实现 ending---------------*/ -let Anot = function(el) { - //创建jQuery式的无new 实例化结构 - return new Anot.init(el) -} - -/*视浏览器情况采用最快的异步回调*/ -Anot.nextTick = new function() { - // jshint ignore:line - let tickImmediate = window.setImmediate - let tickObserver = window.MutationObserver - if (tickImmediate) { - return tickImmediate.bind(window) - } - - let queue = [] - function callback() { - let n = queue.length - for (let i = 0; i < n; i++) { - queue[i]() - } - queue = queue.slice(n) - } - - if (tickObserver) { - let node = document.createTextNode('anot') - new tickObserver(callback).observe(node, { characterData: true }) // jshint ignore:line - let bool = false - return function(fn) { - queue.push(fn) - bool = !bool - node.data = bool - } - } - - return function(fn) { - setTimeout(fn, 4) - } -}() // jshint ignore:line - -/********************************************************************* - * Anot的静态方法定义区 * - **********************************************************************/ - -Anot.type = function(obj) { - //取得目标的类型 - if (obj == null) { - return String(obj) - } - // 早期的webkit内核浏览器实现了已废弃的ecma262v4标准,可以将正则字面量当作函数使用,因此typeof在判定正则时会返回function - return typeof obj === 'object' || typeof obj === 'function' - ? class2type[serialize.call(obj)] || 'object' - : typeof obj -} - -Anot.PropsTypes = function(type) { - this.type = 'PropsTypes' - this.checkType = type -} - -Anot.PropsTypes.prototype = { - toString: function() { - return '' - }, - check: function(val) { - this.result = Anot.type(val) - return this.result === this.checkType - }, - call: function() { - return this.toString() - } -} - -Anot.PropsTypes.isString = function() { - return new this('string') -} - -Anot.PropsTypes.isNumber = function() { - return new this('number') -} - -Anot.PropsTypes.isFunction = function() { - return new this('function') -} - -Anot.PropsTypes.isArray = function() { - return new this('array') -} - -Anot.PropsTypes.isObject = function() { - return new this('object') -} - -Anot.PropsTypes.isBoolean = function() { - return new this('boolean') -} - -/*判定是否是一个朴素的javascript对象(Object),不是DOM对象,不是BOM对象,不是自定义类的实例*/ -Anot.isPlainObject = function(obj) { - // 简单的 typeof obj === "object"检测,会致使用isPlainObject(window)在opera下通不过 - return ( - serialize.call(obj) === '[object Object]' && - Object.getPrototypeOf(obj) === oproto - ) -} - -let VMODELS = (Anot.vmodels = {}) //所有vmodel都储存在这里 -Anot.init = function(source) { - if (Anot.isPlainObject(source)) { - let $id = source.$id - let vm = null - if (!$id) { - log('warning: vm必须指定id') - } - vm = modelFactory(Object.assign({ props: {} }, source)) - vm.$id = $id - VMODELS[$id] = vm - - Anot.nextTick(function() { - let $elem = document.querySelector('[anot=' + vm.$id + ']') - if ($elem) { - if ($elem === DOC.body) { - scanTag($elem, []) - } else { - let _parent = $elem - while ((_parent = _parent.parentNode)) { - if (_parent.__VM__) { - break - } - } - scanTag($elem.parentNode, _parent ? [_parent.__VM__] : []) - } - } - }) - - return vm - } else { - this[0] = this.element = source - } -} -Anot.fn = Anot.prototype = Anot.init.prototype - -//与jQuery.extend方法,可用于浅拷贝,深拷贝 -Anot.mix = Anot.fn.mix = function() { - let options, - name, - src, - copy, - copyIsArray, - clone, - target = arguments[0] || {}, - i = 1, - length = arguments.length, - deep = false - - // 如果第一个参数为布尔,判定是否深拷贝 - if (typeof target === 'boolean') { - deep = target - target = arguments[1] || {} - i++ - } - - //确保接受方为一个复杂的数据类型 - if (typeof target !== 'object' && Anot.type(target) !== 'function') { - target = {} - } - - //如果只有一个参数,那么新成员添加于mix所在的对象上 - if (i === length) { - target = this - i-- - } - - for (; i < length; i++) { - //只处理非空参数 - if ((options = arguments[i]) != null) { - for (name in options) { - src = target[name] - copy = options[name] - // 防止环引用 - if (target === copy) { - continue - } - if ( - deep && - copy && - (Anot.isPlainObject(copy) || (copyIsArray = Array.isArray(copy))) - ) { - if (copyIsArray) { - copyIsArray = false - clone = src && Array.isArray(src) ? src : [] - } else { - clone = src && Anot.isPlainObject(src) ? src : {} - } - - target[name] = Anot.mix(deep, clone, copy) - } else if (copy !== void 0) { - target[name] = copy - } - } - } - } - return target -} - -function cacheStore(tpye, key, val) { - if (this.type(key) === 'object') { - for (let i in key) { - window[tpye].setItem(i, key[i]) - } - return - } - switch (arguments.length) { - case 2: - return window[tpye].getItem(key) - case 3: - if ((this.type(val) == 'string' && val.trim() === '') || val === null) { - window[tpye].removeItem(key) - return - } - if (this.type(val) !== 'object' && this.type(val) !== 'array') { - window[tpye].setItem(key, val.toString()) - } else { - window[tpye].setItem(key, JSON.stringify(val)) - } - break - } -} - -/*判定是否类数组,如节点集合,纯数组,arguments与拥有非负整数的length属性的纯JS对象*/ -function isArrayLike(obj) { - if (obj && typeof obj === 'object') { - let n = obj.length, - str = serialize.call(obj) - if (/(Array|List|Collection|Map|Arguments)\]$/.test(str)) { - return true - } else if (str === '[object Object]' && n === n >>> 0) { - return true //由于ecma262v5能修改对象属性的enumerable,因此不能用propertyIsEnumerable来判定了 - } - } - return false -} - -Anot.mix({ - rword: rword, - subscribers: subscribers, - version: '1.0.0', - log: log, - ui: {}, //仅用于存放组件版本信息等 - slice: function(nodes, start, end) { - return aslice.call(nodes, start, end) - }, - noop: noop, - /*如果不用Error对象封装一下,str在控制台下可能会乱码*/ - error: function(str, e) { - throw new (e || Error)(str) // jshint ignore:line - }, - /* Anot.range(10) - => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] - Anot.range(1, 11) - => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] - Anot.range(0, 30, 5) - => [0, 5, 10, 15, 20, 25] - Anot.range(0, -10, -1) - => [0, -1, -2, -3, -4, -5, -6, -7, -8, -9] - Anot.range(0) - => []*/ - range: function(start, end, step) { - // 用于生成整数数组 - step || (step = 1) - if (end == null) { - end = start || 0 - start = 0 - } - let index = -1, - length = Math.max(0, Math.ceil((end - start) / step)), - result = new Array(length) - while (++index < length) { - result[index] = start - start += step - } - return result - }, - deepCopy: toJson, - eventHooks: {}, - /*绑定事件*/ - bind: function(el, type, fn, phase) { - let hooks = Anot.eventHooks - type = type.split(',') - Anot.each(type, function(i, t) { - t = t.trim() - let hook = hooks[t] - if (typeof hook === 'object') { - type = hook.type || type - phase = hook.phase || !!phase - fn = hook.fix ? hook.fix(el, fn) : fn - } - el.addEventListener(t, fn, phase) - }) - return fn - }, - /*卸载事件*/ - unbind: function(el, type, fn, phase) { - let hooks = Anot.eventHooks - type = type.split(',') - fn = fn || noop - Anot.each(type, function(i, t) { - t = t.trim() - let hook = hooks[t] - if (typeof hook === 'object') { - type = hook.type || type - phase = hook.phase || !!phase - } - el.removeEventListener(t, fn, phase) - }) - }, - /*读写删除元素节点的样式*/ - css: function(node, name, value) { - if (node instanceof Anot) { - node = node[0] - } - var prop = /[_-]/.test(name) ? camelize(name) : name - var fn - - name = Anot.cssName(prop) || prop - if (value === void 0 || typeof value === 'boolean') { - //获取样式 - fn = cssHooks[prop + ':get'] || cssHooks['@:get'] - if (name === 'background') { - name = 'backgroundColor' - } - var val = fn(node, name) - return value === true ? +val || 0 : val - } else if (value === '') { - //请除样式 - node.style[name] = '' - } else { - //设置样式 - if (value == null || value !== value) { - return - } - if (isFinite(value) && !Anot.cssNumber[prop]) { - value += 'px' - } - fn = cssHooks[prop + ':set'] || cssHooks['@:set'] - fn(node, name, value) - } - }, - /*遍历数组与对象,回调的第一个参数为索引或键名,第二个或元素或键值*/ - each: function(obj, fn) { - if (obj) { - //排除null, undefined - let i = 0 - if (isArrayLike(obj)) { - for (let n = obj.length; i < n; i++) { - if (fn(i, obj[i]) === false) break - } - } else { - for (i in obj) { - if (obj.hasOwnProperty(i) && fn(i, obj[i]) === false) { - break - } - } - } - } - }, - Array: { - /*只有当前数组不存在此元素时只添加它*/ - ensure: function(target, item) { - if (target.indexOf(item) === -1) { - return target.push(item) - } - }, - /*移除数组中指定位置的元素,返回布尔表示成功与否*/ - removeAt: function(target, index) { - return !!target.splice(index, 1).length - }, - /*移除数组中第一个匹配传参的那个元素,返回布尔表示成功与否*/ - remove: function(target, item) { - let index = target.indexOf(item) - if (~index) return Anot.Array.removeAt(target, index) - return false - } - }, - /** - * [ls localStorage操作] - * @param {[type]} key [键名] - * @param {[type]} val [键值,为空时删除] - * @return - */ - ls: function() { - let args = aslice.call(arguments, 0) - args.unshift('localStorage') - return cacheStore.apply(this, args) - }, - ss: function() { - let args = aslice.call(arguments, 0) - args.unshift('sessionStorage') - return cacheStore.apply(this, args) - }, - /** - * [cookie cookie 操作 ] - * @param key [cookie名] - * @param val [cookie值] - * @param {[json]} opt [有效期,域名,路径等] - * @return {[boolean]} [读取时返回对应的值,写入时返回true] - */ - cookie: function(key, val, opt) { - if (arguments.length > 1) { - if (!key) { - return - } - - //设置默认的参数 - opt = opt || {} - opt = Object.assign( - { - expires: '', - path: '/', - domain: document.domain, - secure: '' - }, - opt - ) - - if ((this.type(val) == 'string' && val.trim() === '') || val === null) { - document.cookie = - encodeURIComponent(key) + - '=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=' + - opt.domain + - '; path=' + - opt.path - return true - } - if (opt.expires) { - switch (opt.expires.constructor) { - case Number: - opt.expires = - opt.expires === Infinity - ? '; expires=Fri, 31 Dec 9999 23:59:59 GMT' - : '; max-age=' + opt.expires - break - case String: - opt.expires = '; expires=' + opt.expires - break - case Date: - opt.expires = '; expires=' + opt.expires.toUTCString() - break - } - } - document.cookie = - encodeURIComponent(key) + - '=' + - encodeURIComponent(val) + - opt.expires + - '; domain=' + - opt.domain + - '; path=' + - opt.path + - '; ' + - opt.secure - return true - } else { - if (!key) { - return document.cookie - } - return ( - decodeURIComponent( - document.cookie.replace( - new RegExp( - '(?:(?:^|.*;)\\s*' + - encodeURIComponent(key).replace(/[\-\.\+\*]/g, '\\$&') + - '\\s*\\=\\s*([^;]*).*$)|^.*$' - ), - '$1' - ) - ) || null - ) - } - }, - //获取url的参数 - search: function(key) { - key += '' - let uri = location.search - - if (!key || !uri) { - return null - } - uri = decodeURIComponent(uri) - - uri = uri.slice(1) - uri = uri.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] = tmp[1] - if (obj.hasOwnProperty(tmp[0])) { - if (typeof obj[tmp[0]] === 'object') { - obj[tmp[0]].push(tmp[1]) - } else { - obj[tmp[0]] = [obj[tmp[0]]] - obj[tmp[0]].push(tmp[1]) - } - } else { - obj[tmp[0]] = tmp[1] - } - } - return obj.hasOwnProperty(key) ? obj[key] : null - }, - //复制文本到粘贴板 - copy: function(txt) { - if (!DOC.queryCommandSupported || !DOC.queryCommandSupported('copy')) { - return log('该浏览器不支持复制到粘贴板') - } - - let ta = DOC.createElement('textarea') - ta.textContent = txt - ta.style.position = 'fixed' - ta.style.bottom = '-1000px' - DOC.body.appendChild(ta) - ta.select() - try { - DOC.execCommand('copy') - } catch (err) { - log('复制到粘贴板失败', err) - } - DOC.body.removeChild(ta) - } -}) - -let bindingHandlers = (Anot.bindingHandlers = {}) -let bindingExecutors = (Anot.bindingExecutors = {}) - -let directives = (Anot.directives = {}) -Anot.directive = function(name, obj) { - bindingHandlers[name] = obj.init = obj.init || noop - bindingExecutors[name] = obj.update = obj.update || noop - return (directives[name] = obj) -} -// https://github.com/rsms/js-lru -let Cache = new function() { - // jshint ignore:line - function LRU(maxLength) { - this.size = 0 - this.limit = maxLength - this.head = this.tail = void 0 - this._keymap = {} - } - - let p = LRU.prototype - - p.put = function(key, value) { - let entry = { - key: key, - value: value - } - this._keymap[key] = entry - if (this.tail) { - this.tail.newer = entry - entry.older = this.tail - } else { - this.head = entry - } - this.tail = entry - if (this.size === this.limit) { - this.shift() - } else { - this.size++ - } - return value - } - - p.shift = function() { - let entry = this.head - if (entry) { - this.head = this.head.newer - this.head.older = entry.newer = entry.older = this._keymap[ - entry.key - ] = void 0 - delete this._keymap[entry.key] //#1029 - } - } - p.get = function(key) { - let entry = this._keymap[key] - if (entry === void 0) return - if (entry === this.tail) { - return entry.value - } - // HEAD--------------TAIL - // <.older .newer> - // <--- add direction -- - // A B C E - if (entry.newer) { - if (entry === this.head) { - this.head = entry.newer - } - entry.newer.older = entry.older // C <-- E. - } - if (entry.older) { - entry.older.newer = entry.newer // C. --> E - } - entry.newer = void 0 // D --x - entry.older = this.tail // D. --> E - if (this.tail) { - this.tail.newer = entry // E. <-- D - } - this.tail = entry - return entry.value - } - return LRU -}() // jshint ignore:line -/********************************************************************* - * DOM 底层补丁 * - **********************************************************************/ - -//safari5+是把contains方法放在Element.prototype上而不是Node.prototype -if (!DOC.contains) { - Node.prototype.contains = function(arg) { - return !!(this.compareDocumentPosition(arg) & 16) - } -} -Anot.contains = function(root, el) { - try { - while ((el = el.parentNode)) if (el === root) return true - return false - } catch (e) { - return false - } -} - -//========================= event binding ==================== - -let eventHooks = Anot.eventHooks - -//针对firefox, chrome修正mouseenter, mouseleave(chrome30+) -if (!('onmouseenter' in root)) { - Anot.each( - { - mouseenter: 'mouseover', - mouseleave: 'mouseout' - }, - function(origType, fixType) { - eventHooks[origType] = { - type: fixType, - fix: function(elem, fn) { - return function(e) { - let t = e.relatedTarget - if (!t || (t !== elem && !(elem.compareDocumentPosition(t) & 16))) { - delete e.type - e.type = origType - return fn.call(elem, e) - } - } - } - } - } - ) -} - -//针对IE9+, w3c修正animationend -Anot.each( - { - AnimationEvent: 'animationend', - WebKitAnimationEvent: 'webkitAnimationEnd' - }, - function(construct, fixType) { - if (window[construct] && !eventHooks.animationend) { - eventHooks.animationend = { - type: fixType - } - } - } -) - -if (DOC.onmousewheel === void 0) { - /* IE6-11 chrome mousewheel wheelDetla 下 -120 上 120 - firefox DOMMouseScroll detail 下3 上-3 - firefox wheel detlaY 下3 上-3 - IE9-11 wheel deltaY 下40 上-40 - chrome wheel deltaY 下100 上-100 */ - eventHooks.mousewheel = { - type: 'wheel', - fix: function(elem, fn) { - return function(e) { - e.wheelDeltaY = e.wheelDelta = e.deltaY > 0 ? -120 : 120 - e.wheelDeltaX = 0 - Object.defineProperty(e, 'type', { - value: 'mousewheel' - }) - fn.call(elem, e) - } - } - } -} -/********************************************************************* - * 配置系统 * - **********************************************************************/ - -function kernel(settings) { - for (var p in settings) { - if (!ohasOwn.call(settings, p)) continue - var val = settings[p] - if (typeof kernel.plugins[p] === 'function') { - kernel.plugins[p](val) - } else if (typeof kernel[p] === 'object') { - Anot.mix(kernel[p], val) - } else { - kernel[p] = val - } - } - return this -} -Anot.config = kernel - -var openTag, - closeTag, - rexpr, - rexprg, - rbind, - rregexp = /[-.*+?^${}()|[\]\/\\]/g - -function escapeRegExp(target) { - //http://stevenlevithan.com/regex/xregexp/ - //将字符串安全格式化为正则表达式的源码 - return (target + '').replace(rregexp, '\\$&') -} - -var plugins = { - interpolate: function(array) { - openTag = array[0] - closeTag = array[1] - if (openTag === closeTag) { - throw new SyntaxError('openTag!==closeTag') - var test = openTag + 'test' + closeTag - cinerator.innerHTML = test - if ( - cinerator.innerHTML !== test && - cinerator.innerHTML.indexOf('<') > -1 - ) { - throw new SyntaxError('此定界符不合法') - } - cinerator.innerHTML = '' - } - kernel.openTag = openTag - kernel.closeTag = closeTag - var o = escapeRegExp(openTag), - c = escapeRegExp(closeTag) - rexpr = new RegExp(o + '([\\s\\S]*)' + c) - rexprg = new RegExp(o + '([\\s\\S]*)' + c, 'g') - rbind = new RegExp(o + '[\\s\\S]*' + c + '|\\s:') //此处有疑问 - } -} -kernel.plugins = plugins -kernel.plugins['interpolate'](['{{', '}}']) - -kernel.async = true -kernel.paths = {} -kernel.shim = {} -kernel.maxRepeatSize = 100 -function $watch(expr, binding) { - var $events = this.$events || (this.$events = {}), - queue = $events[expr] || ($events[expr] = []) - - if (typeof binding === 'function') { - var backup = binding - backup.uuid = '_' + ++bindingID - binding = { - element: root, - type: 'user-watcher', - handler: noop, - vmodels: [this], - expr: expr, - uuid: backup.uuid - } - binding.wildcard = /\*/.test(expr) - } - - if (!binding.update) { - if (/\w\.*\B/.test(expr) || expr === '*') { - binding.getter = noop - var host = this - binding.update = function() { - var args = this.fireArgs || [] - if (args[2]) binding.handler.apply(host, args) - delete this.fireArgs - } - queue.sync = true - Anot.Array.ensure(queue, binding) - } else { - Anot.injectBinding(binding) - } - if (backup) { - binding.handler = backup - } - } else if (!binding.oneTime) { - Anot.Array.ensure(queue, binding) - } - - return function() { - binding.update = binding.getter = binding.handler = noop - binding.element = DOC.createElement('a') - } -} - -function $emit(key, args) { - var event = this.$events - var _parent = null - if (event && event[key]) { - if (args) { - args[2] = key - } - var arr = event[key] - notifySubscribers(arr, args) - if (args && event['*'] && !/\./.test(key)) { - for (var sub, k = 0; (sub = event['*'][k++]); ) { - try { - sub.handler.apply(this, args) - } catch (e) {} - } - } - _parent = this.$up - if (_parent) { - if (this.$pathname) { - $emit.call(_parent, this.$pathname + '.' + key, args) //以确切的值往上冒泡 - } - $emit.call(_parent, '*.' + key, args) //以模糊的值往上冒泡 - } - } else { - _parent = this.$up - if (this.$ups) { - for (var i in this.$ups) { - $emit.call(this.$ups[i], i + '.' + key, args) //以确切的值往上冒泡 - } - return - } - if (_parent) { - var p = this.$pathname - if (p === '') p = '*' - var path = p + '.' + key - arr = path.split('.') - - args = (args && args.concat([path, key])) || [path, key] - - if (arr.indexOf('*') === -1) { - $emit.call(_parent, path, args) //以确切的值往上冒泡 - arr[1] = '*' - $emit.call(_parent, arr.join('.'), args) //以模糊的值往上冒泡 - } else { - $emit.call(_parent, path, args) //以确切的值往上冒泡 - } - } - } -} - -function collectDependency(el, key) { - do { - if (el.$watch) { - var e = el.$events || (el.$events = {}) - var array = e[key] || (e[key] = []) - dependencyDetection.collectDependency(array) - return - } - el = el.$up - if (el) { - key = el.$pathname + '.' + key - } else { - break - } - } while (true) -} - -function notifySubscribers(subs, args) { - if (!subs) return - if (new Date() - beginTime > 444 && typeof subs[0] === 'object') { - rejectDisposeQueue() - } - var users = [], - renders = [] - for (var i = 0, sub; (sub = subs[i++]); ) { - if (sub.type === 'user-watcher') { - users.push(sub) - } else { - renders.push(sub) - } - } - if (kernel.async) { - buffer.render() //1 - for (i = 0; (sub = renders[i++]); ) { - if (sub.update) { - sub.uuid = sub.uuid || '_' + ++bindingID - var uuid = sub.uuid - if (!buffer.queue[uuid]) { - buffer.queue[uuid] = '__' - buffer.queue.push(sub) - } - } - } - } else { - for (i = 0; (sub = renders[i++]); ) { - if (sub.update) { - sub.update() //最小化刷新DOM树 - } - } - } - for (i = 0; (sub = users[i++]); ) { - if ((args && args[2] === sub.expr) || sub.wildcard) { - sub.fireArgs = args - } - sub.update() - } -} - -//一些不需要被监听的属性 -var kernelProps = oneObject( - '$id,$watch,$fire,$events,$model,$active,$pathname,$up,$ups,$track,$accessors' -) - -//如果浏览器不支持ecma262v5的Object.defineProperties或者存在BUG,比如IE8 -//标准浏览器使用__defineGetter__, __defineSetter__实现 - -function modelFactory(source, options) { - options = options || {} - options.watch = true - return observeObject(source, options) -} - -function isSkip(k) { - return k.charAt(0) === '$' || k.slice(0, 2) === '__' || kernelProps[k] -} - -//监听对象属性值的变化(注意,数组元素不是数组的属性),通过对劫持当前对象的访问器实现 -//监听对象或数组的结构变化, 对对象的键值对进行增删重排, 或对数组的进行增删重排,都属于这范畴 -// 通过比较前后代理VM顺序实现 -function Component() {} - -function observeObject(source, options) { - if ( - !source || - (source.$id && source.$accessors) || - (source.nodeName && source.nodeType > 0) - ) { - return source - } - //source为原对象,不能是元素节点或null - //options,可选,配置对象,里面有old, force, watch这三个属性 - options = options || nullObject - var force = options.force || nullObject - var old = options.old - var oldAccessors = (old && old.$accessors) || nullObject - var $vmodel = new Component() //要返回的对象, 它在IE6-8下可能被偷龙转凤 - var accessors = {} //监控属性 - var hasOwn = {} - var skip = [] - var simple = [] - var userSkip = {} - // 提取 source中的配置项, 并删除相应字段 - var state = source.state - var computed = source.computed - var methods = source.methods - var props = source.props - var watches = source.watch - var mounted = source.mounted - - delete source.state - delete source.computed - delete source.methods - delete source.props - delete source.watch - - if (source.skip) { - userSkip = oneObject(source.skip) - delete source.skip - } - - // 基础数据 - if (state) { - if (source.$id) { - // 直接删除名为props的 字段, 对于主VM对象, props将作为保留关键字 - // 下面的计算属性,方法等, 作同样的逻辑处理 - delete state.props - } - for (name in state) { - var value = state[name] - if (!kernelProps[name]) { - hasOwn[name] = true - } - if ( - typeof value === 'function' || - (value && value.nodeName && value.nodeType > 0) || - (!force[name] && (isSkip(name) || userSkip[name])) - ) { - skip.push(name) - } else if (isComputed(value)) { - log('warning:计算属性建议放在[computed]对象中统一定义') - // 转给下一步处理 - computed[name] = value - } else { - simple.push(name) - if (oldAccessors[name]) { - accessors[name] = oldAccessors[name] - } else { - accessors[name] = makeGetSet(name, value) - } - } - } - } - - //处理计算属性 - if (computed) { - delete computed.props - for (var name in computed) { - hasOwn[name] = true - ;(function(key, value) { - var old - if (typeof value === 'function') { - value = { get: value, set: noop } - } - if (typeof value.set !== 'function') { - value.set = noop - } - accessors[key] = { - get: function() { - return (old = value.get.call(this)) - }, - set: function(x) { - var older = old, - newer - value.set.call(this, x) - newer = this[key] - if (this.$fire && newer !== older) { - this.$fire(key, newer, older) - } - }, - enumerable: true, - configurable: true - } - })(name, computed[name]) // jshint ignore:line - } - } - - // 方法 - if (methods) { - delete methods.props - for (var name in methods) { - hasOwn[name] = true - skip.push(name) - } - } - - if (props) { - hideProperty($vmodel, 'props', {}) - hasOwn.props = !!source.$id - for (var name in props) { - $vmodel.props[name] = props[name] - } - } - - Object.assign(source, state, methods) - - accessors['$model'] = $modelDescriptor - $vmodel = Object.defineProperties($vmodel, accessors, source) - function trackBy(name) { - return hasOwn[name] === true - } - skip.forEach(function(name) { - $vmodel[name] = source[name] - }) - - // hideProperty($vmodel, '$ups', null) - hideProperty($vmodel, '$id', 'anonymous') - hideProperty($vmodel, '$up', old ? old.$up : null) - hideProperty($vmodel, '$track', Object.keys(hasOwn)) - hideProperty($vmodel, '$active', false) - hideProperty($vmodel, '$pathname', old ? old.$pathname : '') - hideProperty($vmodel, '$accessors', accessors) - hideProperty($vmodel, '$events', {}) - hideProperty($vmodel, '$refs', {}) - hideProperty($vmodel, '$children', []) - hideProperty($vmodel, 'hasOwnProperty', trackBy) - hideProperty($vmodel, '$mounted', mounted) - if (options.watch) { - hideProperty($vmodel, '$watch', function() { - return $watch.apply($vmodel, arguments) - }) - hideProperty($vmodel, '$fire', function(path, a) { - if (path.indexOf('all!') === 0) { - var ee = path.slice(4) - for (var i in Anot.vmodels) { - var v = Anot.vmodels[i] - v.$fire && v.$fire.apply(v, [ee, a]) - } - } else if (path.indexOf('child!') === 0) { - var ee = 'props.' + path.slice(6) - for (var i in $vmodel.$children) { - var v = $vmodel.$children[i] - v.$fire && v.$fire.apply(v, [ee, a]) - } - } else { - $emit.call($vmodel, path, [a]) - } - }) - } - - simple.forEach(function(name) { - var oldVal = old && old[name] - var val = ($vmodel[name] = state[name]) - if (val && typeof val === 'object' && !Date.isDate(val)) { - val.$up = $vmodel - val.$pathname = name - } - $emit.call($vmodel, name, [val, oldVal]) - }) - - // 属性的监听, 必须放在上一步$emit后处理, 否则会在初始时就已经触发一次 监听回调 - if (watches) { - delete watches.props - for (var key in watches) { - if (Array.isArray(watches[key])) { - var tmp - while ((tmp = watches[key].pop())) { - $watch.call($vmodel, key, tmp) - } - } else { - $watch.call($vmodel, key, watches[key]) - } - } - } - - $vmodel.$active = true - - if ($vmodel.$id !== 'anonymous') { - if (old && old.$up && old.$up.$children) { - old.$up.$children.push($vmodel) - } - } - - return $vmodel -} - -/* - 新的VM拥有如下私有属性 - $id: vm.id - $events: 放置$watch回调与绑定对象 - $watch: 增强版$watch - $fire: 触发$watch回调 - $track:一个数组,里面包含用户定义的所有键名 - $active:boolean,false时防止依赖收集 - $model:返回一个纯净的JS对象 - $accessors:放置所有读写器的数据描述对象 - $pathname:返回此对象在上级对象的名字,注意,数组元素的$pathname为空字符串 - ============================= - skip:用于指定不可监听的属性,但VM生成是没有此属性的 - */ -function isComputed(val) { - //speed up! - if (val && typeof val === 'object') { - for (var i in val) { - if (i !== 'get' && i !== 'set') { - return false - } - } - return typeof val.get === 'function' - } -} -function makeGetSet(key, value) { - var childVm, - value = NaN - return { - get: function() { - if (this.$active) { - collectDependency(this, key) - } - return value - }, - set: function(newVal) { - if (value === newVal) return - var oldValue = value - childVm = observe(newVal, value) - if (childVm) { - value = childVm - } else { - childVm = void 0 - value = newVal - } - - if (Object(childVm) === childVm) { - childVm.$pathname = key - childVm.$up = this - } - if (this.$active) { - $emit.call(this, key, [value, oldValue]) - } - }, - enumerable: true, - configurable: true - } -} - -function observe(obj, old, hasReturn, watch) { - if (Array.isArray(obj)) { - return observeArray(obj, old, watch) - } else if (Anot.isPlainObject(obj)) { - if (old && typeof old === 'object') { - var keys = Object.keys(obj) - var keys2 = Object.keys(old) - if (keys.join(';') === keys2.join(';')) { - for (var i in obj) { - if (obj.hasOwnProperty(i)) { - old[i] = obj[i] - } - } - return old - } - old.$active = false - } - return observeObject( - { state: obj }, - { - old: old, - watch: watch - } - ) - } - if (hasReturn) { - return obj - } -} - -function observeArray(array, old, watch) { - if (old && old.splice) { - var args = [0, old.length].concat(array) - old.splice.apply(old, args) - return old - } else { - for (var i in newProto) { - array[i] = newProto[i] - } - hideProperty(array, '$up', null) - hideProperty(array, '$pathname', '') - hideProperty(array, '$track', createTrack(array.length)) - - array._ = observeObject( - { - state: { length: NaN } - }, - { - watch: true - } - ) - array._.length = array.length - array._.$watch('length', function(a, b) { - $emit.call(array.$up, array.$pathname + '.length', [a, b]) - }) - if (watch) { - hideProperty(array, '$watch', function() { - return $watch.apply(array, arguments) - }) - } - - Object.defineProperty(array, '$model', $modelDescriptor) - - for (var j = 0, n = array.length; j < n; j++) { - var el = (array[j] = observe(array[j], 0, 1, 1)) - if (Object(el) === el) { - //#1077 - el.$up = array - } - } - - return array - } -} - -function hideProperty(host, name, value) { - Object.defineProperty(host, name, { - value: value, - writable: true, - enumerable: false, - configurable: true - }) -} -Anot.hideProperty = hideProperty - -function toJson(val) { - var xtype = Anot.type(val) - if (xtype === 'array') { - var array = [] - for (var i = 0; i < val.length; i++) { - array[i] = toJson(val[i]) - } - return array - } else if (xtype === 'object') { - var obj = {} - for (i in val) { - if (val.hasOwnProperty(i)) { - var value = val[i] - obj[i] = value && value.nodeType ? value : toJson(value) - } - } - return obj - } - return val -} - -var $modelDescriptor = { - get: function() { - return toJson(this) - }, - set: noop, - enumerable: false, - configurable: true -} -/********************************************************************* - * 监控数组(:for配合使用) * - **********************************************************************/ - -var arrayMethods = ['push', 'pop', 'shift', 'unshift', 'splice'] -var arrayProto = Array.prototype -var newProto = { - notify: function() { - $emit.call(this.$up, this.$pathname) - }, - set: function(index, val) { - index = index >>> 0 - if (index > this.length) { - throw Error(index + 'set方法的第一个参数不能大于原数组长度') - } - if (this[index] !== val) { - var old = this[index] - this.splice(index, 1, val) - $emit.call(this.$up, this.$pathname + '.*', [val, old, null, index]) - } - }, - contains: function(el) { - //判定是否包含 - return this.indexOf(el) > -1 - }, - ensure: function(el) { - if (!this.contains(el)) { - //只有不存在才push - this.push(el) - } - return this - }, - pushArray: function(arr) { - return this.push.apply(this, toJson(arr)) - }, - remove: function(el) { - //移除第一个等于给定值的元素 - return this.removeAt(this.indexOf(el)) - }, - removeAt: function(index) { - index = index >>> 0 - //移除指定索引上的元素 - return this.splice(index, 1) - }, - size: function() { - //取得数组长度,这个函数可以同步视图,length不能 - return this._.length - }, - removeAll: function(all) { - //移除N个元素 - if (Array.isArray(all)) { - for (var i = this.length - 1; i >= 0; i--) { - if (all.indexOf(this[i]) !== -1) { - _splice.call(this.$track, i, 1) - _splice.call(this, i, 1) - } - } - } else if (typeof all === 'function') { - for (i = this.length - 1; i >= 0; i--) { - var el = this[i] - if (all(el, i)) { - _splice.call(this.$track, i, 1) - _splice.call(this, i, 1) - } - } - } else { - _splice.call(this.$track, 0, this.length) - _splice.call(this, 0, this.length) - } - - this.notify() - this._.length = this.length - }, - clear: function() { - this.removeAll() - } -} - -var _splice = arrayProto.splice -arrayMethods.forEach(function(method) { - var original = arrayProto[method] - newProto[method] = function() { - // 继续尝试劫持数组元素的属性 - var args = [] - for (var i = 0, n = arguments.length; i < n; i++) { - args[i] = observe(arguments[i], 0, 1, 1) - } - var result = original.apply(this, args) - addTrack(this.$track, method, args) - - this.notify() - this._.length = this.length - return result - } -}) - -'sort,reverse'.replace(rword, function(method) { - newProto[method] = function() { - var oldArray = this.concat() //保持原来状态的旧数组 - var newArray = this - var mask = Math.random() - var indexes = [] - var hasSort = false - arrayProto[method].apply(newArray, arguments) //排序 - for (var i = 0, n = oldArray.length; i < n; i++) { - var neo = newArray[i] - var old = oldArray[i] - if (neo === old) { - indexes.push(i) - } else { - var index = oldArray.indexOf(neo) - indexes.push(index) //得到新数组的每个元素在旧数组对应的位置 - oldArray[index] = mask //屏蔽已经找过的元素 - hasSort = true - } - } - if (hasSort) { - sortByIndex(this.$track, indexes) - - this.notify() - } - return this - } -}) - -function sortByIndex(array, indexes) { - var map = {} - for (var i = 0, n = indexes.length; i < n; i++) { - map[i] = array[i] - var j = indexes[i] - if (j in map) { - array[i] = map[j] - delete map[j] - } else { - array[i] = array[j] - } - } -} - -function createTrack(n) { - var ret = [] - for (var i = 0; i < n; i++) { - ret[i] = generateID('proxy-each') - } - return ret -} - -function addTrack(track, method, args) { - switch (method) { - case 'push': - case 'unshift': - args = createTrack(args.length) - break - case 'splice': - if (args.length > 2) { - // 0, 5, a, b, c --> 0, 2, 0 - // 0, 5, a, b, c, d, e, f, g--> 0, 0, 3 - var del = args[1] - var add = args.length - 2 - // args = [args[0], Math.max(del - add, 0)].concat(createTrack(Math.max(add - del, 0))) - args = [args[0], args[1]].concat(createTrack(args.length - 2)) - } - break - } - Array.prototype[method].apply(track, args) -} -/********************************************************************* - * 依赖调度系统 * - **********************************************************************/ - -//检测两个对象间的依赖关系 -var dependencyDetection = (function() { - var outerFrames = [] - var currentFrame - return { - begin: function(binding) { - //accessorObject为一个拥有callback的对象 - outerFrames.push(currentFrame) - currentFrame = binding - }, - end: function() { - currentFrame = outerFrames.pop() - }, - collectDependency: function(array) { - if (currentFrame) { - //被dependencyDetection.begin调用 - currentFrame.callback(array) - } - } - } -})() - -//将绑定对象注入到其依赖项的订阅数组中 -var roneval = /^on$/ - -function returnRandom() { - return new Date() - 0 -} - -Anot.injectBinding = function(binding) { - binding.handler = binding.handler || directives[binding.type].update || noop - binding.update = function() { - var begin = false - if (!binding.getter) { - begin = true - dependencyDetection.begin({ - callback: function(array) { - injectDependency(array, binding) - } - }) - - binding.getter = parseExpr(binding.expr, binding.vmodels, binding) - binding.observers.forEach(function(a) { - a.v.$watch(a.p, binding) - }) - delete binding.observers - } - try { - var args = binding.fireArgs, - a, - b - delete binding.fireArgs - if (!args) { - if (binding.type === 'on') { - a = binding.getter + '' - } else { - try { - a = binding.getter.apply(0, binding.args) - } catch (e) { - a = null - } - } - } else { - a = args[0] - b = args[1] - } - b = typeof b === 'undefined' ? binding.oldValue : b - if (binding._filters) { - a = filters.$filter.apply(0, [a].concat(binding._filters)) - } - if (binding.signature) { - var xtype = Anot.type(a) - if (xtype !== 'array' && xtype !== 'object') { - throw Error('warning:' + binding.expr + '只能是对象或数组') - } - binding.xtype = xtype - var vtrack = getProxyIds(binding.proxies || [], xtype) - var mtrack = - a.$track || - (xtype === 'array' ? createTrack(a.length) : Object.keys(a)) - binding.track = mtrack - if (vtrack !== mtrack.join(';')) { - binding.handler(a, b) - binding.oldValue = 1 - } - } else if (Array.isArray(a) ? a.length !== (b && b.length) : false) { - binding.handler(a, b) - binding.oldValue = a.concat() - } else if (!('oldValue' in binding) || a !== b) { - binding.handler(a, b) - binding.oldValue = Array.isArray(a) ? a.concat() : a - } - } catch (e) { - delete binding.getter - log('warning:exception throwed in [Anot.injectBinding] ', e) - var node = binding.element - if (node && node.nodeType === 3) { - node.nodeValue = - openTag + (binding.oneTime ? '::' : '') + binding.expr + closeTag - } - } finally { - begin && dependencyDetection.end() - } - } - binding.update() -} - -//将依赖项(比它高层的访问器或构建视图刷新函数的绑定对象)注入到订阅者数组 -function injectDependency(list, binding) { - if (binding.oneTime) return - if (list && Anot.Array.ensure(list, binding) && binding.element) { - injectDisposeQueue(binding, list) - if (new Date() - beginTime > 444) { - rejectDisposeQueue() - } - } -} - -function getProxyIds(a, isArray) { - var ret = [] - for (var i = 0, el; (el = a[i++]); ) { - ret.push(isArray ? el.$id : el.$key) - } - return ret.join(';') -} -/********************************************************************* - * 定时GC回收机制 (基于1.6基于频率的GC) * - **********************************************************************/ - -var disposeQueue = (Anot.$$subscribers = []) -var beginTime = new Date() - -//添加到回收列队中 -function injectDisposeQueue(data, list) { - data.list = list - data.i = ~~data.i - if (!data.uuid) { - data.uuid = '_' + ++bindingID - } - if (!disposeQueue[data.uuid]) { - disposeQueue[data.uuid] = '__' - disposeQueue.push(data) - } -} - -var lastGCIndex = 0 -function rejectDisposeQueue(data) { - var i = lastGCIndex || disposeQueue.length - var threshold = 0 - while ((data = disposeQueue[--i])) { - if (data.i < 7) { - if (data.element === null) { - disposeQueue.splice(i, 1) - if (data.list) { - Anot.Array.remove(data.list, data) - delete disposeQueue[data.uuid] - } - continue - } - if (shouldDispose(data.element)) { - //如果它的虚拟DOM不在VTree上或其属性不在VM上 - disposeQueue.splice(i, 1) - Anot.Array.remove(data.list, data) - disposeData(data) - //Anot会在每次全量更新时,比较上次执行时间, - //假若距离上次有半秒,就会发起一次GC,并且只检测当中的500个绑定 - //而一个正常的页面不会超过2000个绑定(500即取其4分之一) - //用户频繁操作页面,那么2,3秒内就把所有绑定检测一遍,将无效的绑定移除 - if (threshold++ > 500) { - lastGCIndex = i - break - } - continue - } - data.i++ - //基于检测频率,如果检测过7次,可以认为其是长久存在的节点,那么以后每7次才检测一次 - if (data.i === 7) { - data.i = 14 - } - } else { - data.i-- - } - } - beginTime = new Date() -} - -function disposeData(data) { - delete disposeQueue[data.uuid] // 先清除,不然无法回收了 - data.element = null - data.rollback && data.rollback() - for (var key in data) { - data[key] = null - } -} - -function shouldDispose(el) { - try { - //IE下,如果文本节点脱离DOM树,访问parentNode会报错 - var fireError = el.parentNode.nodeType - } catch (e) { - return true - } - if (el.ifRemove) { - // 如果节点被放到ifGroup,才移除 - if (!root.contains(el.ifRemove) && ifGroup === el.parentNode) { - el.parentNode && el.parentNode.removeChild(el) - return true - } - } - return el.msRetain - ? 0 - : el.nodeType === 1 - ? !root.contains(el) - : !Anot.contains(root, el) -} -/************************************************************************ - * HTML处理(parseHTML, innerHTML, clearHTML) * - *************************************************************************/ - -//parseHTML的辅助变量 -var tagHooks = new function() { - // jshint ignore:line - Anot.mix(this, { - option: DOC.createElement('select'), - thead: DOC.createElement('table'), - td: DOC.createElement('tr'), - area: DOC.createElement('map'), - tr: DOC.createElement('tbody'), - col: DOC.createElement('colgroup'), - legend: DOC.createElement('fieldset'), - _default: DOC.createElement('div'), - g: DOC.createElementNS('http://www.w3.org/2000/svg', 'svg') - }) - this.optgroup = this.option - this.tbody = this.tfoot = this.colgroup = this.caption = this.thead - this.th = this.td -}() // jshint ignore:line -String( - 'circle,defs,ellipse,image,line,path,polygon,polyline,rect,symbol,text,use' -).replace(rword, function(tag) { - tagHooks[tag] = tagHooks.g //处理SVG -}) - -var rtagName = /<([\w:]+)/ -var rxhtml = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi -var scriptTypes = oneObject([ - '', - 'text/javascript', - 'text/ecmascript', - 'application/ecmascript', - 'application/javascript' -]) -var script = DOC.createElement('script') -var rhtml = /<|&#?\w+;/ - -Anot.parseHTML = function(html) { - var fragment = anotFragment.cloneNode(false) - if (typeof html !== 'string') { - return fragment - } - if (!rhtml.test(html)) { - fragment.appendChild(DOC.createTextNode(html)) - return fragment - } - html = html.replace(rxhtml, '<$1>').trim() - var tag = (rtagName.exec(html) || ['', ''])[1].toLowerCase(), - //取得其标签名 - wrapper = tagHooks[tag] || tagHooks._default, - firstChild - wrapper.innerHTML = html - var els = wrapper.getElementsByTagName('script') - if (els.length) { - //使用innerHTML生成的script节点不会发出请求与执行text属性 - for (var i = 0, el; (el = els[i++]); ) { - if (scriptTypes[el.type]) { - var neo = script.cloneNode(false) //FF不能省略参数 - ap.forEach.call(el.attributes, function(attr) { - neo.setAttribute(attr.name, attr.value) - }) // jshint ignore:line - neo.text = el.text - el.parentNode.replaceChild(neo, el) - } - } - } - - while ((firstChild = wrapper.firstChild)) { - // 将wrapper上的节点转移到文档碎片上! - fragment.appendChild(firstChild) - } - return fragment -} - -Anot.innerHTML = function(node, html) { - var a = this.parseHTML(html) - this.clearHTML(node).appendChild(a) -} - -Anot.clearHTML = function(node) { - node.textContent = '' - while (node.firstChild) { - node.removeChild(node.firstChild) - } - return node -} -/********************************************************************* - * Anot的原型方法定义区 * - **********************************************************************/ - -function hyphen(target) { - //转换为连字符线风格 - return target.replace(/([a-z\d])([A-Z]+)/g, '$1-$2').toLowerCase() -} - -function camelize(target) { - //转换为驼峰风格 - if (target.indexOf('-') < 0 && target.indexOf('_') < 0) { - return target //提前判断,提高getStyle等的效率 - } - return target.replace(/[-_][^-_]/g, function(match) { - return match.charAt(1).toUpperCase() - }) -} - -'add,remove'.replace(rword, function(method) { - Anot.fn[method + 'Class'] = function(cls) { - var el = this[0] - //https://developer.mozilla.org/zh-CN/docs/Mozilla/Firefox/Releases/26 - if (cls && typeof cls === 'string' && el && el.nodeType === 1) { - cls.replace(/\S+/g, function(c) { - el.classList[method](c) - }) - } - return this - } -}) - -Anot.fn.mix({ - attr: function(name, value) { - if (arguments.length === 2) { - this[0].setAttribute(name, value) - return this - } else { - return this[0].getAttribute(name) - } - }, - data: function(name, value) { - var len = arguments.length - var dataset = this[0].dataset - name = hyphen(name || '') - if (!name) { - len = 0 - } - switch (len) { - case 2: - dataset[name] = value - return this - case 1: - var val = dataset[name] - return parseData(val) - case 0: - var ret = createMap() - for (var i in dataset) { - ret[i] = parseData(dataset[i]) - } - return ret - } - }, - removeData: function(name) { - name = 'data-' + hyphen(name) - this[0].removeAttribute(name) - return this - }, - css: function(name, value) { - if (Anot.isPlainObject(name)) { - for (var i in name) { - Anot.css(this, i, name[i]) - } - } else { - var ret = Anot.css(this, name, value) - } - return ret !== void 0 ? ret : this - }, - position: function() { - var offsetParent, - offset, - elem = this[0], - parentOffset = { - top: 0, - left: 0 - } - if (!elem) { - return - } - if (this.css('position') === 'fixed') { - offset = elem.getBoundingClientRect() - } else { - offsetParent = this.offsetParent() //得到真正的offsetParent - offset = this.offset() // 得到正确的offsetParent - if (offsetParent[0].tagName !== 'HTML') { - parentOffset = offsetParent.offset() - } - parentOffset.top += Anot.css(offsetParent[0], 'borderTopWidth', true) - parentOffset.left += Anot.css(offsetParent[0], 'borderLeftWidth', true) - // Subtract offsetParent scroll positions - parentOffset.top -= offsetParent.scrollTop() - parentOffset.left -= offsetParent.scrollLeft() - } - return { - top: offset.top - parentOffset.top - Anot.css(elem, 'marginTop', true), - left: offset.left - parentOffset.left - Anot.css(elem, 'marginLeft', true) - } - }, - offsetParent: function() { - var offsetParent = this[0].offsetParent - while (offsetParent && Anot.css(offsetParent, 'position') === 'static') { - offsetParent = offsetParent.offsetParent - } - return Anot(offsetParent || root) - }, - bind: function(type, fn, phase) { - if (this[0]) { - //此方法不会链 - return Anot.bind(this[0], type, fn, phase) - } - }, - unbind: function(type, fn, phase) { - if (this[0]) { - Anot.unbind(this[0], type, fn, phase) - } - return this - }, - val: function(value) { - var node = this[0] - if (node && node.nodeType === 1) { - var get = arguments.length === 0 - var access = get ? ':get' : ':set' - var fn = valHooks[getValType(node) + access] - if (fn) { - var val = fn(node, value) - } else if (get) { - return (node.value || '').replace(/\r/g, '') - } else { - node.value = value - } - } - return get ? val : this - } -}) - -Anot.parseJSON = JSON.parse - -var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/ -function parseData(data) { - try { - if (typeof data === 'object') return data - data = - data === 'true' - ? true - : data === 'false' - ? false - : data === 'null' - ? null - : +data + '' === data - ? +data - : rbrace.test(data) - ? JSON.parse(data) - : data - } catch (e) {} - return data -} - -Anot.fireDom = function(elem, type, opts) { - var hackEvent = DOC.createEvent('Events') - hackEvent.initEvent(type, true, true) - Anot.mix(hackEvent, opts) - elem.dispatchEvent(hackEvent) -} - -Anot.each( - { - scrollLeft: 'pageXOffset', - scrollTop: 'pageYOffset' - }, - function(method, prop) { - Anot.fn[method] = function(val) { - var node = this[0] || {}, - win = getWindow(node), - top = method === 'scrollTop' - if (!arguments.length) { - return win ? win[prop] : node[method] - } else { - if (win) { - win.scrollTo(!top ? val : win[prop], top ? val : win[prop]) - } else { - node[method] = val - } - } - } - } -) - -function getWindow(node) { - return node.window && node.document - ? node - : node.nodeType === 9 - ? node.defaultView - : false -} - -//=============================css相关================================== - -var cssHooks = (Anot.cssHooks = createMap()) -var prefixes = ['', '-webkit-', '-moz-', '-ms-'] //去掉opera-15的支持 -var cssMap = { - float: 'cssFloat' -} - -Anot.cssNumber = oneObject( - 'animationIterationCount,animationIterationCount,columnCount,order,flex,flexGrow,flexShrink,fillOpacity,fontWeight,lineHeight,opacity,orphans,widows,zIndex,zoom' -) - -Anot.cssName = function(name, host, camelCase) { - if (cssMap[name]) { - return cssMap[name] - } - host = host || root.style - for (var i = 0, n = prefixes.length; i < n; i++) { - camelCase = camelize(prefixes[i] + name) - if (camelCase in host) { - return (cssMap[name] = camelCase) - } - } - return null -} - -cssHooks['@:set'] = function(node, name, value) { - node.style[name] = value -} - -cssHooks['@:get'] = function(node, name) { - if (!node || !node.style) { - throw new Error('getComputedStyle要求传入一个节点 ' + node) - } - var ret, - computed = getComputedStyle(node) - if (computed) { - ret = name === 'filter' ? computed.getPropertyValue(name) : computed[name] - if (ret === '') { - ret = node.style[name] //其他浏览器需要我们手动取内联样式 - } - } - return ret -} -cssHooks['opacity:get'] = function(node) { - var ret = cssHooks['@:get'](node, 'opacity') - return ret === '' ? '1' : ret -} - -'top,left'.replace(rword, function(name) { - cssHooks[name + ':get'] = function(node) { - var computed = cssHooks['@:get'](node, name) - return /px$/.test(computed) ? computed : Anot(node).position()[name] + 'px' - } -}) - -var cssShow = { - position: 'absolute', - visibility: 'hidden', - display: 'block' -} -var rdisplayswap = /^(none|table(?!-c[ea]).+)/ -function showHidden(node, array) { - //http://www.cnblogs.com/rubylouvre/archive/2012/10/27/2742529.html - if (node.offsetWidth <= 0) { - //opera.offsetWidth可能小于0 - var styles = getComputedStyle(node, null) - if (rdisplayswap.test(styles['display'])) { - var obj = { - node: node - } - for (var name in cssShow) { - obj[name] = styles[name] - node.style[name] = cssShow[name] - } - array.push(obj) - } - var _parent = node.parentNode - if (_parent && _parent.nodeType === 1) { - showHidden(_parent, array) - } - } -} - -'Width,Height'.replace(rword, function(name) { - //fix 481 - var method = name.toLowerCase(), - clientProp = 'client' + name, - scrollProp = 'scroll' + name, - offsetProp = 'offset' + name - cssHooks[method + ':get'] = function(node, which, override) { - var boxSizing = -4 - if (typeof override === 'number') { - boxSizing = override - } - which = name === 'Width' ? ['Left', 'Right'] : ['Top', 'Bottom'] - var ret = node[offsetProp] // border-box 0 - if (boxSizing === 2) { - // margin-box 2 - return ( - ret + - Anot.css(node, 'margin' + which[0], true) + - Anot.css(node, 'margin' + which[1], true) - ) - } - if (boxSizing < 0) { - // padding-box -2 - ret = - ret - - Anot.css(node, 'border' + which[0] + 'Width', true) - - Anot.css(node, 'border' + which[1] + 'Width', true) - } - if (boxSizing === -4) { - // content-box -4 - ret = - ret - - Anot.css(node, 'padding' + which[0], true) - - Anot.css(node, 'padding' + which[1], true) - } - return ret - } - cssHooks[method + '&get'] = function(node) { - var hidden = [] - showHidden(node, hidden) - var val = cssHooks[method + ':get'](node) - for (var i = 0, obj; (obj = hidden[i++]); ) { - node = obj.node - for (var n in obj) { - if (typeof obj[n] === 'string') { - node.style[n] = obj[n] - } - } - } - return val - } - Anot.fn[method] = function(value) { - //会忽视其display - var node = this[0] - if (arguments.length === 0) { - if (node.setTimeout) { - //取得窗口尺寸,IE9后可以用node.innerWidth /innerHeight代替 - return node['inner' + name] - } - if (node.nodeType === 9) { - //取得页面尺寸 - var doc = node.documentElement - //FF chrome html.scrollHeight< body.scrollHeight - //IE 标准模式 : html.scrollHeight> body.scrollHeight - //IE 怪异模式 : html.scrollHeight 最大等于可视窗口多一点? - return Math.max( - node.body[scrollProp], - doc[scrollProp], - node.body[offsetProp], - doc[offsetProp], - doc[clientProp] - ) - } - return cssHooks[method + '&get'](node) - } else { - return this.css(method, value) - } - } - Anot.fn['inner' + name] = function() { - return cssHooks[method + ':get'](this[0], void 0, -2) - } - Anot.fn['outer' + name] = function(includeMargin) { - return cssHooks[method + ':get']( - this[0], - void 0, - includeMargin === true ? 2 : 0 - ) - } -}) - -Anot.fn.offset = function() { - //取得距离页面左右角的坐标 - var node = this[0] - try { - var rect = node.getBoundingClientRect() - // Make sure element is not hidden (display: none) or disconnected - // https://github.com/jquery/jquery/pull/2043/files#r23981494 - if (rect.width || rect.height || node.getClientRects().length) { - var doc = node.ownerDocument - var root = doc.documentElement - var win = doc.defaultView - return { - top: rect.top + win.pageYOffset - root.clientTop, - left: rect.left + win.pageXOffset - root.clientLeft - } - } - } catch (e) { - return { - left: 0, - top: 0 - } - } -} - -//=============================val相关======================= - -function getValType(elem) { - var ret = elem.tagName.toLowerCase() - return ret === 'input' && /checkbox|radio/.test(elem.type) ? 'checked' : ret -} - -var valHooks = { - 'select:get': function(node, value) { - var option, - options = node.options, - index = node.selectedIndex, - one = node.type === 'select-one' || index < 0, - values = one ? null : [], - max = one ? index + 1 : options.length, - i = index < 0 ? max : one ? index : 0 - for (; i < max; i++) { - option = options[i] - //旧式IE在reset后不会改变selected,需要改用i === index判定 - //我们过滤所有disabled的option元素,但在safari5下,如果设置select为disable,那么其所有孩子都disable - //因此当一个元素为disable,需要检测其是否显式设置了disable及其父节点的disable情况 - if ((option.selected || i === index) && !option.disabled) { - value = option.value - if (one) { - return value - } - //收集所有selected值组成数组返回 - values.push(value) - } - } - return values - }, - 'select:set': function(node, values, optionSet) { - values = [].concat(values) //强制转换为数组 - for (var i = 0, el; (el = node.options[i++]); ) { - if ((el.selected = values.indexOf(el.value) > -1)) { - optionSet = true - } - } - if (!optionSet) { - node.selectedIndex = -1 - } - } -} -var keyMap = {} -var keys = [ - 'break,case,catch,continue,debugger,default,delete,do,else,false', - 'finally,for,function,if,in,instanceof,new,null,return,switch,this', - 'throw,true,try,typeof,var,void,while,with' /* 关键字*/, - 'abstract,boolean,byte,char,class,const,double,enum,export,extends', - 'final,float,goto,implements,import,int,interface,long,native', - 'package,private,protected,public,short,static,super,synchronized', - 'throws,transient,volatile' /*保留字*/, - 'arguments,let,yield,async,await,undefined' -].join(',') -keys.replace(/\w+/g, function(a) { - keyMap[a] = true -}) - -var ridentStart = /[a-z_$]/i -var rwhiteSpace = /[\s\uFEFF\xA0]/ -function getIdent(input, lastIndex) { - var result = [] - var subroutine = !!lastIndex - lastIndex = lastIndex || 0 - //将表达式中的标识符抽取出来 - var state = 'unknown' - var variable = '' - for (var i = 0; i < input.length; i++) { - var c = input.charAt(i) - if (c === "'" || c === '"') { - //字符串开始 - if (state === 'unknown') { - state = c - } else if (state === c) { - //字符串结束 - state = 'unknown' - } - } else if (c === '\\') { - if (state === "'" || state === '"') { - i++ - } - } else if (ridentStart.test(c)) { - //碰到标识符 - if (state === 'unknown') { - state = 'variable' - variable = c - } else if (state === 'maybePath') { - variable = result.pop() - variable += '.' + c - state = 'variable' - } else if (state === 'variable') { - variable += c - } - } else if (/\w/.test(c)) { - if (state === 'variable') { - variable += c - } - } else if (c === '.') { - if (state === 'variable') { - if (variable) { - result.push(variable) - variable = '' - state = 'maybePath' - } - } - } else if (c === '[') { - if (state === 'variable' || state === 'maybePath') { - if (variable) { - //如果前面存在变量,收集它 - result.push(variable) - variable = '' - } - var lastLength = result.length - var last = result[lastLength - 1] - var innerResult = getIdent(input.slice(i), i) - if (innerResult.length) { - //如果括号中存在变量,那么这里添加通配符 - result[lastLength - 1] = last + '.*' - result = innerResult.concat(result) - } else { - //如果括号中的东西是确定的,直接转换为其子属性 - var content = input.slice(i + 1, innerResult.i) - try { - var text = scpCompile(['return ' + content])() - result[lastLength - 1] = last + '.' + text - } catch (e) {} - } - state = 'maybePath' //]后面可能还接东西 - i = innerResult.i - } - } else if (c === ']') { - if (subroutine) { - result.i = i + lastIndex - addVar(result, variable) - return result - } - } else if (rwhiteSpace.test(c) && c !== '\r' && c !== '\n') { - if (state === 'variable') { - if (addVar(result, variable)) { - state = 'maybePath' // aaa . bbb 这样的情况 - } - variable = '' - } - } else { - addVar(result, variable) - state = 'unknown' - variable = '' - } - } - addVar(result, variable) - return result -} - -function addVar(array, element) { - if (element && !keyMap[element]) { - array.push(element) - return true - } -} - -function addAssign(vars, vmodel, name, binding) { - var ret = [] - var prefix = ' = ' + name + '.' - for (var i = vars.length, prop; (prop = vars[--i]); ) { - var arr = prop.split('.') - var first = arr[0] - - if (vmodel.hasOwnProperty(first)) { - // log(first, prop, prefix, vmodel) - ret.push(first + prefix + first) - binding.observers.push({ - v: vmodel, - p: prop, - type: Anot.type(vmodel[first]) - }) - vars.splice(i, 1) - } - } - return ret -} - -var rproxy = /(proxy\-[a-z]+)\-[\-0-9a-f]+$/ -var variablePool = new Cache(218) -//缓存求值函数,以便多次利用 -var evaluatorPool = new Cache(128) - -function getVars(expr) { - expr = expr.trim() - var ret = variablePool.get(expr) - if (ret) { - return ret.concat() - } - var array = getIdent(expr) - var uniq = {} - var result = [] - for (var i = 0, el; (el = array[i++]); ) { - if (!uniq[el]) { - uniq[el] = 1 - result.push(el) - } - } - return variablePool.put(expr, result).concat() -} - -function parseExpr(expr, vmodels, binding) { - var filters = binding.filters - if (typeof filters === 'string' && filters.trim() && !binding._filters) { - binding._filters = parseFilter(filters.trim()) - } - - var vars = getVars(expr) - var expose = new Date() - 0 - var assigns = [] - var names = [] - var args = [] - binding.observers = [] - - for (var i = 0, sn = vmodels.length; i < sn; i++) { - if (vars.length) { - var name = 'vm' + expose + '_' + i - names.push(name) - args.push(vmodels[i]) - assigns.push.apply(assigns, addAssign(vars, vmodels[i], name, binding)) - } - } - binding.args = args - var dataType = binding.type - var exprId = - vmodels.map(function(el) { - return String(el.$id).replace(rproxy, '$1') - }) + - expr + - dataType - // log(expr, '---------------', assigns) - var getter = evaluatorPool.get(exprId) //直接从缓存,免得重复生成 - if (getter) { - if (dataType === 'duplex') { - var setter = evaluatorPool.get(exprId + 'setter') - binding.setter = setter.apply(setter, binding.args) - } - return (binding.getter = getter) - } - - // expr的字段不可枚举时,补上一个随机变量, 避免抛出异常 - if (!assigns.length) { - assigns.push('fix' + expose) - } - - if (dataType === 'duplex') { - var nameOne = {} - assigns.forEach(function(a) { - var arr = a.split('=') - nameOne[arr[0].trim()] = arr[1].trim() - }) - expr = expr.replace(/[\$\w]+/, function(a) { - return nameOne[a] ? nameOne[a] : a - }) - /* jshint ignore:start */ - var fn2 = scpCompile( - names.concat( - '"use strict";\n return function(vvv){' + expr + ' = vvv\n}\n' - ) - ) - /* jshint ignore:end */ - evaluatorPool.put(exprId + 'setter', fn2) - binding.setter = fn2.apply(fn2, binding.args) - } - - if (dataType === 'on') { - //事件绑定 - if (expr.indexOf('(') === -1) { - expr += '.call(' + names[names.length - 1] + ', $event)' - } else { - expr = expr.replace('(', '.call(' + names[names.length - 1] + ', ') - } - names.push('$event') - expr = '\nreturn ' + expr + ';' //IE全家 Function("return ")出错,需要Function("return ;") - var lastIndex = expr.lastIndexOf('\nreturn') - var header = expr.slice(0, lastIndex) - var footer = expr.slice(lastIndex) - expr = header + '\n' + footer - } else { - // 对于非事件绑定的方法, 同样绑定到vm上 - binding.observers.forEach(function(it) { - if (it.type === 'function') { - // log(it, expr) - var reg = new RegExp(it.p + '\\(([^)]*)\\)', 'g') - expr = expr.replace(reg, function(s, m) { - m = m.trim() - return ( - it.p + - '.call(' + - names[names.length - 1] + - (m ? ', ' + m : '') + - ')' - ) - }) - } - }) - expr = '\nreturn ' + expr + ';' //IE全家 Function("return ")出错,需要Function("return ;") - } - - /* jshint ignore:start */ - getter = scpCompile( - names.concat( - "'use strict';\ntry{\n var " + - assigns.join(',\n ') + - expr + - '\n}catch(e){console.log(e)}' - ) - ) - /* jshint ignore:end */ - - return evaluatorPool.put(exprId, getter) -} - -function normalizeExpr(code) { - var hasExpr = rexpr.test(code) //比如:class="width{{w}}"的情况 - if (hasExpr) { - var array = scanExpr(code) - if (array.length === 1) { - return array[0].expr - } - return array - .map(function(el) { - return el.type ? '(' + el.expr + ')' : quote(el.expr) - }) - .join(' + ') - } else { - return code - } -} - -Anot.normalizeExpr = normalizeExpr -Anot.parseExprProxy = parseExpr - -var rthimRightParentheses = /\)\s*$/ -var rthimOtherParentheses = /\)\s*\|/g -var rquoteFilterName = /\|\s*([$\w]+)/g -var rpatchBracket = /"\s*\["/g -var rthimLeftParentheses = /"\s*\(/g -function parseFilter(filters) { - filters = - filters - .replace(rthimRightParentheses, '') //处理最后的小括号 - .replace(rthimOtherParentheses, function() { - //处理其他小括号 - return '],|' - }) - .replace(rquoteFilterName, function(a, b) { - //处理|及它后面的过滤器的名字 - return '[' + quote(b) - }) - .replace(rpatchBracket, function() { - return '"],["' - }) - .replace(rthimLeftParentheses, function() { - return '",' - }) + ']' - /* jshint ignore:start */ - return scpCompile(['return [' + filters + ']'])() - /* jshint ignore:end */ -} - -/********************************************************************* - * 编译系统 * - **********************************************************************/ - -var quote = JSON.stringify -/********************************************************************* - * 扫描系统 * - **********************************************************************/ - -//http://www.w3.org/TR/html5/syntax.html#void-elements -var stopScan = oneObject( - 'area,base,basefont,br,col,command,embed,hr,img,input,link,meta,param,source,track,wbr,noscript,script,style,textarea'.toUpperCase() -) - -function isRef(el) { - return el.hasAttribute('ref') ? el.getAttribute('ref') : null -} - -function checkScan(elem, callback, innerHTML) { - var id = setTimeout(function() { - var currHTML = elem.innerHTML - clearTimeout(id) - if (currHTML === innerHTML) { - callback() - } else { - checkScan(elem, callback, currHTML) - } - }) -} - -function getBindingCallback(elem, name, vmodels) { - var callback = elem.getAttribute(name) - if (callback) { - for (var i = 0, vm; (vm = vmodels[i++]); ) { - if (vm.hasOwnProperty(callback) && typeof vm[callback] === 'function') { - return vm[callback] - } - } - } -} - -function executeBindings(bindings, vmodels) { - for (var i = 0, binding; (binding = bindings[i++]); ) { - binding.vmodels = vmodels - directives[binding.type].init(binding) - - Anot.injectBinding(binding) - if (binding.getter && binding.element.nodeType === 1) { - //移除数据绑定,防止被二次解析 - //chrome使用removeAttributeNode移除不存在的特性节点时会报错 - binding.element.removeAttribute(binding.name) - } - } - bindings.length = 0 -} - -var roneTime = /^\s*::/ -var rmsAttr = /:(\w+)-?(.*)|@(.*)/ - -var events = oneObject( - 'animationend,blur,change,input,click,dblclick,focus,keydown,keypress,keyup,mousedown,mouseenter,mouseleave,mousemove,mouseout,mouseover,mouseup,scan,scroll,submit' -) -var obsoleteAttrs = oneObject( - 'value,title,alt,checked,selected,disabled,readonly,loading,enabled,href,src' -) -function bindingSorter(a, b) { - return a.priority - b.priority -} - -var rnoCollect = /^(:\S+|data-\S+|on[a-z]+|style|class)$/ -var filterTypes = ['html', 'text', 'attr', 'data'] - -function scanAttr(elem, vmodels, match) { - var scanNode = true - if (vmodels.length) { - var attributes = elem.attributes - var bindings = [] - var uniq = {} - for (var i = 0, attr; (attr = attributes[i++]); ) { - var name = attr.name - if (uniq[name]) { - //IE8下:for BUG - continue - } - uniq[name] = 1 - if (attr.specified) { - if ((match = name.match(rmsAttr))) { - //如果是以指定前缀命名的 - var type = match[1] - var param = match[2] || '' - var eparam = match[3] || '' // 事件绑定的简写 - var value = attr.value - if (obsoleteAttrs[type]) { - param = type - type = 'attr' - } - if (eparam) { - param = eparam - type = 'on' - } - if (directives[type]) { - var newValue = value.replace(roneTime, '') - var oneTime = value !== newValue - var binding = { - type: type, - param: param, - element: elem, - name: name, - expr: newValue, - oneTime: oneTime, - uuid: '_' + ++bindingID, - priority: - (directives[type].priority || type.charCodeAt(0) * 10) + - (Number(param.replace(/\D/g, '')) || 0) - } - // 如果指令允许使用过滤器 - if (filterTypes.includes(type)) { - var filters = getToken(value).filters - binding.expr = binding.expr.replace(filters, '') - binding.filters = filters - .replace(rhasHtml, function() { - binding.type = 'html' - binding.group = 1 - return '' - }) - .trim() // jshint ignore:line - } else if (type === 'duplex') { - var hasDuplex = name - } else if (name === ':if-loop') { - binding.priority += 100 - } else if (name === ':attr-value') { - var hasAttrValue = name - } - bindings.push(binding) - } - } - } - } - if (bindings.length) { - bindings.sort(bindingSorter) - - if (hasDuplex && hasAttrValue && elem.type === 'text') { - log('warning!一个控件不能同时定义:attr-value与' + hasDuplex) - } - - for (i = 0; (binding = bindings[i]); i++) { - type = binding.type - if (rnoscanAttrBinding.test(type)) { - return executeBindings(bindings.slice(0, i + 1), vmodels) - } else if (scanNode) { - scanNode = !rnoscanNodeBinding.test(type) - } - } - executeBindings(bindings, vmodels) - } - } - if (scanNode && !stopScan[elem.tagName]) { - scanNodeList(elem, vmodels) //扫描子孙元素 - } -} - -var rnoscanAttrBinding = /^if|for$/ -var rnoscanNodeBinding = /^html|include$/ - -function scanNodeList(elem, vmodels) { - var nodes = Anot.slice(elem.childNodes) - scanNodeArray(nodes, vmodels) -} - -function scanNodeArray(nodes, vmodels) { - function _delay_component(name) { - setTimeout(function() { - Anot.component(name) - }) - } - for (var i = 0, node; (node = nodes[i++]); ) { - switch (node.nodeType) { - case 1: - var elem = node - if (elem.parentNode && elem.parentNode.nodeType === 1) { - // 非组件才检查 ref属性 - var ref = isRef(elem) - if (ref && vmodels.length) { - vmodels[0].$refs[ref] = elem - } - } - - scanTag(node, vmodels) //扫描元素节点 - - if (node.msHasEvent) { - Anot.fireDom(node, 'datasetchanged', { - bubble: node.msHasEvent - }) - } - - break - case 3: - if (rexpr.test(node.nodeValue)) { - scanText(node, vmodels, i) //扫描文本节点 - } - break - } - } -} - -function scanTag(elem, vmodels) { - //扫描顺序 skip(0) --> anot(1) --> :if(10) --> :for(90) - //--> :if-loop(110) --> :attr(970) ...--> :duplex(2000)垫后 - var skip = elem.getAttribute('skip') - var node = elem.getAttributeNode('anot') - var vm = vmodels.concat() - if (typeof skip === 'string') { - return - } else if (node) { - var newVmodel = Anot.vmodels[node.value] - var attrs = aslice.call(elem.attributes, 0) - - if (!newVmodel) { - return - } - - vm = [newVmodel] - - elem.removeAttribute(node.name) //removeAttributeNode不会刷新xx[anot]样式规则 - // 挂载VM对象到相应的元素上 - elem.__VM__ = newVmodel - hideProperty(newVmodel, '$elem', elem) - - if (vmodels.length) { - newVmodel.$up = vmodels[0] - vmodels[0].$children.push(newVmodel) - var props = {} - attrs.forEach(function(attr) { - if (/^:/.test(attr.name)) { - var name = attr.name.match(rmsAttr)[1] - var value = null - if (!name || Anot.directives[name] || events[name]) { - return - } - try { - value = parseExpr(attr.value, vmodels, {}).apply(0, vmodels) - value = toJson(value) - elem.removeAttribute(attr.name) - props[name] = value - } catch (error) { - log( - 'Props parse faild on (%s[class=%s]),', - elem.nodeName, - elem.className, - attr, - error + '' - ) - } - } - }) - // 一旦设定了 props的类型, 就必须传入正确的值 - for (var k in newVmodel.props) { - if (newVmodel.props[k] && newVmodel.props[k].type === 'PropsTypes') { - if (newVmodel.props[k].check(props[k])) { - newVmodel.props[k] = props[k] - delete props[k] - } else { - console.error( - new TypeError( - 'props.' + - k + - ' needs [' + - newVmodel.props[k].checkType + - '], but [' + - newVmodel.props[k].result + - '] given.' - ) - ) - } - } - } - Object.assign(newVmodel.props, props) - props = undefined - } - } - scanAttr(elem, vm) //扫描特性节点 - - if (newVmodel) { - setTimeout(function() { - if (typeof newVmodel.$mounted === 'function') { - newVmodel.$mounted() - } - delete newVmodel.$mounted - }) - } -} -var rhasHtml = /\|\s*html(?:\b|$)/, - r11a = /\|\|/g, - rlt = /</g, - rgt = />/g, - rstringLiteral = /(['"])(\\\1|.)+?\1/g, - rline = /\r?\n/g -function getToken(value) { - if (value.indexOf('|') > 0) { - var scapegoat = value.replace(rstringLiteral, function(_) { - return Array(_.length + 1).join('1') // jshint ignore:line - }) - var index = scapegoat.replace(r11a, '\u1122\u3344').indexOf('|') //干掉所有短路或 - if (index > -1) { - return { - type: 'text', - filters: value.slice(index).trim(), - expr: value.slice(0, index) - } - } - } - return { - type: 'text', - expr: value, - filters: '' - } -} - -function scanExpr(str) { - var tokens = [], - value, - start = 0, - stop - do { - stop = str.indexOf(openTag, start) - if (stop === -1) { - break - } - value = str.slice(start, stop) - if (value) { - // {{ 左边的文本 - tokens.push({ - expr: value - }) - } - start = stop + openTag.length - stop = str.indexOf(closeTag, start) - if (stop === -1) { - break - } - value = str.slice(start, stop) - if (value) { - //处理{{ }}插值表达式 - tokens.push(getToken(value.replace(rline, ''))) - } - start = stop + closeTag.length - } while (1) - value = str.slice(start) - if (value) { - //}} 右边的文本 - tokens.push({ - expr: value - }) - } - return tokens -} - -function scanText(textNode, vmodels, index) { - var bindings = [], - tokens = scanExpr(textNode.data) - if (tokens.length) { - for (var i = 0, token; (token = tokens[i++]); ) { - var node = DOC.createTextNode(token.expr) //将文本转换为文本节点,并替换原来的文本节点 - if (token.type) { - token.expr = token.expr.replace(roneTime, function() { - token.oneTime = true - return '' - }) // jshint ignore:line - token.element = node - token.filters = token.filters.replace(rhasHtml, function() { - token.type = 'html' - return '' - }) // jshint ignore:line - token.pos = index * 1000 + i - bindings.push(token) //收集带有插值表达式的文本 - } - anotFragment.appendChild(node) - } - textNode.parentNode.replaceChild(anotFragment, textNode) - if (bindings.length) executeBindings(bindings, vmodels) - } -} -//使用来自游戏界的双缓冲技术,减少对视图的冗余刷新 -var Buffer = function() { - this.queue = [] -} -Buffer.prototype = { - render: function(isAnimate) { - if (!this.locked) { - this.locked = isAnimate ? root.offsetHeight + 10 : 1 - var me = this - Anot.nextTick(function() { - me.flush() - }) - } - }, - flush: function() { - for (var i = 0, sub; (sub = this.queue[i++]); ) { - sub.update && sub.update() - } - this.locked = 0 - this.queue = [] - } -} - -var buffer = new Buffer() - - -var bools = [ - 'autofocus,autoplay,async,allowTransparency,checked,controls', - 'declare,disabled,defer,defaultChecked,defaultSelected', - 'contentEditable,isMap,loop,multiple,noHref,noResize,noShade', - 'open,readOnly,selected' -].join(',') -var boolMap = {} -bools.replace(rword, function(name) { - boolMap[name.toLowerCase()] = name -}) - -var attrDir = Anot.directive('attr', { - init: function(binding) { - //{{aaa}} --> aaa - //{{aaa}}/bbb.html --> (aaa) + "/bbb.html" - binding.expr = normalizeExpr(binding.expr.trim()) - if (binding.type === 'include') { - var elem = binding.element - effectBinding(elem, binding) - binding.includeRendered = getBindingCallback( - elem, - 'data-rendered', - binding.vmodels - ) - binding.includeLoaded = getBindingCallback( - elem, - 'data-loaded', - binding.vmodels - ) - // 是否直接替换当前容器 - var outer = (binding.includeReplace = elem.hasAttribute('replace')) - if (elem.hasAttribute('cache')) { - binding.templateCache = {} - } - binding.start = DOC.createComment(':include') - binding.end = DOC.createComment(':include-end') - if (outer) { - binding.element = binding.end - binding._element = elem - elem.parentNode.insertBefore(binding.start, elem) - elem.parentNode.insertBefore(binding.end, elem.nextSibling) - } else { - elem.insertBefore(binding.start, elem.firstChild) - elem.appendChild(binding.end) - } - } - }, - update: function(val) { - var elem = this.element - var obj = {} - - val = toJson(val) - - if (this.param) { - if (val && typeof val === 'object') { - if (Array.isArray(val)) { - obj[this.param] = val - } else { - if (Date.isDate(val)) { - obj[this.param] = val.toISOString() - } else { - obj[this.param] = val - } - } - } else { - obj[this.param] = val - } - } else { - if ( - !val || - typeof val !== 'object' || - Array.isArray(val) || - Date.isDate(val) - ) { - return - } - - obj = val - } - - for (var i in obj) { - if (i === 'style') { - elem.style.cssText = obj[i] - continue - } - if (i === 'href' || i === 'src') { - elem[i] = obj[i] - } else { - // 修正这些值的显示 - if (obj[i] === false || obj[i] === null || obj[i] === undefined) { - obj[i] = '' - } - - if ( - typeof elem[i] === 'boolean' || - typeof elem[boolMap[i]] === 'boolean' - ) { - var k = i - if (boolMap[i] && k !== boolMap[i]) { - k = boolMap[i] - } - //布尔属性必须使用el.xxx = true|false方式设值 - obj[i] = !!obj[i] - elem[k] = obj[i] - - if (!obj[i]) { - elem.removeAttribute(k) - continue - } - } - - //SVG只能使用setAttribute(xxx, yyy), HTML的固有属性必须elem.xxx = yyy - var isInnate = rsvg.test(elem) ? false : i in elem.cloneNode(false) - if (isInnate) { - elem[i] = obj[i] - } else { - if (typeof obj[i] === 'object') { - obj[i] = Date.isDate(obj[i]) - ? obj[i].toISOString() - : JSON.stringify(obj[i]) - } - elem.setAttribute(i, obj[i]) - } - } - } - } -}) -//类名定义 :class="{xx: yy}" :class="xx" -Anot.directive('class', { - init: function(binding) { - binding.expr = binding.expr.replace(/\n/g, ' ').replace(/\s+/g, ' ') - - if (binding.type === 'hover' || binding.type === 'active') { - var expr = new Function('return ' + binding.expr)() - - //确保只绑定一次 - if (!binding.hasBindEvent) { - var elem = binding.element - var $elem = Anot(elem) - var activate = 'mouseenter' //在移出移入时切换类名 - var abandon = 'mouseleave' - if (binding.type === 'active') { - //在聚焦失焦中切换类名 - elem.tabIndex = elem.tabIndex || -1 - activate = 'mousedown' - abandon = 'mouseup' - var fn0 = $elem.bind('mouseleave', function() { - $elem.removeClass(expr) - }) - } - } - - var fn1 = $elem.bind(activate, function() { - $elem.addClass(expr) - }) - var fn2 = $elem.bind(abandon, function() { - $elem.removeClass(expr) - }) - binding.rollback = function() { - $elem.unbind('mouseleave', fn0) - $elem.unbind(activate, fn1) - $elem.unbind(abandon, fn2) - } - binding.hasBindEvent = true - } - }, - update: function(val) { - if (this.type !== 'class') { - return - } - var obj = val - if (!obj || this.param) - return log( - 'class指令语法错误 %c %s="%s"', - 'color:#f00', - this.name, - this.expr - ) - - if (typeof obj === 'string') { - obj = {} - obj[val] = true - } - - if (!Anot.isPlainObject(obj)) { - obj = obj.$model - } - - for (var i in obj) { - this.element.classList.toggle(i, !!obj[i]) - } - } -}) - -'hover,active'.replace(rword, function(name) { - directives[name] = directives['class'] -}) -//样式定义 :css-width="200" -//:css="{width: 200}" -Anot.directive('css', { - init: directives.attr.init, - update: function(val) { - var $elem = Anot(this.element) - if (this.param) { - $elem.css(this.param, val) - } else { - if (typeof val !== 'object') { - return log( - ':css指令格式错误 %c %s="%s"', - 'color:#f00', - this.name, - this.expr - ) - } - var obj = val - if (!Anot.isPlainObject(obj)) { - obj = val.$model - } - $elem.css(obj) - } - } -}) -//兼容2种写法 :data-xx="yy", :data="{xx: yy}" -Anot.directive('data', { - priority: 100, - init: directives.attr.init, - update: function(val) { - var $el = Anot(this.element) - if (this.param) { - $el.data(this.param, val) - } else { - if (typeof val !== 'object') { - return log( - ':data指令格式错误 %c %s="%s"', - 'color:#f00', - this.name, - this.expr - ) - } - var obj = val - if (!Anot.isPlainObject(obj)) { - obj = val.$model - } - for (var i in obj) { - $el.data(i, obj[i]) - } - } - } -}) -//双工绑定 -var rduplexType = /^(?:checkbox|radio)$/ -var rduplexParam = /^(?:radio|checked)$/ -var rnoduplexInput = /^(file|button|reset|submit|checkbox|radio|range)$/ -var duplexBinding = Anot.directive('duplex', { - priority: 2000, - init: function(binding, hasCast) { - var elem = binding.element - var vmodels = binding.vmodels - binding.changed = getBindingCallback(elem, 'data-changed', vmodels) || noop - var params = [] - var casting = oneObject('string,number,boolean,checked') - if (elem.type === 'radio' && binding.param === '') { - binding.param = 'checked' - } - - binding.param.replace(rw20g, function(name) { - if (rduplexType.test(elem.type) && rduplexParam.test(name)) { - name = 'checked' - binding.isChecked = true - binding.xtype = 'radio' - } - - if (casting[name]) { - hasCast = true - } - Anot.Array.ensure(params, name) - }) - if (!hasCast) { - params.push('string') - } - binding.param = params.join('-') - if (!binding.xtype) { - binding.xtype = - elem.tagName === 'SELECT' - ? 'select' - : elem.type === 'checkbox' - ? 'checkbox' - : elem.type === 'radio' - ? 'radio' - : /^change/.test(elem.getAttribute('data-event')) - ? 'change' - : 'input' - } - elem.expr = binding.expr - //===================绑定事件====================== - var bound = (binding.bound = function(type, callback) { - elem.addEventListener(type, callback, false) - var old = binding.rollback - binding.rollback = function() { - elem.anotSetter = null - Anot.unbind(elem, type, callback) - old && old() - } - }) - function callback(value) { - binding.changed.call(this, value) - } - var composing = false - function compositionStart() { - composing = true - } - function compositionEnd() { - composing = false - setTimeout(updateVModel) - } - var updateVModel = function(e) { - var val = elem.value - //防止递归调用形成死循环 - //处理中文输入法在minlengh下引发的BUG - if (composing || val === binding.oldValue || binding.pipe === null) { - return - } - - var lastValue = binding.pipe( - val, - binding, - 'get' - ) - binding.oldValue = val - binding.setter(lastValue) - - callback.call(elem, lastValue) - Anot.fireDom(elem, 'change') - } - switch (binding.xtype) { - case 'radio': - bound('click', function() { - var lastValue = binding.pipe( - elem.value, - binding, - 'get' - ) - binding.setter(lastValue) - callback.call(elem, lastValue) - }) - break - case 'checkbox': - bound('change', function() { - var method = elem.checked ? 'ensure' : 'remove' - var array = binding.getter.apply(0, binding.vmodels) - if (!Array.isArray(array)) { - log(':duplex应用于checkbox上要对应一个数组') - array = [array] - } - var val = binding.pipe( - elem.value, - binding, - 'get' - ) - Anot.Array[method](array, val) - callback.call(elem, array) - }) - break - case 'change': - bound('change', updateVModel) - break - case 'input': - bound('input', updateVModel) - bound('keyup', updateVModel) - bound('compositionstart', compositionStart) - bound('compositionend', compositionEnd) - bound('DOMAutoComplete', updateVModel) - break - case 'select': - bound('change', function() { - var val = Anot(elem).val() //字符串或字符串数组 - if (Array.isArray(val)) { - val = val.map(function(v) { - return binding.pipe( - v, - binding, - 'get' - ) - }) - } else { - val = binding.pipe( - val, - binding, - 'get' - ) - } - if (val + '' !== binding.oldValue) { - try { - binding.setter(val) - } catch (ex) { - log(ex) - } - } - }) - bound('datasetchanged', function(e) { - if (e.bubble === 'selectDuplex') { - var value = binding._value - var curValue = Array.isArray(value) ? value.map(String) : value + '' - Anot(elem).val(curValue) - elem.oldValue = curValue + '' - callback.call(elem, curValue) - } - }) - break - } - if (binding.xtype === 'input' && !rnoduplexInput.test(elem.type)) { - if (elem.type !== 'hidden') { - bound('focus', function() { - elem.msFocus = true - }) - bound('blur', function() { - elem.msFocus = false - }) - } - elem.anotSetter = updateVModel //#765 - watchValueInTimer(function() { - if (root.contains(elem)) { - if (!elem.msFocus) { - updateVModel() - } - } else if (!elem.msRetain) { - return false - } - }) - } - }, - update: function(value) { - var elem = this.element, - binding = this, - curValue - if (!this.init) { - var cpipe = binding.pipe || (binding.pipe = pipe) - cpipe(null, binding, 'init') - this.init = 1 - } - switch (this.xtype) { - case 'input': - elem.value = value - break - case 'change': - curValue = this.pipe( - value, - this, - 'set' - ) //fix #673 - if (curValue !== this.oldValue) { - var fixCaret = false - if (elem.msFocus) { - try { - var start = elem.selectionStart - var end = elem.selectionEnd - if (start === end) { - var pos = start - fixCaret = true - } - } catch (e) {} - } - elem.value = this.oldValue = curValue - if (fixCaret && !elem.readOnly) { - elem.selectionStart = elem.selectionEnd = pos - } - } - break - case 'radio': - curValue = binding.isChecked ? !!value : value + '' === elem.value - elem.checked = curValue - break - case 'checkbox': - var array = [].concat(value) //强制转换为数组 - curValue = this.pipe( - elem.value, - this, - 'get' - ) - elem.checked = array.indexOf(curValue) > -1 - break - case 'select': - //必须变成字符串后才能比较 - binding._value = value - if (!elem.msHasEvent) { - elem.msHasEvent = 'selectDuplex' - //必须等到其孩子准备好才触发 - } else { - Anot.fireDom(elem, 'datasetchanged', { - bubble: elem.msHasEvent - }) - } - break - } - } -}) - -function fixNull(val) { - return val == null ? '' : val -} -Anot.duplexHooks = { - checked: { - get: function(val, binding) { - return !binding.oldValue - } - }, - string: { - get: function(val) { - //同步到VM - return val - }, - set: fixNull - }, - boolean: { - get: function(val) { - return val === 'true' - }, - set: fixNull - }, - number: { - get: function(val, binding) { - var number = +val - if (+val === number) { - return number - } - return 0 - }, - set: fixNull - } -} - -function pipe(val, binding, action, e) { - binding.param.replace(rw20g, function(name) { - var hook = Anot.duplexHooks[name] - if (hook && typeof hook[action] === 'function') { - val = hook[action](val, binding) - } - }) - return val -} - -var TimerID, - ribbon = [] - -Anot.tick = function(fn) { - if (ribbon.push(fn) === 1) { - TimerID = setInterval(ticker, 60) - } -} - -function ticker() { - for (var n = ribbon.length - 1; n >= 0; n--) { - var el = ribbon[n] - if (el() === false) { - ribbon.splice(n, 1) - } - } - if (!ribbon.length) { - clearInterval(TimerID) - } -} - -var watchValueInTimer = noop -new function() { - // jshint ignore:line - try { - //#272 IE9-IE11, firefox - var setters = {} - var aproto = HTMLInputElement.prototype - var bproto = HTMLTextAreaElement.prototype - function newSetter(value) { - // jshint ignore:line - setters[this.tagName].call(this, value) - if (!this.msFocus && this.anotSetter) { - this.anotSetter() - } - } - var inputProto = HTMLInputElement.prototype - Object.getOwnPropertyNames(inputProto) //故意引发IE6-8等浏览器报错 - setters['INPUT'] = Object.getOwnPropertyDescriptor(aproto, 'value').set - - Object.defineProperty(aproto, 'value', { - set: newSetter - }) - setters['TEXTAREA'] = Object.getOwnPropertyDescriptor(bproto, 'value').set - Object.defineProperty(bproto, 'value', { - set: newSetter - }) - } catch (e) { - //在chrome 43中 :duplex终于不需要使用定时器实现双向绑定了 - // http://updates.html5rocks.com/2015/04/DOM-attributes-now-on-the-prototype - // https://docs.google.com/document/d/1jwA8mtClwxI-QJuHT7872Z0pxpZz8PBkf2bGAbsUtqs/edit?pli=1 - watchValueInTimer = Anot.tick - } -}() // jshint ignore:line -/*-------------动画------------*/ - -Anot.directive('effect', { - priority: 5, - init: function(binding) { - var text = binding.expr, - className, - rightExpr - var colonIndex = text - .replace(rexprg, function(a) { - return a.replace(/./g, '0') - }) - .indexOf(':') //取得第一个冒号的位置 - if (colonIndex === -1) { - // 比如 :class/effect="aaa bbb ccc" 的情况 - className = text - rightExpr = true - } else { - // 比如 :class/effect-1="ui-state-active:checked" 的情况 - className = text.slice(0, colonIndex) - rightExpr = text.slice(colonIndex + 1) - } - if (!rexpr.test(text)) { - className = quote(className) - } else { - className = normalizeExpr(className) - } - binding.expr = '[' + className + ',' + rightExpr + ']' - }, - update: function(arr) { - var name = arr[0] - var elem = this.element - if (elem.getAttribute('data-effect-name') === name) { - return - } else { - elem.removeAttribute('data-effect-driver') - } - var inlineStyles = elem.style - var computedStyles = window.getComputedStyle - ? window.getComputedStyle(elem) - : null - var useAni = false - if (computedStyles && (supportTransition || supportAnimation)) { - //如果支持CSS动画 - var duration = - inlineStyles[transitionDuration] || computedStyles[transitionDuration] - if (duration && duration !== '0s') { - elem.setAttribute('data-effect-driver', 't') - useAni = true - } - - if (!useAni) { - duration = - inlineStyles[animationDuration] || computedStyles[animationDuration] - if (duration && duration !== '0s') { - elem.setAttribute('data-effect-driver', 'a') - useAni = true - } - } - } - - if (!useAni) { - if (Anot.effects[name]) { - elem.setAttribute('data-effect-driver', 'j') - useAni = true - } - } - if (useAni) { - elem.setAttribute('data-effect-name', name) - } - } -}) - -Anot.effects = {} -Anot.effect = function(name, callbacks) { - Anot.effects[name] = callbacks -} - -var supportTransition = false -var supportAnimation = false - -var transitionEndEvent -var animationEndEvent -var transitionDuration = Anot.cssName('transition-duration') -var animationDuration = Anot.cssName('animation-duration') -new function() { - // jshint ignore:line - var checker = { - TransitionEvent: 'transitionend', - WebKitTransitionEvent: 'webkitTransitionEnd', - OTransitionEvent: 'oTransitionEnd', - otransitionEvent: 'otransitionEnd' - } - var tran - //有的浏览器同时支持私有实现与标准写法,比如webkit支持前两种,Opera支持1、3、4 - for (var name in checker) { - if (window[name]) { - tran = checker[name] - break - } - try { - var a = document.createEvent(name) - tran = checker[name] - break - } catch (e) {} - } - if (typeof tran === 'string') { - supportTransition = true - transitionEndEvent = tran - } - - //大致上有两种选择 - //IE10+, Firefox 16+ & Opera 12.1+: animationend - //Chrome/Safari: webkitAnimationEnd - //http://blogs.msdn.com/b/davrous/archive/2011/12/06/introduction-to-css3-animat ions.aspx - //IE10也可以使用MSAnimationEnd监听,但是回调里的事件 type依然为animationend - // el.addEventListener("MSAnimationEnd", function(e) { - // alert(e.type)// animationend!!! - // }) - checker = { - AnimationEvent: 'animationend', - WebKitAnimationEvent: 'webkitAnimationEnd' - } - var ani - for (name in checker) { - if (window[name]) { - ani = checker[name] - break - } - } - if (typeof ani === 'string') { - supportTransition = true - animationEndEvent = ani - } -}() - -var effectPool = [] //重复利用动画实例 -function effectFactory(el, opts) { - if (!el || el.nodeType !== 1) { - return null - } - if (opts) { - var name = opts.effectName - var driver = opts.effectDriver - } else { - name = el.getAttribute('data-effect-name') - driver = el.getAttribute('data-effect-driver') - } - if (!name || !driver) { - return null - } - - var instance = effectPool.pop() || new Effect() - instance.el = el - instance.driver = driver - instance.useCss = driver !== 'j' - if (instance.useCss) { - opts && Anot(el).addClass(opts.effectClass) - instance.cssEvent = driver === 't' ? transitionEndEvent : animationEndEvent - } - instance.name = name - instance.callbacks = Anot.effects[name] || {} - - return instance -} - -function effectBinding(elem, binding) { - var name = elem.getAttribute('data-effect-name') - if (name) { - binding.effectName = name - binding.effectDriver = elem.getAttribute('data-effect-driver') - var stagger = +elem.getAttribute('data-effect-stagger') - binding.effectLeaveStagger = - +elem.getAttribute('data-effect-leave-stagger') || stagger - binding.effectEnterStagger = - +elem.getAttribute('data-effect-enter-stagger') || stagger - binding.effectClass = elem.className || NaN - } -} -function upperFirstChar(str) { - return str.replace(/^[\S]/g, function(m) { - return m.toUpperCase() - }) -} -var effectBuffer = new Buffer() -function Effect() {} //动画实例,做成类的形式,是为了共用所有原型方法 - -Effect.prototype = { - contrustor: Effect, - enterClass: function() { - return getEffectClass(this, 'enter') - }, - leaveClass: function() { - return getEffectClass(this, 'leave') - }, - // 共享一个函数 - actionFun: function(name, before, after) { - if (document.hidden) { - return - } - var me = this - var el = me.el - var isLeave = name === 'leave' - name = isLeave ? 'leave' : 'enter' - var oppositeName = isLeave ? 'enter' : 'leave' - callEffectHook(me, 'abort' + upperFirstChar(oppositeName)) - callEffectHook(me, 'before' + upperFirstChar(name)) - if (!isLeave) before(el) //这里可能做插入DOM树的操作,因此必须在修改类名前执行 - var cssCallback = function(cancel) { - el.removeEventListener(me.cssEvent, me.cssCallback) - if (isLeave) { - before(el) //这里可能做移出DOM树操作,因此必须位于动画之后 - Anot(el).removeClass(me.cssClass) - } else { - if (me.driver === 'a') { - Anot(el).removeClass(me.cssClass) - } - } - if (cancel !== true) { - callEffectHook(me, 'after' + upperFirstChar(name)) - after && after(el) - } - me.dispose() - } - if (me.useCss) { - if (me.cssCallback) { - //如果leave动画还没有完成,立即完成 - me.cssCallback(true) - } - - me.cssClass = getEffectClass(me, name) - me.cssCallback = cssCallback - - me.update = function() { - el.addEventListener(me.cssEvent, me.cssCallback) - if (!isLeave && me.driver === 't') { - //transtion延迟触发 - Anot(el).removeClass(me.cssClass) - } - } - Anot(el).addClass(me.cssClass) //animation会立即触发 - - effectBuffer.render(true) - effectBuffer.queue.push(me) - } else { - callEffectHook(me, name, cssCallback) - } - }, - enter: function(before, after) { - this.actionFun.apply(this, ['enter'].concat(Anot.slice(arguments))) - }, - leave: function(before, after) { - this.actionFun.apply(this, ['leave'].concat(Anot.slice(arguments))) - }, - dispose: function() { - //销毁与回收到池子中 - this.update = this.cssCallback = null - if (effectPool.unshift(this) > 100) { - effectPool.pop() - } - } -} - -function getEffectClass(instance, type) { - var a = instance.callbacks[type + 'Class'] - if (typeof a === 'string') return a - if (typeof a === 'function') return a() - return instance.name + '-' + type -} - -function callEffectHook(effect, name, cb) { - var hook = effect.callbacks[name] - if (hook) { - hook.call(effect, effect.el, cb) - } -} - -var applyEffect = function(el, dir /*[before, [after, [opts]]]*/) { - var args = aslice.call(arguments, 0) - if (typeof args[2] !== 'function') { - args.splice(2, 0, noop) - } - if (typeof args[3] !== 'function') { - args.splice(3, 0, noop) - } - var before = args[2] - var after = args[3] - var opts = args[4] - var effect = effectFactory(el, opts) - if (!effect) { - before() - after() - return false - } else { - var method = dir ? 'enter' : 'leave' - effect[method](before, after) - } -} - -Anot.mix(Anot.effect, { - apply: applyEffect, - append: function(el, _parent, after, opts) { - return applyEffect( - el, - 1, - function() { - _parent.appendChild(el) - }, - after, - opts - ) - }, - before: function(el, target, after, opts) { - return applyEffect( - el, - 1, - function() { - target.parentNode.insertBefore(el, target) - }, - after, - opts - ) - }, - remove: function(el, _parent, after, opts) { - return applyEffect( - el, - 0, - function() { - if (el.parentNode === _parent) _parent.removeChild(el) - }, - after, - opts - ) - } -}) -Anot.directive('html', { - update: function(val) { - var binding = this - var elem = this.element - var isHtmlFilter = elem.nodeType !== 1 - var _parent = isHtmlFilter ? elem.parentNode : elem - if (!_parent) return - val = val == null ? '' : val - - if (elem.nodeType === 3) { - var signature = generateID('html') - _parent.insertBefore(DOC.createComment(signature), elem) - binding.element = DOC.createComment(signature + ':end') - _parent.replaceChild(binding.element, elem) - elem = binding.element - } - if (typeof val !== 'object') { - //string, number, boolean - var fragment = Anot.parseHTML(String(val)) - } else if (val.nodeType === 11) { - //将val转换为文档碎片 - fragment = val - } else if (val.nodeType === 1 || val.item) { - var nodes = val.nodeType === 1 ? val.childNodes : val.item - fragment = anotFragment.cloneNode(true) - while (nodes[0]) { - fragment.appendChild(nodes[0]) - } - } - - nodes = Anot.slice(fragment.childNodes) - //插入占位符, 如果是过滤器,需要有节制地移除指定的数量,如果是html指令,直接清空 - if (isHtmlFilter) { - var endValue = elem.nodeValue.slice(0, -4) - while (true) { - var node = elem.previousSibling - if (!node || (node.nodeType === 8 && node.nodeValue === endValue)) { - break - } else { - _parent.removeChild(node) - } - } - _parent.insertBefore(fragment, elem) - } else { - Anot.clearHTML(elem).appendChild(fragment) - } - scanNodeArray(nodes, binding.vmodels) - } -}) -Anot.directive('text', { - update: function(val) { - var elem = this.element - val = val == null ? '' : val //不在页面上显示undefined null - if (elem.nodeType === 3) { - //绑定在文本节点上 - try { - //IE对游离于DOM树外的节点赋值会报错 - elem.data = val - } catch (e) {} - } else { - //绑定在特性节点上 - elem.textContent = val - } - } -}) -Anot.directive('if', { - priority: 10, - update: function(val) { - var binding = this - var elem = this.element - var stamp = (binding.stamp = Date.now()) - var par - var after = function() { - if (stamp !== binding.stamp) { - return - } - binding.recoverNode = null - } - if (binding.recoverNode) { - binding.recoverNode() // 还原现场,有移动节点的都需要还原现场 - } - - try { - if (!elem.parentNode) return - par = elem.parentNode - } catch (e) { - return - } - if (val) { - //插回DOM树 - function alway() { - // jshint ignore:line - if (elem.getAttribute(binding.name)) { - elem.removeAttribute(binding.name) - scanAttr(elem, binding.vmodels) - } - binding.rollback = null - } - if (elem.nodeType === 8) { - var keep = binding.keep - var hasEffect = Anot.effect.apply( - keep, - 1, - function() { - if (stamp !== binding.stamp) return - elem.parentNode.replaceChild(keep, elem) - elem = binding.element = keep //这时可能为null - if (keep.getAttribute('_required')) { - //#1044 - elem.required = true - elem.removeAttribute('_required') - } - if (elem.querySelectorAll) { - Anot.each(elem.querySelectorAll('[_required=true]'), function( - el - ) { - el.required = true - el.removeAttribute('_required') - }) - } - alway() - }, - after - ) - hasEffect = hasEffect === false - } - if (!hasEffect) alway() - } else { - //移出DOM树,并用注释节点占据原位置 - if (elem.nodeType === 1) { - if (elem.required === true) { - elem.required = false - elem.setAttribute('_required', 'true') - } - try { - //如果不支持querySelectorAll或:required,可以直接无视 - Anot.each(elem.querySelectorAll(':required'), function(el) { - elem.required = false - el.setAttribute('_required', 'true') - }) - } catch (e) {} - - var node = (binding.element = DOC.createComment(':if')), - pos = elem.nextSibling - binding.recoverNode = function() { - binding.recoverNode = null - if (node.parentNode !== par) { - par.insertBefore(node, pos) - binding.keep = elem - } - } - - Anot.effect.apply( - elem, - 0, - function() { - binding.recoverNode = null - if (stamp !== binding.stamp) return - elem.parentNode.replaceChild(node, elem) - binding.keep = elem //元素节点 - ifGroup.appendChild(elem) - binding.rollback = function() { - if (elem.parentNode === ifGroup) { - ifGroup.removeChild(elem) - } - } - }, - after - ) - } - } - } -}) -//将所有远程加载的模板,以字符串形式存放到这里 -var templatePool = (Anot.templateCache = {}) - -function getTemplateContainer(binding, id, text) { - var div = binding.templateCache && binding.templateCache[id] - if (div) { - var dom = DOC.createDocumentFragment(), - firstChild - while ((firstChild = div.firstChild)) { - dom.appendChild(firstChild) - } - return dom - } - return Anot.parseHTML(text) -} -function nodesToFrag(nodes) { - var frag = DOC.createDocumentFragment() - for (var i = 0, len = nodes.length; i < len; i++) { - frag.appendChild(nodes[i]) - } - return frag -} -Anot.directive('include', { - init: directives.attr.init, - update: function(val) { - if (!val) { - return - } - - var binding = this - var elem = this.element - var vmodels = binding.vmodels - var loaded = binding.includeLoaded // 加载完的回调 - var rendered = binding.includeRendered // 渲染完的回调 - var effectClass = binding.effectName && binding.effectClass // 是否开启动画 - var templateCache = binding.templateCache // 是否开启 缓存 - var outer = binding.includeReplace // 是否替换容器 - var target = outer ? elem.parentNode : elem - var _ele = binding._element // replace binding.element === binding.end - - binding.recoverNodes = binding.recoverNodes || Anot.noop - - var scanTemplate = function(text) { - var _stamp = (binding._stamp = Date.now()) // 过滤掉频繁操作 - if (loaded) { - var newText = loaded.apply(target, [text].concat(vmodels)) - if (typeof newText === 'string') { - text = newText - } - } - if (rendered) { - checkScan( - target, - function() { - rendered.call(target) - }, - NaN - ) - } - var lastID = binding.includeLastID || '_default' // 默认 - - binding.includeLastID = val - var leaveEl = - (templateCache && templateCache[lastID]) || - DOC.createElement(elem.tagName || binding._element.tagName) // 创建一个离场元素 - - if (effectClass) { - leaveEl.className = effectClass - target.insertBefore(leaveEl, binding.start) // 插入到start之前,防止被错误的移动 - } - - // cache or animate,移动节点 - ;(templateCache || {})[lastID] = leaveEl - var fragOnDom = binding.recoverNodes() // 恢复动画中的节点 - if (fragOnDom) { - target.insertBefore(fragOnDom, binding.end) - } - while (true) { - var node = binding.start.nextSibling - if (node && node !== leaveEl && node !== binding.end) { - leaveEl.appendChild(node) - } else { - break - } - } - - // 元素退场 - Anot.effect.remove( - leaveEl, - target, - function() { - if (templateCache) { - // write cache - if (_stamp === binding._stamp) ifGroup.appendChild(leaveEl) - } - }, - binding - ) - - var enterEl = target, - before = Anot.noop, - after = Anot.noop - - var fragment = getTemplateContainer(binding, val, text) - var nodes = Anot.slice(fragment.childNodes) - - if (outer && effectClass) { - enterEl = _ele - enterEl.innerHTML = '' // 清空 - enterEl.setAttribute('skip', '') - target.insertBefore(enterEl, binding.end.nextSibling) // 插入到bingding.end之后避免被错误的移动 - before = function() { - enterEl.insertBefore(fragment, null) // 插入节点 - } - after = function() { - binding.recoverNodes = Anot.noop - if (_stamp === binding._stamp) { - fragment = nodesToFrag(nodes) - target.insertBefore(fragment, binding.end) // 插入真实element - scanNodeArray(nodes, vmodels) - } - if (enterEl.parentNode === target) target.removeChild(enterEl) // 移除入场动画元素 - } - binding.recoverNodes = function() { - binding.recoverNodes = Anot.noop - return nodesToFrag(nodes) - } - } else { - before = function() { - //新添加元素的动画 - target.insertBefore(fragment, binding.end) - scanNodeArray(nodes, vmodels) - } - } - - Anot.effect.apply(enterEl, 'enter', before, after) - } - - if (templatePool[val]) { - Anot.nextTick(function() { - scanTemplate(templatePool[val]) - }) - } else { - fetch(val, { - method: 'get', - headers: { - 'X-Requested-With': 'XMLHttpRequest' - } - }) - .then(res => { - if (res.status >= 200 && res.status < 300) { - return res.text() - } else { - return Promise.reject( - `获取网络资源出错, ${res.status} (${res.statusText})` - ) - } - }) - .then(text => { - templatePool[val] = text - scanTemplate(text) - }) - .catch(err => { - log(':include load [' + val + '] error\n%c%s', 'color:#f30', err) - }) - } - } -}) -var rdash = /\(([^)]*)\)/ -var onDir = Anot.directive('on', { - priority: 3000, - init: function(binding) { - var value = binding.expr - binding.type = 'on' - var eventType = binding.param.replace(/-\d+$/, '') // :on-mousemove-10 - if (typeof onDir[eventType + 'Hook'] === 'function') { - onDir[eventType + 'Hook'](binding) - } - if (value.indexOf('(') > 0 && value.indexOf(')') > -1) { - var matched = (value.match(rdash) || ['', ''])[1].trim() - if (matched === '' || matched === '$event') { - // aaa() aaa($event)当成aaa处理 - value = value.replace(rdash, '') - } - } - binding.expr = value - }, - update: function(callback) { - var binding = this - var elem = this.element - callback = function(e) { - var fn = binding.getter || noop - return fn.apply(binding.args[0], binding.args.concat(e)) - } - - var eventType = binding.param.replace(/-\d+$/, '') // :on-mousemove-10 - if (eventType === 'scan') { - callback.call(elem, { - type: eventType - }) - } else if (typeof binding.specialBind === 'function') { - binding.specialBind(elem, callback) - } else { - var removeFn = Anot.bind(elem, eventType, callback) - } - binding.rollback = function() { - if (typeof binding.specialUnbind === 'function') { - binding.specialUnbind() - } else { - Anot.unbind(elem, eventType, removeFn) - } - } - } -}) -Anot.directive('for', { - priority: 90, - init: function(binding) { - var type = binding.type - binding.cache = {} //用于存放代理VM - binding.enterCount = 0 - - var elem = binding.element - if (elem.nodeType === 1) { - var vars = binding.expr.split(' in ') - binding.expr = vars.pop() - if (vars.length) { - vars = vars.pop().split(/\s+/) - } - binding.vars = vars - elem.removeAttribute(binding.name) - effectBinding(elem, binding) - var rendered = getBindingCallback(elem, 'data-rendered', binding.vmodels) - - var signature = generateID(type) - var start = DOC.createComment(signature + ':start') - var end = (binding.element = DOC.createComment(signature + ':end')) - binding.signature = signature - binding.start = start - binding.template = anotFragment.cloneNode(false) - - var _parent = elem.parentNode - _parent.replaceChild(end, elem) - _parent.insertBefore(start, end) - binding.template.appendChild(elem) - - binding.element = end - - if (rendered) { - var removeFn = Anot.bind(_parent, 'datasetchanged', function() { - rendered.apply(_parent, _parent.args) - Anot.unbind(_parent, 'datasetchanged', removeFn) - _parent.msRendered = rendered - }) - } - } - }, - update: function(value, oldValue) { - var binding = this - var xtype = this.xtype - - if (xtype === 'array') { - if (!this.vars.length) { - this.vars.push('$index', 'el') - } else if (this.vars.length === 1) { - this.vars.unshift('$index') - } - this.param = this.vars[1] - } else { - this.param = '__el__' - if (!this.vars.length) { - this.vars.push('$key', '$val') - } else if (this.vars.length === 1) { - this.vars.push('$val') - } - } - - this.enterCount += 1 - var init = !oldValue - if (init) { - binding.$outer = {} - var check0 = this.vars[0] - var check1 = this.vars[1] - if (xtype === 'array') { - check0 = '$first' - check1 = '$last' - } - for (var i = 0, v; (v = binding.vmodels[i++]); ) { - if (v.hasOwnProperty(check0) && v.hasOwnProperty(check1)) { - binding.$outer = v - break - } - } - } - var track = this.track - var action = 'move' - binding.$repeat = value - var fragments = [] - var transation = init && anotFragment.cloneNode(false) - var proxies = [] - var param = this.param - var retain = Anot.mix({}, this.cache) - var elem = this.element - var length = track.length - - var _parent = elem.parentNode - - //检查新元素数量 - var newCount = 0 - for (i = 0; i < length; i++) { - var keyOrId = track[i] - if (!retain[keyOrId]) newCount++ - } - var oldCount = 0 - for (i in retain) { - oldCount++ - } - var clear = (!length || newCount === length) && oldCount > 10 //当全部是新元素,且移除元素较多(10)时使用clear - - var kill = elem.previousSibling - var start = binding.start - - if (clear) { - while (kill !== start) { - _parent.removeChild(kill) - kill = elem.previousSibling - } - } - - for (i = 0; i < length; i++) { - keyOrId = track[i] //array为随机数, object 为keyName - var proxy = retain[keyOrId] - if (!proxy) { - // log(this) - proxy = getProxyVM(this) - proxy.$up = this.vmodels[0] - if (xtype === 'array') { - action = 'add' - proxy.$id = keyOrId - var valueItem = value[i] - proxy[param] = valueItem //index - if (Object(valueItem) === valueItem) { - hideProperty(valueItem, '$ups', valueItem.$ups || {}) - valueItem.$ups[param] = proxy - } - } else { - action = 'append' - proxy[check0] = keyOrId - proxy[check1] = value[keyOrId] //key - var tmp = {} - tmp[check0] = proxy[check0] - tmp[check1] = proxy[check1] - proxy[param] = tmp - } - this.cache[keyOrId] = proxy - var node = proxy.$anchor || (proxy.$anchor = elem.cloneNode(false)) - node.nodeValue = this.signature - shimController( - binding, - transation, - proxy, - fragments, - init && !binding.effectDriver - ) - decorateProxy(proxy, binding, xtype) - } else { - fragments.push({}) - retain[keyOrId] = true - } - - //重写proxy - if (this.enterCount === 1) { - //防止多次进入,导致位置不对 - proxy.$active = false - proxy.$oldIndex = proxy.$index - proxy.$active = true - proxy.$index = i - } - - if (xtype === 'array') { - proxy.$first = i === 0 - proxy.$last = i === length - 1 - proxy[this.vars[0]] = proxy.$index - } else { - proxy[check1] = toJson(value[keyOrId]) //这里是处理vm.object = newObject的情况 - } - proxies.push(proxy) - } - this.proxies = proxies - if (init && !binding.effectDriver) { - _parent.insertBefore(transation, elem) - fragments.forEach(function(fragment) { - scanNodeArray(fragment.nodes || [], fragment.vmodels) - //if(fragment.vmodels.length > 2) - fragment.nodes = fragment.vmodels = null - }) // jshint ignore:line - } else { - var staggerIndex = (binding.staggerIndex = 0) - for (keyOrId in retain) { - if (retain[keyOrId] !== true) { - action = 'del' - !clear && removeItem(retain[keyOrId].$anchor, binding, true) - // 相当于delete binding.cache[key] - proxyRecycler(this.cache, keyOrId, param) - retain[keyOrId] = null - } - } - - for (i = 0; i < length; i++) { - proxy = proxies[i] - keyOrId = xtype === 'array' ? proxy.$id : proxy.$key - var pre = proxies[i - 1] - var preEl = pre ? pre.$anchor : binding.start - if (!retain[keyOrId]) { - //如果还没有插入到DOM树,进行插入动画 - ;(function(fragment, preElement) { - var nodes = fragment.nodes - var vmodels = fragment.vmodels - if (nodes) { - staggerIndex = mayStaggerAnimate( - binding.effectEnterStagger, - function() { - _parent.insertBefore(fragment.content, preElement.nextSibling) - scanNodeArray(nodes, vmodels) - !init && animateRepeat(nodes, 1, binding) - }, - staggerIndex - ) - } - fragment.nodes = fragment.vmodels = null - })(fragments[i], preEl) // jshint ignore:line - } else if (proxy.$index !== proxy.$oldIndex) { - //进行移动动画 - ;(function(proxy2, preElement) { - staggerIndex = mayStaggerAnimate( - binding.effectEnterStagger, - function() { - var curNode = removeItem(proxy2.$anchor) - var inserted = Anot.slice(curNode.childNodes) - _parent.insertBefore(curNode, preElement.nextSibling) - animateRepeat(inserted, 1, binding) - }, - staggerIndex - ) - })(proxy, preEl) // jshint ignore:line - } - } - } - if (!value.$track) { - //如果是非监控对象,那么就将其$events清空,阻止其持续监听 - for (keyOrId in this.cache) { - proxyRecycler(this.cache, keyOrId, param) - } - } - - // :for --> duplex - ;(function(args) { - _parent.args = args - if (_parent.msRendered) { - //第一次事件触发,以后直接调用 - _parent.msRendered.apply(_parent, args) - } - })(kernel.newWatch ? arguments : [action]) - var id = setTimeout(function() { - clearTimeout(id) - //触发上层的select回调及自己的rendered回调 - Anot.fireDom(_parent, 'datasetchanged', { - bubble: _parent.msHasEvent - }) - }) - this.enterCount -= 1 - } -}) - -function animateRepeat(nodes, isEnter, binding) { - for (var i = 0, node; (node = nodes[i++]); ) { - if (node.className === binding.effectClass) { - Anot.effect.apply(node, isEnter, noop, noop, binding) - } - } -} - -function mayStaggerAnimate(staggerTime, callback, index) { - if (staggerTime) { - setTimeout(callback, ++index * staggerTime) - } else { - callback() - } - return index -} - -function removeItem(node, binding, flagRemove) { - var fragment = anotFragment.cloneNode(false) - var last = node - var breakText = last.nodeValue - var staggerIndex = binding && Math.max(+binding.staggerIndex, 0) - var nodes = Anot.slice(last.parentNode.childNodes) - var index = nodes.indexOf(last) - while (true) { - var pre = nodes[--index] //node.previousSibling - if (!pre || String(pre.nodeValue).indexOf(breakText) === 0) { - break - } - if (!flagRemove && binding && pre.className === binding.effectClass) { - node = pre - ;(function(cur) { - binding.staggerIndex = mayStaggerAnimate( - binding.effectLeaveStagger, - function() { - Anot.effect.apply( - cur, - 0, - noop, - function() { - fragment.appendChild(cur) - }, - binding - ) - }, - staggerIndex - ) - })(pre) // jshint ignore:line - } else { - fragment.insertBefore(pre, fragment.firstChild) - } - } - fragment.appendChild(last) - return fragment -} - -function shimController(data, transation, proxy, fragments, init) { - var content = data.template.cloneNode(true) - var nodes = Anot.slice(content.childNodes) - content.appendChild(proxy.$anchor) - init && transation.appendChild(content) - var itemName = data.param || 'el' - var valueItem = proxy[itemName], - nv - - nv = [proxy].concat(data.vmodels) - - var fragment = { - nodes: nodes, - vmodels: nv, - content: content - } - fragments.push(fragment) -} -// {} --> {xx: 0, yy: 1, zz: 2} add -// {xx: 0, yy: 1, zz: 2} --> {xx: 0, yy: 1, zz: 2, uu: 3} -// [xx: 0, yy: 1, zz: 2} --> {xx: 0, zz: 1, yy: 2} - -function getProxyVM(binding) { - var agent = binding.xtype === 'object' ? withProxyAgent : eachProxyAgent - var proxy = agent(binding) - var node = proxy.$anchor || (proxy.$anchor = binding.element.cloneNode(false)) - node.nodeValue = binding.signature - proxy.$outer = binding.$outer - return proxy -} - -function decorateProxy(proxy, binding, type) { - if (type === 'array') { - proxy.$remove = function() { - binding.$repeat.removeAt(proxy.$index) - } - var param = binding.param - proxy.$watch(param, function(val) { - var index = proxy.$index - binding.$repeat[index] = val - }) - } else { - var __k__ = binding.vars[0] - var __v__ = binding.vars[1] - proxy.$up.$watch(binding.expr + '.' + proxy[__k__], function(val) { - proxy[binding.param][__v__] = val - proxy[__v__] = val - }) - } -} - -var eachProxyPool = [] - -function eachProxyAgent(data, proxy) { - var itemName = data.param || 'el' - for (var i = 0, n = eachProxyPool.length; i < n; i++) { - var candidate = eachProxyPool[i] - if (candidate && candidate.hasOwnProperty(itemName)) { - eachProxyPool.splice(i, 1) - proxy = candidate - break - } - } - if (!proxy) { - proxy = eachProxyFactory(data) - } - return proxy -} - -function eachProxyFactory(data) { - var itemName = data.param || 'el' - var __k__ = data.vars[0] - var source = { - $outer: {}, - $index: 0, - $oldIndex: 0, - $anchor: null, - //----- - $first: false, - $last: false, - $remove: Anot.noop - } - source[__k__] = 0 - source[itemName] = NaN - var force = { - $last: 1, - $first: 1, - $index: 1 - } - force[__k__] = 1 - force[itemName] = 1 - var proxy = modelFactory( - { state: source }, - { - force: force - } - ) - proxy.$id = generateID('proxy-each') - return proxy -} - -var withProxyPool = [] - -function withProxyAgent(data) { - return withProxyPool.pop() || withProxyFactory(data) -} - -function withProxyFactory(data) { - var itemName = data.param || '__el__' - var __k__ = data.vars[0] - var __v__ = data.vars[1] - var source = { - $index: 0, - $oldIndex: 0, - $outer: {}, - $anchor: null - } - source[__k__] = '' - source[__v__] = NaN - source[itemName] = NaN - var force = { - __el__: 1, - $index: 1 - } - force[__k__] = 1 - force[__v__] = 1 - var proxy = modelFactory( - { state: source }, - { - force: force - } - ) - proxy.$id = generateID('proxy-with') - return proxy -} - -function proxyRecycler(cache, key, param) { - var proxy = cache[key] - if (proxy) { - var proxyPool = - proxy.$id.indexOf('proxy-each') === 0 ? eachProxyPool : withProxyPool - proxy.$outer = {} - - for (var i in proxy.$events) { - var a = proxy.$events[i] - if (Array.isArray(a)) { - a.length = 0 - if (i === param) { - proxy[param] = NaN - } else if (i === '$val') { - proxy.$val = NaN - } - } - } - - if (proxyPool.unshift(proxy) > kernel.maxRepeatSize) { - proxyPool.pop() - } - delete cache[key] - } -} -function parseDisplay(nodeName, val) { - //用于取得此类标签的默认display值 - var key = '_' + nodeName - if (!parseDisplay[key]) { - var node = DOC.createElement(nodeName) - root.appendChild(node) - - val = getComputedStyle(node, null).display - - root.removeChild(node) - parseDisplay[key] = val - } - return parseDisplay[key] -} - -Anot.parseDisplay = parseDisplay - -Anot.directive('visible', { - init: function(binding) { - effectBinding(binding.element, binding) - }, - update: function(val) { - var binding = this, - elem = this.element, - stamp - var noEffect = !this.effectName - if (!this.stamp) { - stamp = this.stamp = Date.now() - if (val) { - elem.style.display = binding.display || '' - if (Anot(elem).css('display') === 'none') { - elem.style.display = binding.display = parseDisplay(elem.nodeName) - } - } else { - elem.style.display = 'none' - } - return - } - stamp = this.stamp = +new Date() - if (val) { - Anot.effect.apply(elem, 1, function() { - if (stamp !== binding.stamp) return - var driver = elem.getAttribute('data-effect-driver') || 'a' - - if (noEffect) { - //不用动画时走这里 - elem.style.display = binding.display || '' - } - // "a", "t" - if (driver === 'a' || driver === 't') { - if (Anot(elem).css('display') === 'none') { - elem.style.display = binding.display || parseDisplay(elem.nodeName) - } - } - }) - } else { - Anot.effect.apply(elem, 0, function() { - if (stamp !== binding.stamp) return - elem.style.display = 'none' - }) - } - } -}) -/********************************************************************* - * 自带过滤器 * - **********************************************************************/ - -var rscripts = /]*>([\S\s]*?)<\/script\s*>/gim -var ron = /\s+(on[^=\s]+)(?:=("[^"]*"|'[^']*'|[^\s>]+))?/g -var ropen = /<\w+\b(?:(["'])[^"]*?(\1)|[^>])*>/gi -var rsanitize = { - a: /\b(href)\=("javascript[^"]*"|'javascript[^']*')/gi, - img: /\b(src)\=("javascript[^"]*"|'javascript[^']*')/gi, - form: /\b(action)\=("javascript[^"]*"|'javascript[^']*')/gi -} -var rsurrogate = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g -var rnoalphanumeric = /([^\#-~| |!])/g - -function numberFormat(number, decimals, point, thousands) { - //form http://phpjs.org/functions/number_format/ - //number 必需,要格式化的数字 - //decimals 可选,规定多少个小数位。 - //point 可选,规定用作小数点的字符串(默认为 . )。 - //thousands 可选,规定用作千位分隔符的字符串(默认为 , ),如果设置了该参数,那么所有其他参数都是必需的。 - number = (number + '').replace(/[^0-9+\-Ee.]/g, '') - var n = !isFinite(+number) ? 0 : +number, - prec = !isFinite(+decimals) ? 3 : Math.abs(decimals), - sep = thousands || ',', - dec = point || '.', - s = '', - toFixedFix = function(n, prec) { - var k = Math.pow(10, prec) - return '' + (Math.round(n * k) / k).toFixed(prec) - } - // Fix for IE parseFloat(0.55).toFixed(0) = 0; - s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.') - if (s[0].length > 3) { - s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep) - } - if ((s[1] || '').length < prec) { - s[1] = s[1] || '' - s[1] += new Array(prec - s[1].length + 1).join('0') - } - return s.join(dec) -} - -var filters = (Anot.filters = { - uppercase: function(str) { - return str.toUpperCase() - }, - lowercase: function(str) { - return str.toLowerCase() - }, - //字符串截取,超过指定长度以mark标识接上 - truncate: function(str, len, mark) { - len = len || 30 - mark = typeof mark === 'string' ? mark : '...' - return str.slice(0, len) + (str.length <= len ? '' : mark) - }, - //小值秒数转化为 时间格式 - time: function(str) { - str = str >> 0 - var s = str % 60 - var m = Math.floor(str / 60) - var h = Math.floor(m / 60) - m = m % 60 - m = m < 10 ? '0' + m : m - s = s < 10 ? '0' + s : s - - if (h > 0) { - h = h < 10 ? '0' + h : h - return h + ':' + m + ':' + s - } - return m + ':' + s - }, - $filter: function(val) { - for (var i = 1, n = arguments.length; i < n; i++) { - var array = arguments[i] - var fn = Anot.filters[array[0]] - if (typeof fn === 'function') { - var arr = [val].concat(array.slice(1)) - val = fn.apply(null, arr) - } - } - return val - }, - camelize: camelize, - //https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet - // chrome - // chrome - // IE67chrome - // IE67chrome - // IE67chrome - xss: function(str) { - return str.replace(rscripts, '').replace(ropen, function(a, b) { - var match = a.toLowerCase().match(/<(\w+)\s/) - if (match) { - //处理a标签的href属性,img标签的src属性,form标签的action属性 - var reg = rsanitize[match[1]] - if (reg) { - a = a.replace(reg, function(s, name, value) { - var quote = value.charAt(0) - return name + '=' + quote + 'javascript:void(0)' + quote // jshint ignore:line - }) - } - } - return a.replace(ron, ' ').replace(/\s+/g, ' ') //移除onXXX事件 - }) - }, - escape: function(str) { - //将字符串经过 str 转义得到适合在页面中显示的内容, 例如替换 < 为 < - return String(str) - .replace(/&/g, '&') - .replace(rsurrogate, function(value) { - var hi = value.charCodeAt(0) - var low = value.charCodeAt(1) - return '&#' + ((hi - 0xd800) * 0x400 + (low - 0xdc00) + 0x10000) + ';' - }) - .replace(rnoalphanumeric, function(value) { - return '&#' + value.charCodeAt(0) + ';' - }) - .replace(//g, '>') - }, - currency: function(amount, symbol, fractionSize) { - return ( - (symbol || '\u00a5') + - numberFormat(amount, isFinite(fractionSize) ? fractionSize : 2) - ) - }, - number: numberFormat, - //日期格式化,类似php的date函数, - date: function(stamp, str) { - var oDate = stamp - - if (!Date.isDate(oDate)) { - var tmp = +oDate - if (tmp === tmp) { - oDate = tmp - } - - oDate = new Date(oDate) - if (oDate.toString() === 'Invalid Date') { - return 'Invalid Date' - } - } - return oDate.format(str) - } -}) - - -/********************************************************************* - * DOMReady * - **********************************************************************/ - - let readyList = [] - let isReady - let fireReady = function(fn) { - isReady = true - while ((fn = readyList.shift())) { - fn(Anot) - } - } - - if (DOC.readyState === 'complete') { - setTimeout(fireReady) //如果在domReady之外加载 - } else { - DOC.addEventListener('DOMContentLoaded', fireReady) - } - window.addEventListener('load', fireReady) - Anot.ready = function(fn) { - if (!isReady) { - readyList.push(fn) - } else { - fn(Anot) - } - } - window.Anot = Anot - return Anot -})() -export default _Anot +/*================================================== + * Anot normal version for future browsers + * @authors yutent (yutent@doui.cc) + * @date 2017-03-21 21:05:57 + * V2.0.0 + * + ==================================================*/ + const _Anot=function(){var e=1024,t=A(),n=window.document,r=n.head;r.insertAdjacentHTML("afterbegin",'');var i=r.firstChild;function a(){console.log.apply(console,arguments)}function o(){return Object.create(null)}var s=encodeURIComponent,c=decodeURIComponent,l="$"+t,u={},f=/[^, ]+/g,p=/\w+/g,d=/^\[object SVG\w*Element\]$/,h=Object.prototype,v=h.hasOwnProperty,m=h.toString,y=Array.prototype,g=y.slice,b=n.documentElement,$=n.createDocumentFragment(),x=(n.createElement("div"),{"[object Boolean]":"boolean","[object Number]":"number","[object String]":"string","[object Function]":"function","[object Array]":"array","[object Date]":"date","[object RegExp]":"regexp","[object Object]":"object","[object Error]":"error","[object AsyncFunction]":"asyncfunction","[object Promise]":"promise","[object Generator]":"generator","[object GeneratorFunction]":"generatorfunction"});function w(){}function k(e){return Function.apply(w,e)}function C(e,t){"string"==typeof e&&(e=e.match(f)||[]);for(var n={},r=void 0!==t?t:1,i=0,a=e.length;i{e.resolve=t,e.reject=n}),e}),String.prototype.splice||Object.defineProperty(String.prototype,"splice",{value:function(e,t,n){let r=this.length,i=arguments.length;if(n=void 0===n?"":n,i<1)return this;if(e<0&&(e=Math.abs(e)>=r?0:r+e),1===i)return this.slice(0,e);return t-=0,this.slice(0,e)+n+this.slice(e+t)},enumerable:!1}),Date.prototype.getFullWeek||(Object.defineProperty(Date.prototype,"getFullWeek",{value:function(){let e=this.getFullYear(),t=new Date(e,0,1),n=t.getDay()||1,r=(this-t)/864e5;return Math.ceil((r+n)/7)},enumerable:!1}),Object.defineProperty(Date.prototype,"getWeek",{value:function(){let e=this.getDate(),t=this.getMonth(),n=this.getFullYear(),r=new Date(n,t,1).getDay();return Math.ceil((e+r)/7)},enumerable:!1})),Date.isDate||Object.defineProperty(Date,"isDate",{value:function(e){return!("object"!=typeof e||!e.getTime)},enumerable:!1}),Date.prototype.format||Object.defineProperty(Date.prototype,"format",{value:function(e){e=e||"Y-m-d H:i:s";let t,n={fullyear:this.getFullYear(),year:this.getYear(),fullweek:this.getFullWeek(),week:this.getWeek(),month:this.getMonth()+1,date:this.getDate(),day:["Mon","Tue","Wed","Thu","Fri","Sat","Sun"][this.getDay()],hours:this.getHours(),minutes:this.getMinutes(),seconds:this.getSeconds()};n.g=n.hours>12?n.hours-12:n.hours,t={Y:n.fullyear,y:n.year,m:n.month<10?"0"+n.month:n.month,n:n.month,d:n.date<10?"0"+n.date:n.date,j:n.date,H:n.hours<10?"0"+n.hours:n.hours,h:n.g<10?"0"+n.g:n.g,G:n.hours,g:n.g,i:n.minutes<10?"0"+n.minutes:n.minutes,s:n.seconds<10?"0"+n.seconds:n.seconds,W:n.fullweek,w:n.week,D:n.day};for(let n in t)e=e.replace(new RegExp(n,"g"),t[n]);return e},enumerable:!1});let N=function(e){return new N.init(e)};N.nextTick=new function(){let e=window.setImmediate,t=window.MutationObserver;if(e)return e.bind(window);let n=[];if(t){let e=document.createTextNode("anot");new t(function(){let e=n.length;for(let t=0;t>>0)return!0}return!1}(e))for(let n=0,r=e.length;n1){if(!e)return;if(n=n||{},n=Object.assign({expires:"",path:"/",domain:document.domain,secure:""},n),"string"==this.type(t)&&""===t.trim()||null===t)return document.cookie=s(e)+"=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain="+n.domain+"; path="+n.path,!0;if(n.expires)switch(n.expires.constructor){case Number:n.expires=n.expires===1/0?"; expires=Fri, 31 Dec 9999 23:59:59 GMT":"; max-age="+n.expires;break;case String:n.expires="; expires="+n.expires;break;case Date:n.expires="; expires="+n.expires.toUTCString()}return document.cookie=s(e)+"="+s(t)+n.expires+"; domain="+n.domain+"; path="+n.path+"; "+n.secure,!0}return e?c(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*"+s(e).replace(/[\-\.\+\*]/g,"\\$&")+"\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"))||null:document.cookie},search:function(e){e+="";let t=location.search;if(!e||!t)return null;t=(t=(t=c(t)).slice(1)).split("&");let n={};for(let e,r=0;e=t[r++];){let t=e.split("=");t[1]=t.length<2?null:t[1],t[1]=t[1],n.hasOwnProperty(t[0])?"object"==typeof n[t[0]]?n[t[0]].push(t[1]):(n[t[0]]=[n[t[0]]],n[t[0]].push(t[1])):n[t[0]]=t[1]}return n.hasOwnProperty(e)?n[e]:null},copy:function(e){try{navigator.clipboard.writeText(e)}catch(e){a("复制到粘贴板失败",e)}}});let O=N.bindingHandlers={},E=N.bindingExecutors={},S=N.directives={};N.directive=function(e,t){return O[e]=t.init=t.init||w,E[e]=t.update=t.update||w,S[e]=t};let D=new function(){function e(e){this.size=0,this.limit=e,this.head=this.tail=void 0,this._keymap={}}let t=e.prototype;return t.put=function(e,t){let n={key:e,value:t};return this._keymap[e]=n,this.tail?(this.tail.newer=n,n.older=this.tail):this.head=n,this.tail=n,this.size===this.limit?this.shift():this.size++,t},t.shift=function(){let e=this.head;e&&(this.head=this.head.newer,this.head.older=e.newer=e.older=this._keymap[e.key]=void 0,delete this._keymap[e.key])},t.get=function(e){let t=this._keymap[e];if(void 0!==t)return t===this.tail?t.value:(t.newer&&(t===this.head&&(this.head=t.newer),t.newer.older=t.older),t.older&&(t.older.newer=t.newer),t.newer=void 0,t.older=this.tail,this.tail&&(this.tail.newer=t),this.tail=t,t.value)},e};n.contains||(Node.prototype.contains=function(e){return!!(16&this.compareDocumentPosition(e))}),N.contains=function(e,t){try{for(;t=t.parentNode;)if(t===e)return!0;return!1}catch(e){return!1}};let _=N.eventHooks;function P(e){for(var t in e)if(v.call(e,t)){var n=e[t];"function"==typeof P.plugins[t]?P.plugins[t](n):"object"==typeof P[t]?N.mix(P[t],n):P[t]=n}return this}void 0===n.onmousewheel&&(_.mousewheel={type:"wheel",fix:function(e,t){return function(n){n.wheelDeltaY=n.wheelDelta=n.deltaY>0?-120:120,n.wheelDeltaX=0,Object.defineProperty(n,"type",{value:"mousewheel"}),t.call(e,n)}}}),N.config=P;var L,M,H,F,B=/[-.*+?^${}()|[\]\/\\]/g;function I(e){return(e+"").replace(B,"\\$&")}var R={interpolate:function(e){if(L=e[0],M=e[1],L===M)throw new SyntaxError("openTag!==closeTag");P.openTag=L,P.closeTag=M;var t=I(L),n=I(M);H=new RegExp(t+"([\\s\\S]*)"+n),F=new RegExp(t+"([\\s\\S]*)"+n,"g"),new RegExp(t+"[\\s\\S]*"+n+"|\\s:")}};function q(t,r){var i=this.$events||(this.$events={}),a=i[t]||(i[t]=[]);if("function"==typeof r){var o=r;o.uuid="_"+ ++e,(r={element:b,type:"user-watcher",handler:w,vmodels:[this],expr:t,uuid:o.uuid}).wildcard=/\*/.test(t)}if(r.update)r.oneTime||N.Array.ensure(a,r);else{if(/\w\.*\B/.test(t)||"*"===t){r.getter=w;var s=this;r.update=function(){var e=this.fireArgs||[];e[2]&&r.handler.apply(s,e),delete this.fireArgs},a.sync=!0,N.Array.ensure(a,r)}else N.injectBinding(r);o&&(r.handler=o)}return function(){r.update=r.getter=r.handler=w,r.element=n.createElement("a")}}function V(t,n){var r=this.$events,i=null;if(r&&r[t]){n&&(n[2]=t);var a=r[t];if(function(t,n){if(!t)return;new Date-se>444&&"object"==typeof t[0]&&le();for(var r,i=[],a=[],o=0;r=t[o++];)"user-watcher"===r.type?i.push(r):a.push(r);if(P.async){for(dt.render(),o=0;r=a[o++];)if(r.update){r.uuid=r.uuid||"_"+ ++e;var s=r.uuid;dt.queue[s]||(dt.queue[s]="__",dt.queue.push(r))}}else for(o=0;r=a[o++];)r.update&&r.update();for(o=0;r=i[o++];)(n&&n[2]===r.expr||r.wildcard)&&(r.fireArgs=n),r.update()}(a,n),n&&r["*"]&&!/\./.test(t))for(var o,s=0;o=r["*"][s++];)try{o.handler.apply(this,n)}catch(e){}(i=this.$up)&&(this.$pathname&&V.call(i,this.$pathname+"."+t,n),V.call(i,"*."+t,n))}else{if(i=this.$up,this.$ups){for(var c in this.$ups)V.call(this.$ups[c],c+"."+t,n);return}if(i){var l=this.$pathname;""===l&&(l="*");var u=l+"."+t;a=u.split("."),n=n&&n.concat([u,t])||[u,t],-1===a.indexOf("*")?(V.call(i,u,n),a[1]="*",V.call(i,a.join("."),n)):V.call(i,u,n)}}}P.plugins=R,P.plugins.interpolate(["{{","}}"]),P.async=!0,P.paths={},P.shim={},P.maxRepeatSize=100;var W=C("$id,$watch,$fire,$events,$model,$active,$pathname,$up,$ups,$track,$accessors");function z(e,t){return(t=t||{}).watch=!0,U(e,t)}function U(e,t){if(!e||e.$id&&e.$accessors||e.nodeName&&e.nodeType>0)return e;var n,r=(t=t||u).force||u,i=t.old,o=i&&i.$accessors||u,s=new function(){},c={},l={},f=[],p=[],d={},h=e.state,v=e.computed,m=e.methods,y=e.props,g=e.watch,b=e.mounted;if(delete e.state,delete e.computed,delete e.methods,delete e.props,delete e.watch,e.skip&&(d=C(e.skip),delete e.skip),h)for(x in e.$id&&delete h.props,h){var $=h[x];W[x]||(l[x]=!0),"function"==typeof $||$&&$.nodeName&&$.nodeType>0||!r[x]&&("$"===(n=x).charAt(0)||"__"===n.slice(0,2)||W[n]||d[x])?f.push(x):Y($)?(a("warning:计算属性建议放在[computed]对象中统一定义"),v[x]=$):(p.push(x),o[x]?c[x]=o[x]:c[x]=G(x,$))}if(v)for(var x in delete v.props,v)l[x]=!0,function(e,t){var n;"function"==typeof t&&(t={get:t,set:w}),"function"!=typeof t.set&&(t.set=w),c[e]={get:function(){return n=t.get.call(this)},set:function(r){var i,a=n;t.set.call(this,r),i=this[e],this.$fire&&i!==a&&this.$fire(e,i,a)},enumerable:!0,configurable:!0}}(x,v[x]);if(m)for(var x in delete m.props,m)l[x]=!0,f.push(x);if(y)for(var x in X(s,"props",{}),l.props=!!e.$id,y)s.props[x]=y[x];if(Object.assign(e,h,m),c.$model=Z,s=Object.defineProperties(s,c,e),f.forEach(function(t){s[t]=e[t]}),X(s,"$id","anonymous"),X(s,"$up",i?i.$up:null),X(s,"$track",Object.keys(l)),X(s,"$active",!1),X(s,"$pathname",i?i.$pathname:""),X(s,"$accessors",c),X(s,"$events",{}),X(s,"$refs",{}),X(s,"$children",[]),X(s,"hasOwnProperty",function(e){return!0===l[e]}),X(s,"$mounted",b),t.watch&&(X(s,"$watch",function(){return q.apply(s,arguments)}),X(s,"$fire",function(e,t){if(0===e.indexOf("all!")){var n=e.slice(4);for(var r in N.vmodels){(i=N.vmodels[r]).$fire&&i.$fire.apply(i,[n,t])}}else if(0===e.indexOf("child!")){n="props."+e.slice(6);for(var r in s.$children){var i;(i=s.$children[r]).$fire&&i.$fire.apply(i,[n,t])}}else V.call(s,e,[t])})),p.forEach(function(e){var t=i&&i[e],n=s[e]=h[e];n&&"object"==typeof n&&!Date.isDate(n)&&(n.$up=s,n.$pathname=e),V.call(s,e,[n,t])}),g)for(var k in delete g.props,g)if(Array.isArray(g[k]))for(var A;A=g[k].pop();)q.call(s,k,A);else q.call(s,k,g[k]);return s.$active=!0,"anonymous"!==s.$id&&i&&i.$up&&i.$up.$children&&i.$up.$children.push(s),s}function Y(e){if(e&&"object"==typeof e){for(var t in e)if("get"!==t&&"set"!==t)return!1;return"function"==typeof e.get}}function G(e,t){var n;t=NaN;return{get:function(){return this.$active&&function(e,t){for(;;){if(e.$watch){var n=e.$events||(e.$events={}),r=n[t]||(n[t]=[]);return void ae.collectDependency(r)}if(!(e=e.$up))break;t=e.$pathname+"."+t}}(this,e),t},set:function(r){if(t!==r){var i=t;(n=J(r,t))?t=n:(n=void 0,t=r),Object(n)===n&&(n.$pathname=e,n.$up=this),this.$active&&V.call(this,e,[t,i])}},enumerable:!0,configurable:!0}}function J(e,t,n,r){if(Array.isArray(e))return function(e,t,n){if(t&&t.splice){var r=[0,t.length].concat(e);return t.splice.apply(t,r),t}for(var i in ee)e[i]=ee[i];X(e,"$up",null),X(e,"$pathname",""),X(e,"$track",ne(e.length)),e._=U({state:{length:NaN}},{watch:!0}),e._.length=e.length,e._.$watch("length",function(t,n){V.call(e.$up,e.$pathname+".length",[t,n])}),n&&X(e,"$watch",function(){return q.apply(e,arguments)}),Object.defineProperty(e,"$model",Z);for(var a=0,o=e.length;a>>=0)>this.length)throw Error(e+"set方法的第一个参数不能大于原数组长度");if(this[e]!==t){var n=this[e];this.splice(e,1,t),V.call(this.$up,this.$pathname+".*",[t,n,null,e])}},contains:function(e){return this.indexOf(e)>-1},ensure:function(e){return this.contains(e)||this.push(e),this},pushArray:function(e){return this.push.apply(this,K(e))},remove:function(e){return this.removeAt(this.indexOf(e))},removeAt:function(e){return e>>>=0,this.splice(e,1)},size:function(){return this._.length},removeAll:function(e){if(Array.isArray(e))for(var t=this.length-1;t>=0;t--)-1!==e.indexOf(this[t])&&(te.call(this.$track,t,1),te.call(this,t,1));else if("function"==typeof e)for(t=this.length-1;t>=0;t--){e(this[t],t)&&(te.call(this.$track,t,1),te.call(this,t,1))}else te.call(this.$track,0,this.length),te.call(this,0,this.length);this.notify(),this._.length=this.length},clear:function(){this.removeAll()}},te=Q.splice;function ne(e){for(var t=[],n=0;n2){n[1],n.length;n=[n[0],n[1]].concat(ne(n.length-2))}}Array.prototype[t].apply(e,n)}(this.$track,e,n),this.notify(),this._.length=this.length,a}}),"sort,reverse".replace(f,function(e){ee[e]=function(){var t=this.concat(),n=Math.random(),r=[],i=!1;Q[e].apply(this,arguments);for(var a=0,o=t.length;a444&&le())}(n,t)}}),t.getter=He(t.expr,t.vmodels,t),t.observers.forEach(function(e){e.v.$watch(e.p,t)}),delete t.observers);try{var r,i,o=t.fireArgs;if(delete t.fireArgs,o)r=o[0],i=o[1];else if("on"===t.type)r=t.getter+"";else try{r=t.getter.apply(0,t.args)}catch(e){r=null}if(i=void 0===i?t.oldValue:i,t._filters&&(r=cn.$filter.apply(0,[r].concat(t._filters))),t.signature){var s=N.type(r);if("array"!==s&&"object"!==s)throw Error("warning:"+t.expr+"只能是对象或数组");t.xtype=s;var c=function(e,t){for(var n,r=[],i=0;n=e[i++];)r.push(t?n.$id:n.$key);return r.join(";")}(t.proxies||[],s),l=r.$track||("array"===s?ne(r.length):Object.keys(r));t.track=l,c!==l.join(";")&&(t.handler(r,i),t.oldValue=1)}else Array.isArray(r)&&r.length!==(i&&i.length)?(t.handler(r,i),t.oldValue=r.concat()):"oldValue"in t&&r===i||(t.handler(r,i),t.oldValue=Array.isArray(r)?r.concat():r)}catch(e){delete t.getter,a("warning:exception throwed in [Anot.injectBinding] ",e);var u=t.element;u&&3===u.nodeType&&(u.nodeValue=L+(t.oneTime?"::":"")+t.expr+M)}finally{n&&ae.end()}},t.update()};var oe=N.$$subscribers=[],se=new Date;var ce=0;function le(e){for(var t=ce||oe.length,n=0;e=oe[--t];)if(e.i<7){if(null===e.element){oe.splice(t,1),e.list&&(N.Array.remove(e.list,e),delete oe[e.uuid]);continue}if(fe(e.element)){if(oe.splice(t,1),N.Array.remove(e.list,e),ue(e),n++>500){ce=t;break}continue}e.i++,7===e.i&&(e.i=14)}else e.i--;se=new Date}function ue(e){for(var t in delete oe[e.uuid],e.element=null,e.rollback&&e.rollback(),e)e[t]=null}function fe(e){try{e.parentNode.nodeType}catch(e){return!0}return e.ifRemove&&!b.contains(e.ifRemove)&&i===e.parentNode?(e.parentNode&&e.parentNode.removeChild(e),!0):e.msRetain?0:1===e.nodeType?!b.contains(e):!N.contains(b,e)}var pe=new function(){N.mix(this,{option:n.createElement("select"),thead:n.createElement("table"),td:n.createElement("tr"),area:n.createElement("map"),tr:n.createElement("tbody"),col:n.createElement("colgroup"),legend:n.createElement("fieldset"),_default:n.createElement("div"),g:n.createElementNS("http://www.w3.org/2000/svg","svg")}),this.optgroup=this.option,this.tbody=this.tfoot=this.colgroup=this.caption=this.thead,this.th=this.td};String("circle,defs,ellipse,image,line,path,polygon,polyline,rect,symbol,text,use").replace(f,function(e){pe[e]=pe.g});var de=/<([\w:]+)/,he=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ve=C(["","text/javascript","text/ecmascript","application/ecmascript","application/javascript"]),me=n.createElement("script"),ye=/<|&#?\w+;/;function ge(e){return e.replace(/([a-z\d])([A-Z]+)/g,"$1-$2").toLowerCase()}function be(e){return e.indexOf("-")<0&&e.indexOf("_")<0?e:e.replace(/[-_][^-_]/g,function(e){return e.charAt(1).toUpperCase()})}N.parseHTML=function(e){var t=$.cloneNode(!1);if("string"!=typeof e)return t;if(!ye.test(e))return t.appendChild(n.createTextNode(e)),t;e=e.replace(he,"<$1>").trim();var r,i=(de.exec(e)||["",""])[1].toLowerCase(),a=pe[i]||pe._default;a.innerHTML=e;var o=a.getElementsByTagName("script");if(o.length)for(var s,c=0;s=o[c++];)if(ve[s.type]){var l=me.cloneNode(!1);y.forEach.call(s.attributes,function(e){l.setAttribute(e.name,e.value)}),l.text=s.text,s.parentNode.replaceChild(l,s)}for(;r=a.firstChild;)t.appendChild(r);return t},N.innerHTML=function(e,t){var n=this.parseHTML(t);this.clearHTML(e).appendChild(n)},N.clearHTML=function(e){for(e.textContent="";e.firstChild;)e.removeChild(e.firstChild);return e},"add,remove".replace(f,function(e){N.fn[e+"Class"]=function(t){var n=this[0];return t&&"string"==typeof t&&n&&1===n.nodeType&&t.replace(/\S+/g,function(t){n.classList[e](t)}),this}}),N.fn.mix({attr:function(e,t){return 2===arguments.length?(this[0].setAttribute(e,t),this):this[0].getAttribute(e)},data:function(e,t){var n=arguments.length,r=this[0].dataset;switch((e=ge(e||""))||(n=0),n){case 2:return r[e]=t,this;case 1:return xe(r[e]);case 0:var i=o();for(var a in r)i[a]=xe(r[a]);return i}},removeData:function(e){return e="data-"+ge(e),this[0].removeAttribute(e),this},css:function(e,t){if(N.isPlainObject(e))for(var n in e)N.css(this,n,e[n]);else var r=N.css(this,e,t);return void 0!==r?r:this},position:function(){var e,t,n=this[0],r={top:0,left:0};if(n)return"fixed"===this.css("position")?t=n.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),"HTML"!==e[0].tagName&&(r=e.offset()),r.top+=N.css(e[0],"borderTopWidth",!0),r.left+=N.css(e[0],"borderLeftWidth",!0),r.top-=e.scrollTop(),r.left-=e.scrollLeft()),{top:t.top-r.top-N.css(n,"marginTop",!0),left:t.left-r.left-N.css(n,"marginLeft",!0)}},offsetParent:function(){for(var e=this[0].offsetParent;e&&"static"===N.css(e,"position");)e=e.offsetParent;return N(e||b)},bind:function(e,t,n){if(this[0])return N.bind(this[0],e,t,n)},unbind:function(e,t,n){return this[0]&&N.unbind(this[0],e,t,n),this},val:function(e){var t,n,r=this[0];if(r&&1===r.nodeType){var i=0===arguments.length,a=i?":get":":set",o=je[(t=r,n=t.tagName.toLowerCase(),("input"===n&&/checkbox|radio/.test(t.type)?"checked":n)+a)];if(o)var s=o(r,e);else{if(i)return(r.value||"").replace(/\r/g,"");r.value=e}}return i?s:this}}),N.parseJSON=JSON.parse;var $e=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/;function xe(e){try{if("object"==typeof e)return e;e="true"===e||"false"!==e&&("null"===e?null:+e+""===e?+e:$e.test(e)?JSON.parse(e):e)}catch(e){}return e}N.fireDom=function(e,t,r){var i=n.createEvent("Events");i.initEvent(t,!0,!0),N.mix(i,r),e.dispatchEvent(i)},N.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){N.fn[e]=function(n){var r=this[0]||{},i=function(e){return e.window&&e.document?e:9===e.nodeType&&e.defaultView}(r),a="scrollTop"===e;if(!arguments.length)return i?i[t]:r[e];i?i.scrollTo(a?i[t]:n,a?n:i[t]):r[e]=n}});var we=N.cssHooks=o(),ke=["","-webkit-","-moz-","-ms-"],Ce={float:"cssFloat"};N.cssNumber=C("animationIterationCount,animationIterationCount,columnCount,order,flex,flexGrow,flexShrink,fillOpacity,fontWeight,lineHeight,opacity,orphans,widows,zIndex,zoom"),N.cssName=function(e,t,n){if(Ce[e])return Ce[e];t=t||b.style;for(var r=0,i=ke.length;r-1)&&(n=!0);n||(e.selectedIndex=-1)}},Te={};["break,case,catch,continue,debugger,default,delete,do,else,false","finally,for,function,if,in,instanceof,new,null,return,switch,this","throw,true,try,typeof,var,void,while,with","abstract,boolean,byte,char,class,const,double,enum,export,extends","final,float,goto,implements,import,int,interface,long,native","package,private,protected,public,short,static,super,synchronized","throws,transient,volatile","arguments,let,yield,async,await,undefined"].join(",").replace(/\w+/g,function(e){Te[e]=!0});var Oe=/[a-z_$]/i,Ee=/[\s\uFEFF\xA0]/;function Se(e,t){if(t&&!Te[t])return e.push(t),!0}function De(e,t,n,r){for(var i,a=[],o=" = "+n+".",s=e.length;i=e[--s];){var c=i.split(".")[0];t.hasOwnProperty(c)&&(a.push(c+o+c),r.observers.push({v:t,p:i,type:N.type(t[c])}),e.splice(s,1))}return a}var _e=/(proxy\-[a-z]+)\-[\-0-9a-f]+$/,Pe=new D(218),Le=new D(128);function Me(e){e=e.trim();var t=Pe.get(e);if(t)return t.concat();for(var n,r=function e(t,n){var r=[],i=!!n;n=n||0;for(var a="unknown",o="",s=0;s0){var t=e.replace(st,function(e){return Array(e.length+1).join("1")}).replace(ot,"ᄢ㍄").indexOf("|");if(t>-1)return{type:"text",filters:e.slice(t).trim(),expr:e.slice(0,t)}}return{type:"text",expr:e,filters:""}}function ut(e){for(var t,n,r=[],i=0;;){if(-1===(n=e.indexOf(L,i)))break;if((t=e.slice(i,n))&&r.push({expr:t}),i=n+L.length,-1===(n=e.indexOf(M,i)))break;(t=e.slice(i,n))&&r.push(lt(t.replace(ct,""))),i=n+M.length}return(t=e.slice(i))&&r.push({expr:t}),r}function ft(e,t,r){var i=[],a=ut(e.data);if(a.length){for(var o,s=0;o=a[s++];){var c=n.createTextNode(o.expr);o.type&&(o.expr=o.expr.replace(Ge,function(){return o.oneTime=!0,""}),o.element=c,o.filters=o.filters.replace(at,function(){return o.type="html",""}),o.pos=1e3*r+s,i.push(o)),$.appendChild(c)}e.parentNode.replaceChild($,e),i.length&&Ye(i,t)}}var pt=function(){this.queue=[]};pt.prototype={render:function(e){if(!this.locked){this.locked=e?b.offsetHeight+10:1;var t=this;N.nextTick(function(){t.flush()})}},flush:function(){for(var e,t=0;e=this.queue[t++];)e.update&&e.update();this.locked=0,this.queue=[]}};var dt=new pt,ht={};["autofocus,autoplay,async,allowTransparency,checked,controls","declare,disabled,defer,defaultChecked,defaultSelected","contentEditable,isMap,loop,multiple,noHref,noResize,noShade","open,readOnly,selected"].join(",").replace(f,function(e){ht[e.toLowerCase()]=e});N.directive("attr",{init:function(e){if(e.expr=Fe(e.expr.trim()),"include"===e.type){var t=e.element;St(t,e),e.includeRendered=Ue(t,"data-rendered",e.vmodels),e.includeLoaded=Ue(t,"data-loaded",e.vmodels);var r=e.includeReplace=t.hasAttribute("replace");t.hasAttribute("cache")&&(e.templateCache={}),e.start=n.createComment(":include"),e.end=n.createComment(":include-end"),r?(e.element=e.end,e._element=t,t.parentNode.insertBefore(e.start,t),t.parentNode.insertBefore(e.end,t.nextSibling)):(t.insertBefore(e.start,t.firstChild),t.appendChild(e.end))}},update:function(e){var t=this.element,n={};if(e=K(e),this.param)e&&"object"==typeof e?Array.isArray(e)?n[this.param]=e:Date.isDate(e)?n[this.param]=e.toISOString():n[this.param]=e:n[this.param]=e;else{if(!e||"object"!=typeof e||Array.isArray(e)||Date.isDate(e))return;n=e}for(var r in n)if("style"!==r)if("href"===r||"src"===r)t[r]=n[r];else{if(!1!==n[r]&&null!==n[r]&&void 0!==n[r]||(n[r]=""),"boolean"==typeof t[r]||"boolean"==typeof t[ht[r]]){var i=r;if(ht[r]&&i!==ht[r]&&(i=ht[r]),n[r]=!!n[r],t[i]=n[r],!n[r]){t.removeAttribute(i);continue}}!d.test(t)&&r in t.cloneNode(!1)?t[r]=n[r]:("object"==typeof n[r]&&(n[r]=Date.isDate(n[r])?n[r].toISOString():JSON.stringify(n[r])),t.setAttribute(r,n[r]))}else t.style.cssText=n[r]}});N.directive("class",{init:function(e){if(e.expr=e.expr.replace(/\n/g," ").replace(/\s+/g," "),"hover"===e.type||"active"===e.type){var t=new Function("return "+e.expr)();if(!e.hasBindEvent){var n=e.element,r=N(n),i="mouseenter",a="mouseleave";if("active"===e.type){n.tabIndex=n.tabIndex||-1,i="mousedown",a="mouseup";var o=r.bind("mouseleave",function(){r.removeClass(t)})}}var s=r.bind(i,function(){r.addClass(t)}),c=r.bind(a,function(){r.removeClass(t)});e.rollback=function(){r.unbind("mouseleave",o),r.unbind(i,s),r.unbind(a,c)},e.hasBindEvent=!0}},update:function(e){if("class"===this.type){var t=e;if(!t||this.param)return a('class指令语法错误 %c %s="%s"',"color:#f00",this.name,this.expr);for(var n in"string"==typeof t&&((t={})[e]=!0),N.isPlainObject(t)||(t=t.$model),t)this.element.classList.toggle(n,!!t[n])}}}),"hover,active".replace(f,function(e){S[e]=S.class}),N.directive("css",{init:S.attr.init,update:function(e){var t=N(this.element);if(this.param)t.css(this.param,e);else{if("object"!=typeof e)return a(':css指令格式错误 %c %s="%s"',"color:#f00",this.name,this.expr);var n=e;N.isPlainObject(n)||(n=e.$model),t.css(n)}}}),N.directive("data",{priority:100,init:S.attr.init,update:function(e){var t=N(this.element);if(this.param)t.data(this.param,e);else{if("object"!=typeof e)return a(':data指令格式错误 %c %s="%s"',"color:#f00",this.name,this.expr);var n=e;for(var r in N.isPlainObject(n)||(n=e.$model),n)t.data(r,n[r])}}});var vt=/^(?:checkbox|radio)$/,mt=/^(?:radio|checked)$/,yt=/^(file|button|reset|submit|checkbox|radio|range)$/;N.directive("duplex",{priority:2e3,init:function(e,t){var n=e.element,r=e.vmodels;e.changed=Ue(n,"data-changed",r)||w;var i=[],o=C("string,number,boolean,checked");"radio"===n.type&&""===e.param&&(e.param="checked"),e.param.replace(p,function(r){vt.test(n.type)&&mt.test(r)&&(r="checked",e.isChecked=!0,e.xtype="radio"),o[r]&&(t=!0),N.Array.ensure(i,r)}),t||i.push("string"),e.param=i.join("-"),e.xtype||(e.xtype="SELECT"===n.tagName?"select":"checkbox"===n.type?"checkbox":"radio"===n.type?"radio":/^change/.test(n.getAttribute("data-event"))?"change":"input"),n.expr=e.expr;var s=e.bound=function(t,r){n.addEventListener(t,r,!1);var i=e.rollback;e.rollback=function(){n.anotSetter=null,N.unbind(n,t,r),i&&i()}};function c(t){e.changed.call(this,t)}var l=!1;var u=function(t){var r=n.value;if(!l&&r!==e.oldValue&&null!==e.pipe){var i=e.pipe(r,e,"get");e.oldValue=r,e.setter(i),c.call(n,i),N.fireDom(n,"change")}};switch(e.xtype){case"radio":s("click",function(){var t=e.pipe(n.value,e,"get");e.setter(t),c.call(n,t)});break;case"checkbox":s("change",function(){var t=n.checked?"ensure":"remove",r=e.getter.apply(0,e.vmodels);Array.isArray(r)||(a(":duplex应用于checkbox上要对应一个数组"),r=[r]);var i=e.pipe(n.value,e,"get");N.Array[t](r,i),c.call(n,r)});break;case"change":s("change",u);break;case"input":s("input",u),s("keyup",u),s("compositionstart",function(){l=!0}),s("compositionend",function(){l=!1,setTimeout(u)}),s("DOMAutoComplete",u);break;case"select":s("change",function(){var t=N(n).val();if((t=Array.isArray(t)?t.map(function(t){return e.pipe(t,e,"get")}):e.pipe(t,e,"get"))+""!==e.oldValue)try{e.setter(t)}catch(e){a(e)}}),s("datasetchanged",function(t){if("selectDuplex"===t.bubble){var r=e._value,i=Array.isArray(r)?r.map(String):r+"";N(n).val(i),n.oldValue=i+"",c.call(n,i)}})}"input"!==e.xtype||yt.test(n.type)||("hidden"!==n.type&&(s("focus",function(){n.msFocus=!0}),s("blur",function(){n.msFocus=!1})),n.anotSetter=u,kt(function(){if(b.contains(n))n.msFocus||u();else if(!n.msRetain)return!1}))},update:function(e){var t,n=this.element;this.init||((this.pipe||(this.pipe=bt))(null,this,"init"),this.init=1);switch(this.xtype){case"input":n.value=e;break;case"change":if((t=this.pipe(e,this,"set"))!==this.oldValue){var r=!1;if(n.msFocus)try{var i=n.selectionStart;if(i===n.selectionEnd){var a=i;r=!0}}catch(e){}n.value=this.oldValue=t,r&&!n.readOnly&&(n.selectionStart=n.selectionEnd=a)}break;case"radio":t=this.isChecked?!!e:e+""===n.value,n.checked=t;break;case"checkbox":var o=[].concat(e);t=this.pipe(n.value,this,"get"),n.checked=o.indexOf(t)>-1;break;case"select":this._value=e,n.msHasEvent?N.fireDom(n,"datasetchanged",{bubble:n.msHasEvent}):n.msHasEvent="selectDuplex"}}});function gt(e){return null==e?"":e}function bt(e,t,n,r){return t.param.replace(p,function(r){var i=N.duplexHooks[r];i&&"function"==typeof i[n]&&(e=i[n](e,t))}),e}N.duplexHooks={checked:{get:function(e,t){return!t.oldValue}},string:{get:function(e){return e},set:gt},boolean:{get:function(e){return"true"===e},set:gt},number:{get:function(e,t){var n=+e;return+e===n?n:0},set:gt}};var $t,xt=[];function wt(){for(var e=xt.length-1;e>=0;e--){!1===(0,xt[e])()&&xt.splice(e,1)}xt.length||clearInterval($t)}N.tick=function(e){1===xt.push(e)&&($t=setInterval(wt,60))};var kt=w;new function(){try{var e={},t=HTMLInputElement.prototype,n=HTMLTextAreaElement.prototype;function r(t){e[this.tagName].call(this,t),!this.msFocus&&this.anotSetter&&this.anotSetter()}var i=HTMLInputElement.prototype;Object.getOwnPropertyNames(i),e.INPUT=Object.getOwnPropertyDescriptor(t,"value").set,Object.defineProperty(t,"value",{set:r}),e.TEXTAREA=Object.getOwnPropertyDescriptor(n,"value").set,Object.defineProperty(n,"value",{set:r})}catch(e){kt=N.tick}},N.directive("effect",{priority:5,init:function(e){var t,n,r=e.expr,i=r.replace(F,function(e){return e.replace(/./g,"0")}).indexOf(":");-1===i?(t=r,n=!0):(t=r.slice(0,i),n=r.slice(i+1)),t=H.test(r)?Fe(t):We(t),e.expr="["+t+","+n+"]"},update:function(e){var t=e[0],n=this.element;if(n.getAttribute("data-effect-name")!==t){n.removeAttribute("data-effect-driver");var r=n.style,i=window.getComputedStyle?window.getComputedStyle(n):null,a=!1;if(i&&(Nt||jt)){var o=r[Tt]||i[Tt];o&&"0s"!==o&&(n.setAttribute("data-effect-driver","t"),a=!0),a||(o=r[Ot]||i[Ot])&&"0s"!==o&&(n.setAttribute("data-effect-driver","a"),a=!0)}a||N.effects[t]&&(n.setAttribute("data-effect-driver","j"),a=!0),a&&n.setAttribute("data-effect-name",t)}}}),N.effects={},N.effect=function(e,t){N.effects[e]=t};var Ct,At,Nt=!1,jt=!1,Tt=N.cssName("transition-duration"),Ot=N.cssName("animation-duration");new function(){var e,t,n={TransitionEvent:"transitionend",WebKitTransitionEvent:"webkitTransitionEnd",OTransitionEvent:"oTransitionEnd",otransitionEvent:"otransitionEnd"};for(var r in n){if(window[r]){e=n[r];break}try{document.createEvent(r);e=n[r];break}catch(e){}}for(r in"string"==typeof e&&(Nt=!0,Ct=e),n={AnimationEvent:"animationend",WebKitAnimationEvent:"webkitAnimationEnd"})if(window[r]){t=n[r];break}"string"==typeof t&&(Nt=!0,At=t)};var Et=[];function St(e,t){var n=e.getAttribute("data-effect-name");if(n){t.effectName=n,t.effectDriver=e.getAttribute("data-effect-driver");var r=+e.getAttribute("data-effect-stagger");t.effectLeaveStagger=+e.getAttribute("data-effect-leave-stagger")||r,t.effectEnterStagger=+e.getAttribute("data-effect-enter-stagger")||r,t.effectClass=e.className||NaN}}function Dt(e){return e.replace(/^[\S]/g,function(e){return e.toUpperCase()})}var _t=new pt;function Pt(){}function Lt(e,t){var n=e.callbacks[t+"Class"];return"string"==typeof n?n:"function"==typeof n?n():e.name+"-"+t}function Mt(e,t,n){var r=e.callbacks[t];r&&r.call(e,e.el,n)}Pt.prototype={contrustor:Pt,enterClass:function(){return Lt(this,"enter")},leaveClass:function(){return Lt(this,"leave")},actionFun:function(e,t,n){if(!document.hidden){var r=this,i=r.el,a="leave"===e;e=a?"leave":"enter",Mt(r,"abort"+Dt(a?"enter":"leave")),Mt(r,"before"+Dt(e)),a||t(i);var o=function(o){i.removeEventListener(r.cssEvent,r.cssCallback),a?(t(i),N(i).removeClass(r.cssClass)):"a"===r.driver&&N(i).removeClass(r.cssClass),!0!==o&&(Mt(r,"after"+Dt(e)),n&&n(i)),r.dispose()};r.useCss?(r.cssCallback&&r.cssCallback(!0),r.cssClass=Lt(r,e),r.cssCallback=o,r.update=function(){i.addEventListener(r.cssEvent,r.cssCallback),a||"t"!==r.driver||N(i).removeClass(r.cssClass)},N(i).addClass(r.cssClass),_t.render(!0),_t.queue.push(r)):Mt(r,e,o)}},enter:function(e,t){this.actionFun.apply(this,["enter"].concat(N.slice(arguments)))},leave:function(e,t){this.actionFun.apply(this,["leave"].concat(N.slice(arguments)))},dispose:function(){this.update=this.cssCallback=null,Et.unshift(this)>100&&Et.pop()}};var Ht=function(e,t){var n=g.call(arguments,0);"function"!=typeof n[2]&&n.splice(2,0,w),"function"!=typeof n[3]&&n.splice(3,0,w);var r=n[2],i=n[3],a=function(e,t){if(!e||1!==e.nodeType)return null;if(t)var n=t.effectName,r=t.effectDriver;else n=e.getAttribute("data-effect-name"),r=e.getAttribute("data-effect-driver");if(!n||!r)return null;var i=Et.pop()||new Pt;return i.el=e,i.driver=r,i.useCss="j"!==r,i.useCss&&(t&&N(e).addClass(t.effectClass),i.cssEvent="t"===r?Ct:At),i.name=n,i.callbacks=N.effects[n]||{},i}(e,n[4]);if(!a)return r(),i(),!1;a[t?"enter":"leave"](r,i)};N.mix(N.effect,{apply:Ht,append:function(e,t,n,r){return Ht(e,1,function(){t.appendChild(e)},n,r)},before:function(e,t,n,r){return Ht(e,1,function(){t.parentNode.insertBefore(e,t)},n,r)},remove:function(e,t,n,r){return Ht(e,0,function(){e.parentNode===t&&t.removeChild(e)},n,r)}}),N.directive("html",{update:function(e){var t=this.element,r=1!==t.nodeType,i=r?t.parentNode:t;if(i){if(e=null==e?"":e,3===t.nodeType){var a=A("html");i.insertBefore(n.createComment(a),t),this.element=n.createComment(a+":end"),i.replaceChild(this.element,t),t=this.element}if("object"!=typeof e)var o=N.parseHTML(String(e));else if(11===e.nodeType)o=e;else if(1===e.nodeType||e.item){var s=1===e.nodeType?e.childNodes:e.item;for(o=$.cloneNode(!0);s[0];)o.appendChild(s[0])}if(s=N.slice(o.childNodes),r){for(var c=t.nodeValue.slice(0,-4);;){var l=t.previousSibling;if(!l||8===l.nodeType&&l.nodeValue===c)break;i.removeChild(l)}i.insertBefore(o,t)}else N.clearHTML(t).appendChild(o);rt(s,this.vmodels)}}}),N.directive("text",{update:function(e){var t=this.element;if(e=null==e?"":e,3===t.nodeType)try{t.data=e}catch(e){}else t.textContent=e}}),N.directive("if",{priority:10,update:function(e){var t,r=this,a=this.element,o=r.stamp=Date.now(),s=function(){o===r.stamp&&(r.recoverNode=null)};r.recoverNode&&r.recoverNode();try{if(!a.parentNode)return;t=a.parentNode}catch(e){return}if(e){function c(){a.getAttribute(r.name)&&(a.removeAttribute(r.name),et(a,r.vmodels)),r.rollback=null}if(8===a.nodeType){var l=r.keep,u=N.effect.apply(l,1,function(){o===r.stamp&&(a.parentNode.replaceChild(l,a),a=r.element=l,l.getAttribute("_required")&&(a.required=!0,a.removeAttribute("_required")),a.querySelectorAll&&N.each(a.querySelectorAll("[_required=true]"),function(e){e.required=!0,e.removeAttribute("_required")}),c())},s);u=!1===u}u||c()}else if(1===a.nodeType){!0===a.required&&(a.required=!1,a.setAttribute("_required","true"));try{N.each(a.querySelectorAll(":required"),function(e){a.required=!1,e.setAttribute("_required","true")})}catch(e){}var f=r.element=n.createComment(":if"),p=a.nextSibling;r.recoverNode=function(){r.recoverNode=null,f.parentNode!==t&&(t.insertBefore(f,p),r.keep=a)},N.effect.apply(a,0,function(){r.recoverNode=null,o===r.stamp&&(a.parentNode.replaceChild(f,a),r.keep=a,i.appendChild(a),r.rollback=function(){a.parentNode===i&&i.removeChild(a)})},s)}}});var Ft=N.templateCache={};function Bt(e){for(var t=n.createDocumentFragment(),r=0,i=e.length;r=200&&this.status<400?m.resolve(this.response):m.reject(this))},v.send(null),m.promise).then(t=>{Ft[e]=t,y(t)}).catch(t=>{a(":include load ["+e+"] error\n%c%s","color:#f30",`获取网络资源出错, ${t.status} (${t.statusText})`)})}}});var It=/\(([^)]*)\)/,Rt=N.directive("on",{priority:3e3,init:function(e){var t=e.expr;e.type="on";var n=e.param.replace(/-\d+$/,"");if("function"==typeof Rt[n+"Hook"]&&Rt[n+"Hook"](e),t.indexOf("(")>0&&t.indexOf(")")>-1){var r=(t.match(It)||["",""])[1].trim();""!==r&&"$event"!==r||(t=t.replace(It,""))}e.expr=t},update:function(e){var t=this,n=this.element;e=function(e){return(t.getter||w).apply(t.args[0],t.args.concat(e))};var r=t.param.replace(/-\d+$/,"");if("scan"===r)e.call(n,{type:r});else if("function"==typeof t.specialBind)t.specialBind(n,e);else var i=N.bind(n,r,e);t.rollback=function(){"function"==typeof t.specialUnbind?t.specialUnbind():N.unbind(n,r,i)}}});function qt(e,t,n){for(var r,i=0;r=e[i++];)r.className===n.effectClass&&N.effect.apply(r,t,w,w,n)}function Vt(e,t,n){return e?setTimeout(t,++n*e):t(),n}function Wt(e,t,n){for(var r=$.cloneNode(!1),i=e,a=i.nodeValue,o=t&&Math.max(+t.staggerIndex,0),s=N.slice(i.parentNode.childNodes),c=s.indexOf(i);;){var l=s[--c];if(!l||0===String(l.nodeValue).indexOf(a))break;!n&&t&&l.className===t.effectClass?(e=l,function(e){t.staggerIndex=Vt(t.effectLeaveStagger,function(){N.effect.apply(e,0,w,function(){r.appendChild(e)},t)},o)}(l)):r.insertBefore(l,r.firstChild)}return r.appendChild(i),r}function zt(e,t,n,r,i){var a=e.template.cloneNode(!0),o=N.slice(a.childNodes);a.appendChild(n.$anchor),i&&t.appendChild(a);n[e.param||"el"];var s={nodes:o,vmodels:[n].concat(e.vmodels),content:a};r.push(s)}function Ut(e){var t=("object"===e.xtype?Kt:Jt)(e);return(t.$anchor||(t.$anchor=e.element.cloneNode(!1))).nodeValue=e.signature,t.$outer=e.$outer,t}function Yt(e,t,n){if("array"===n){e.$remove=function(){t.$repeat.removeAt(e.$index)};var r=t.param;e.$watch(r,function(n){var r=e.$index;t.$repeat[r]=n})}else{var i=t.vars[0],a=t.vars[1];e.$up.$watch(t.expr+"."+e[i],function(n){e[t.param][a]=n,e[a]=n})}}N.directive("for",{priority:90,init:function(e){var t=e.type;e.cache={},e.enterCount=0;var r=e.element;if(1===r.nodeType){var i=e.expr.split(" in ");e.expr=i.pop(),i.length&&(i=i.pop().split(/\s+/)),e.vars=i,r.removeAttribute(e.name),St(r,e);var a=Ue(r,"data-rendered",e.vmodels),o=A(t),s=n.createComment(o+":start"),c=e.element=n.createComment(o+":end");e.signature=o,e.start=s,e.template=$.cloneNode(!1);var l=r.parentNode;if(l.replaceChild(c,r),l.insertBefore(s,c),e.template.appendChild(r),e.element=c,a)var u=N.bind(l,"datasetchanged",function(){a.apply(l,l.args),N.unbind(l,"datasetchanged",u),l.msRendered=a})}},update:function(e,t){var n=this,r=this.xtype;"array"===r?(this.vars.length?1===this.vars.length&&this.vars.unshift("$index"):this.vars.push("$index","el"),this.param=this.vars[1]):(this.param="__el__",this.vars.length?1===this.vars.length&&this.vars.push("$val"):this.vars.push("$key","$val")),this.enterCount+=1;var i=!t;if(i){n.$outer={};var a=this.vars[0],o=this.vars[1];"array"===r&&(a="$first",o="$last");for(var s,c=0;s=n.vmodels[c++];)if(s.hasOwnProperty(a)&&s.hasOwnProperty(o)){n.$outer=s;break}}var l=this.track,u="move";n.$repeat=e;var f=[],p=i&&$.cloneNode(!1),d=[],h=this.param,v=N.mix({},this.cache),m=this.element,y=l.length,g=m.parentNode,b=0;for(c=0;c10,A=m.previousSibling,j=n.start;if(C)for(;A!==j;)g.removeChild(A),A=m.previousSibling;for(c=0;cP.maxRepeatSize&&i.pop(),delete e[t]}}function Qt(e,t){var r="_"+e;if(!Qt[r]){var i=n.createElement(e);b.appendChild(i),t=getComputedStyle(i,null).display,b.removeChild(i),Qt[r]=t}return Qt[r]}N.parseDisplay=Qt,N.directive("visible",{init:function(e){St(e.element,e)},update:function(e){var t,n=this,r=this.element,i=!this.effectName;if(!this.stamp)return t=this.stamp=Date.now(),void(e?(r.style.display=n.display||"","none"===N(r).css("display")&&(r.style.display=n.display=Qt(r.nodeName))):r.style.display="none");t=this.stamp=+new Date,e?N.effect.apply(r,1,function(){if(t===n.stamp){var e=r.getAttribute("data-effect-driver")||"a";i&&(r.style.display=n.display||""),"a"!==e&&"t"!==e||"none"===N(r).css("display")&&(r.style.display=n.display||Qt(r.nodeName))}}):N.effect.apply(r,0,function(){t===n.stamp&&(r.style.display="none")})}});var en=/]*>([\S\s]*?)<\/script\s*>/gim,tn=/\s+(on[^=\s]+)(?:=("[^"]*"|'[^']*'|[^\s>]+))?/g,nn=/<\w+\b(?:(["'])[^"]*?(\1)|[^>])*>/gi,rn={a:/\b(href)\=("javascript[^"]*"|'javascript[^']*')/gi,img:/\b(src)\=("javascript[^"]*"|'javascript[^']*')/gi,form:/\b(action)\=("javascript[^"]*"|'javascript[^']*')/gi},an=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,on=/([^\#-~| |!])/g;function sn(e,t,n,r){e=(e+"").replace(/[^0-9+\-Ee.]/g,"");var i=isFinite(+e)?+e:0,a=isFinite(+t)?Math.abs(t):3,o=r||",",s=n||".",c="";return(c=(a?function(e,t){var n=Math.pow(10,t);return""+(Math.round(e*n)/n).toFixed(t)}(i,a):""+Math.round(i)).split("."))[0].length>3&&(c[0]=c[0].replace(/\B(?=(?:\d{3})+(?!\d))/g,o)),(c[1]||"").length>=0)%60,n=Math.floor(e/60),r=Math.floor(n/60);return n=(n%=60)<10?"0"+n:n,t=t<10?"0"+t:t,r>0?(r=r<10?"0"+r:r)+":"+n+":"+t:n+":"+t},$filter:function(e){for(var t=1,n=arguments.length;t/g,">")},currency:function(e,t,n){return(t||"¥")+sn(e,isFinite(n)?n:2)},number:sn,date:function(e,t){var n=e;if(!Date.isDate(n)){var r=+n;if(r==r&&(n=r),"Invalid Date"===(n=new Date(n)).toString())return"Invalid Date"}return n.format(t)}};let ln,un=[],fn=function(e){for(ln=!0;e=un.shift();)e(N)};return"complete"===n.readyState?setTimeout(fn):n.addEventListener("DOMContentLoaded",fn),window.addEventListener("load",fn),N.ready=function(e){ln?e(N):un.push(e)},window.Anot=N,N}();export default _Anot; \ No newline at end of file diff --git a/src/lib/form/button.js b/src/lib/form/button.js index 21af530..b6288d8 100644 --- a/src/lib/form/button.js +++ b/src/lib/form/button.js @@ -1,14 +1,14 @@ /** * * @authors yutent (yutent@doui.cc) - * @date 2019-09-07 23:35:03 + * @date 2019-11-05 23:34:04 * @version v2.0.1 * */ 'use strict' -import"../icon/index.js";const IS_FIREFOX=!!window.sidebar;export default class Button extends HTMLElement{static get observedAttributes(){return["icon","autofocus","loading","disabled"]}constructor(){super(),Object.defineProperty(this,"root",{value:this.attachShadow({mode:"open"}),writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(this,"props",{value:{icon:"",autofocus:"",loading:!1,disabled:!1},writable:!0,enumerable:!1,configurable:!0}),this.root.innerHTML=" ",this.hasAttribute("circle")&&(this.textContent=""),this.__BTN__=this.root.children[1],this.__ICO__=this.__BTN__.children[0]}get loading(){return this.props.loading}set loading(o){var t=typeof o;o!==this.props.loading&&("boolean"===t&&o||"boolean"!==t?(this.props.loading=!0,this.__ICO__.setAttribute("is","loading"),this.setAttribute("loading","")):(this.props.loading=!1,this.__ICO__.setAttribute("is",this.props.icon),this.removeAttribute("loading")))}get disabled(){return this.props.disabled}set disabled(o){var t=typeof o;o!==this.props.disabled&&("boolean"===t&&o||"boolean"!==t?(this.props.disabled=!0,this.setAttribute("disabled","")):(this.props.disabled=!1,this.removeAttribute("disabled")))}connectedCallback(){this._handleClick=(o=>{this.props.loading||this.props.disabled?o.stopPropagation():this.dispatchEvent(new CustomEvent("active"))}),this.__BTN__.addEventListener("click",this._handleClick,!1)}disconnectedCallback(){this.__BTN__.removeEventListener("click",this._handleClick)}attributeChangedCallback(o,t,e){if(null!==e&&t!==e)switch(o){case"icon":this.props.icon=e,e?this.props.loading||this.__ICO__.setAttribute("is",e):(this.removeAttribute("icon"),this.__ICO__.removeAttribute("is"));break;case"autofocus":this.__BTN__.setAttribute("autofocus",""),IS_FIREFOX&&setTimeout(o=>{this.__BTN__.focus()},10);break;case"loading":case"disabled":this[o]=!0}}}; +import"../icon/index.js";const IS_FIREFOX=!!window.sidebar;export default class Button extends HTMLElement{static get observedAttributes(){return["icon","autofocus","loading","disabled"]}constructor(){super(),Object.defineProperty(this,"root",{value:this.attachShadow({mode:"open"}),writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(this,"props",{value:{icon:"",autofocus:"",loading:!1,disabled:!1},writable:!0,enumerable:!1,configurable:!0}),this.root.innerHTML=" ",this.hasAttribute("circle")&&(this.textContent=""),this.__BTN__=this.root.children[1],this.__ICO__=this.__BTN__.children[0]}get loading(){return this.props.loading}set loading(o){var t=typeof o;o!==this.props.loading&&("boolean"===t&&o||"boolean"!==t?(this.props.loading=!0,this.__ICO__.setAttribute("is","loading"),this.setAttribute("loading","")):(this.props.loading=!1,this.__ICO__.setAttribute("is",this.props.icon),this.removeAttribute("loading")))}get disabled(){return this.props.disabled}set disabled(o){var t=typeof o;o!==this.props.disabled&&("boolean"===t&&o||"boolean"!==t?(this.props.disabled=!0,this.setAttribute("disabled","")):(this.props.disabled=!1,this.removeAttribute("disabled")))}connectedCallback(){this._handleClick=(o=>{this.props.loading||this.props.disabled?o.stopPropagation():this.dispatchEvent(new CustomEvent("active"))}),this.__BTN__.addEventListener("click",this._handleClick,!1)}disconnectedCallback(){this.__BTN__.removeEventListener("click",this._handleClick)}attributeChangedCallback(o,t,e){if(null!==e&&t!==e)switch(o){case"icon":this.props.icon=e,e?this.props.loading||this.__ICO__.setAttribute("is",e):(this.removeAttribute("icon"),this.__ICO__.removeAttribute("is"));break;case"autofocus":this.__BTN__.setAttribute("autofocus",""),IS_FIREFOX&&setTimeout(o=>{this.__BTN__.focus()},10);break;case"loading":case"disabled":this[o]=!0}}}; if(!customElements.get('wc-button')){ customElements.define('wc-button', Button) diff --git a/src/lib/form/checkbox.js b/src/lib/form/checkbox.js index b08554b..d1ed811 100644 --- a/src/lib/form/checkbox.js +++ b/src/lib/form/checkbox.js @@ -1,14 +1,14 @@ /** * * @authors yutent (yutent@doui.cc) - * @date 2019-09-07 23:35:03 + * @date 2019-11-05 23:34:04 * @version v2.0.1 * */ 'use strict' -import"../icon/index.js";import{bind,unbind}from"../utils.js";export default class Checkbox extends HTMLElement{static get observedAttributes(){return["label","color","value","checked","readonly","disabled"]}constructor(){super(),Object.defineProperty(this,"root",{value:this.attachShadow({mode:"open"}),writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(this,"props",{value:{label:"",color:"",value:[],checked:!1,readonly:!1,disabled:!1},writable:!0,enumerable:!1,configurable:!0}),this.root.innerHTML=" ",this.__SWITCH__=this.root.lastElementChild,this.__ICO__=this.__SWITCH__.children[0]}get value(){return this.props.value}set value(e){if(!Array.isArray(e))throw TypeError(":duplex指令需要传入一个数组, 当前为: "+typeof e);this.props.value=e,this.checked=this.props.value.includes(this.props.label)}get checked(){return this.props.checked}set checked(e){this.props.checked=!!e;var{value:o,checked:t,label:l,color:r}=this.props;this.__SWITCH__.classList.toggle("checked",t),this.__ICO__.setAttribute("is","checkbox-"+(t?"on":"off"));var c=o.indexOf(l);t?(this.__ICO__.setAttribute("color",r),c<0&&o.push(l)):(this.__ICO__.removeAttribute("color"),~c&&o.splice(c,1))}get readonly(){return this.props.readonly}set readonly(e){var o=typeof e;e!==this.props.readonly&&("boolean"===o&&e||"boolean"!==o?(this.props.readonly=!0,this.setAttribute("readonly","")):(this.props.readonly=!1,this.removeAttribute("readonly")))}get disabled(){return this.props.disabled}set disabled(e){var o=typeof e;e!==this.props.disabled&&("boolean"===o&&e||"boolean"!==o?(this.props.disabled=!0,this.setAttribute("disabled","")):(this.props.disabled=!1,this.removeAttribute("disabled")))}connectedCallback(){this._handlClick=bind(this,"click",e=>{e.preventDefault(),this.disabled||this.readonly||(this.checked=!this.checked,this.dispatchEvent(new CustomEvent("input")))})}disconnectedCallback(){unbind(this,"click",this._handlClick)}attributeChangedCallback(e,o,t){if(null!==t&&o!==t)switch(e){case"label":case"color":this.props[e]=t;break;case"checked":case"readonly":case"disabled":this[e]=!0}}}; +import"../icon/index.js";import{bind,unbind}from"../utils.js";export default class Checkbox extends HTMLElement{static get observedAttributes(){return["label","color","value","checked","readonly","disabled"]}constructor(){super(),Object.defineProperty(this,"root",{value:this.attachShadow({mode:"open"}),writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(this,"props",{value:{label:"",color:"",value:[],checked:!1,readonly:!1,disabled:!1},writable:!0,enumerable:!1,configurable:!0}),this.root.innerHTML=" ",this.__SWITCH__=this.root.lastElementChild,this.__ICO__=this.__SWITCH__.children[0]}get value(){return this.props.value}set value(e){log(e,this,this.props.label),Array.isArray(e)?(this.props.value=e,this.checked=this.props.value.includes(this.props.label)):console.error("checkbox组件的value必须是数组, 当前为: "+typeof e)}get checked(){return this.props.checked}set checked(e){this.props.checked=!!e;var{value:o,checked:t,label:l,color:r}=this.props;this.__SWITCH__.classList.toggle("checked",t),this.__ICO__.setAttribute("is","checkbox-"+(t?"on":"off"));var s=o.indexOf(l);t?(this.__ICO__.setAttribute("color",r),s<0&&o.push(l)):(this.__ICO__.removeAttribute("color"),~s&&o.splice(s,1))}get readonly(){return this.props.readonly}set readonly(e){var o=typeof e;e!==this.props.readonly&&("boolean"===o&&e||"boolean"!==o?(this.props.readonly=!0,this.setAttribute("readonly","")):(this.props.readonly=!1,this.removeAttribute("readonly")))}get disabled(){return this.props.disabled}set disabled(e){var o=typeof e;e!==this.props.disabled&&("boolean"===o&&e||"boolean"!==o?(this.props.disabled=!0,this.setAttribute("disabled","")):(this.props.disabled=!1,this.removeAttribute("disabled")))}connectedCallback(){this._handlClick=bind(this,"click",e=>{e.preventDefault(),this.disabled||this.readonly||(this.checked=!this.checked,this.dispatchEvent(new CustomEvent("input")))})}disconnectedCallback(){unbind(this,"click",this._handlClick)}attributeChangedCallback(e,o,t){if(null!==t&&o!==t)switch(e){case"label":case"color":this.props[e]=t;break;case"checked":case"readonly":case"disabled":this[e]=!0}}}; if(!customElements.get('wc-checkbox')){ customElements.define('wc-checkbox', Checkbox) diff --git a/src/lib/form/input.js b/src/lib/form/input.js index ec4f472..02ea0a4 100644 --- a/src/lib/form/input.js +++ b/src/lib/form/input.js @@ -1,14 +1,14 @@ /** * * @authors yutent (yutent@doui.cc) - * @date 2019-09-07 23:35:03 + * @date 2019-11-05 23:34:04 * @version v2.0.1 * */ 'use strict' -import"../scroll/index.js";import"../icon/index.js";import{ebind,bind,unbind,clickOutside}from"../utils.js";const TYPES=["text","textarea","password"],INPUTS={text:'',textarea:''};export default class Input extends HTMLElement{static get observedAttributes(){return["value","icon","type","label","placeholder","mvidx","autofocus","readonly","disabled"]}constructor(){super();var e,t=this.getAttribute("type");"textarea"!==t&&(t="text"),e=INPUTS[t],Object.defineProperty(this,"root",{value:this.attachShadow({mode:"open"}),writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(this,"props",{value:{value:"",icon:"",type:"text",label:"",placeholder:"",mvidx:null,autofocus:!1,readonly:!1,disabled:!1},writable:!0,enumerable:!1,configurable:!0}),this.root.innerHTML=`
${e}
    `,this.props.type=t,this.__OUTER__=this.root.children[1],this.__PREPEND__=this.__OUTER__.children[0],this.__INPUT__=this.__OUTER__.children[1],this.__ICO__=this.__OUTER__.children[2],this.__APPEND__=this.__OUTER__.children[3],this.__LIST__=this.__OUTER__.children[4]}get readonly(){return this.props.readonly}set readonly(e){var t=typeof e;e!==this.props.readonly&&("boolean"===t&&e||"boolean"!==t?(this.props.readonly=!0,this.setAttribute("readonly",""),this.__INPUT__.setAttribute("readonly","")):(this.props.readonly=!1,this.removeAttribute("readonly"),this.__INPUT__.removeAttribute("readonly")))}get disabled(){return this.props.disabled}set disabled(e){var t=typeof e;e!==this.props.disabled&&("boolean"===t&&e||"boolean"!==t?(this.props.disabled=!0,this.setAttribute("disabled",""),this.__INPUT__.setAttribute("disabled","")):(this.props.disabled=!1,this.removeAttribute("disabled"),this.__INPUT__.removeAttribute("disabled")))}get value(){return this.__INPUT__.value}set value(e){this.__INPUT__.value=e}get type(){return this.__INPUT__.type}set type(e){"textarea"!==e&&(this.__INPUT__.type=e)}_moveSelect(e){var{list:t}=this.props;if(t&&t.length){e.preventDefault();var i=38===e.keyCode?-1:1,s=Array.from(this.__LIST__.firstElementChild.firstElementChild.children);null===this.props.mvidx?this.props.mvidx=0:this.props.mvidx+=i,this.props.mvidx<0?this.props.mvidx=0:this.props.mvidx>s.length-1&&(this.props.mvidx=s.length-1),s.forEach((e,t)=>{t===this.props.mvidx?(this.__LIST__.firstElementChild.scrollTop=e.offsetTop-150,e.setAttribute("focus","")):e.removeAttribute("focus")})}}_fetchSelect(e,t){var i=this.props.list[e];this.value=i.value,this.dispatchEvent(new CustomEvent("select",{detail:i})),this._handleChange(t),this.__LIST__.classList.remove("show"),this.props.mvidx=null}connectedCallback(){for(var e=this.__PREPEND__.assignedNodes(),t=this.__APPEND__.assignedNodes();e.length>1;)this.removeChild(e.pop());for(;t.length>1;)this.removeChild(t.pop());e.length&&"textarea"!==this.props.type&&this.__OUTER__.setAttribute("prepend",""),t.length&&"textarea"!==this.props.type&&this.__OUTER__.setAttribute("append","");var{type:i}=this.props;this._handleSubmit=ebind(this.__INPUT__,"keydown",e=>{if(!this.disabled&&!this.readonly){if((38===e.keyCode||40===e.keyCode)&&"text"===this.type)return this._moveSelect(e);if(13===e.keyCode){if("text"===this.type&&null!==this.props.mvidx)return this._fetchSelect(this.props.mvidx,e);("text"===i||"textarea"===i&&(e.ctrlKey||e.metaKey))&&this.dispatchEvent(new CustomEvent("submit",{detail:this.value}))}}}),this._handleWheel=ebind(this.__INPUT__,"wheel"),"text"===i&&(this._handleChange=bind(this.__INPUT__,"input",e=>{e.preventDefault(),this.dispatchEvent(new CustomEvent("fetch-suggest",{detail:{value:this.value,send:e=>{this.props.list=e,this._parseSuggestion()}}}))}),this._parseSuggestion=bind(this.__INPUT__,"click",e=>{var{list:t}=this.props;let{x:i,y:s,width:o}=this.getBoundingClientRect();if(t&&t.length){var l=t.map((e,t)=>`
  • ${e.value}
  • `).join("");this.__LIST__.firstElementChild.firstElementChild.innerHTML=l,this.__LIST__.classList.toggle("show",!0),this.__LIST__.style.cssText=`left:${i}px;top:${s+50}px;width:${o}px;`}else this.__LIST__.classList.toggle("show",!1)}),this._inactiveFn=clickOutside(this,e=>{this.__LIST__.classList.remove("show")}),this._handleSelect=bind(this.__LIST__,"click",e=>{"LI"===e.target.tagName&&(this._fetchSelect(e.target.dataset.idx,e),this.dispatchEvent(new CustomEvent("input")))}))}disconnectedCallback(){unbind(this.__INPUT__,"wheel",this._handleWheel),unbind(this.__INPUT__,"keydown",this._handleSubmit),unbind(this.__INPUT__,"input",this._handleChange),unbind(document,"mousedown",this._inactiveFn),unbind(this.__LIST__,"click",this._handleSelect)}attributeChangedCallback(e,t,i){if(null!==i&&t!==i)switch(e){case"icon":this.props.icon=i,i?this.__ICO__.setAttribute("is",i):(this.removeAttribute("icon"),this.__ICO__.removeAttribute("is"));break;case"autofocus":this.__INPUT__.setAttribute("autofocus",""),setTimeout(e=>{this.__INPUT__.focus()},10);break;case"label":case"placeholder":this.__INPUT__.setAttribute("placeholder",i);break;case"type":~TYPES.indexOf(i)?this.type=i:this.type="text";break;case"value":this.value=i;break;case"readonly":case"disabled":this[e]=!0}}}; +import"../scroll/index.js";import"../icon/index.js";import{ebind,bind,unbind,clickOutside}from"../utils.js";const TYPES=["text","textarea","password"],INPUTS={text:'',textarea:''};export default class Input extends HTMLElement{static get observedAttributes(){return["value","icon","type","label","placeholder","mvidx","autofocus","readonly","disabled"]}constructor(){super();var e,t=this.getAttribute("type");"textarea"!==t&&(t="text"),e=INPUTS[t],Object.defineProperty(this,"root",{value:this.attachShadow({mode:"open"}),writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(this,"props",{value:{value:"",icon:"",type:"text",label:"",placeholder:"",mvidx:null,autofocus:!1,readonly:!1,disabled:!1},writable:!0,enumerable:!1,configurable:!0}),this.root.innerHTML=`
    ${e}
      `,this.props.type=t,this.__OUTER__=this.root.children[1],this.__PREPEND__=this.__OUTER__.children[0],this.__INPUT__=this.__OUTER__.children[1],this.__ICO__=this.__OUTER__.children[2],this.__APPEND__=this.__OUTER__.children[3],this.__LIST__=this.__OUTER__.children[4]}get readonly(){return this.props.readonly}set readonly(e){var t=typeof e;e!==this.props.readonly&&("boolean"===t&&e||"boolean"!==t?(this.props.readonly=!0,this.setAttribute("readonly",""),this.__INPUT__.setAttribute("readonly","")):(this.props.readonly=!1,this.removeAttribute("readonly"),this.__INPUT__.removeAttribute("readonly")))}get disabled(){return this.props.disabled}set disabled(e){var t=typeof e;e!==this.props.disabled&&("boolean"===t&&e||"boolean"!==t?(this.props.disabled=!0,this.setAttribute("disabled",""),this.__INPUT__.setAttribute("disabled","")):(this.props.disabled=!1,this.removeAttribute("disabled"),this.__INPUT__.removeAttribute("disabled")))}get value(){return this.__INPUT__.value}set value(e){this.__INPUT__.value=e}get type(){return this.__INPUT__.type}set type(e){"textarea"!==e&&(this.__INPUT__.type=e)}_moveSelect(e){var{list:t}=this.props;if(t&&t.length){e.preventDefault();var i=38===e.keyCode?-1:1,s=Array.from(this.__LIST__.firstElementChild.firstElementChild.children);null===this.props.mvidx?this.props.mvidx=0:this.props.mvidx+=i,this.props.mvidx<0?this.props.mvidx=0:this.props.mvidx>s.length-1&&(this.props.mvidx=s.length-1),s.forEach((e,t)=>{t===this.props.mvidx?(this.__LIST__.firstElementChild.scrollTop=e.offsetTop-150,e.setAttribute("focus","")):e.removeAttribute("focus")})}}_fetchSelect(e,t){var i=this.props.list[e];this.value=i.value,this.dispatchEvent(new CustomEvent("select",{detail:i})),this._handleChange(t),this.__LIST__.classList.remove("show"),this.props.mvidx=null}connectedCallback(){for(var e=this.__PREPEND__.assignedNodes(),t=this.__APPEND__.assignedNodes();e.length>1;)this.removeChild(e.pop());for(;t.length>1;)this.removeChild(t.pop());e.length&&"textarea"!==this.props.type&&this.__OUTER__.setAttribute("prepend",""),t.length&&"textarea"!==this.props.type&&this.__OUTER__.setAttribute("append","");var{type:i}=this.props;this._handleSubmit=ebind(this.__INPUT__,"keydown",e=>{if(!this.disabled&&!this.readonly){if((38===e.keyCode||40===e.keyCode)&&"text"===this.type)return this._moveSelect(e);if(13===e.keyCode){if("text"===this.type&&null!==this.props.mvidx)return this._fetchSelect(this.props.mvidx,e);("text"===i||"textarea"===i&&(e.ctrlKey||e.metaKey))&&this.dispatchEvent(new CustomEvent("submit",{detail:this.value}))}}}),this._handleWheel=ebind(this.__INPUT__,"wheel"),"text"===i&&(this._handleChange=bind(this.__INPUT__,"input",e=>{e.preventDefault(),this.dispatchEvent(new CustomEvent("fetch-suggest",{detail:{value:this.value,send:e=>{this.props.list=e,this._parseSuggestion()}}}))}),this._parseSuggestion=bind(this.__INPUT__,"click",e=>{var{list:t}=this.props;let{x:i,y:s,width:o}=this.getBoundingClientRect();if(t&&t.length){var l=t.map((e,t)=>`
    • ${e.value}
    • `).join("");this.__LIST__.firstElementChild.firstElementChild.innerHTML=l,this.__LIST__.classList.toggle("show",!0),this.__LIST__.style.cssText=`left:${i}px;top:${s+50}px;width:${o}px;`}else this.__LIST__.classList.toggle("show",!1)}),this._inactiveFn=clickOutside(this,e=>{this.__LIST__.classList.remove("show")}),this._handleSelect=bind(this.__LIST__,"click",e=>{"LI"===e.target.tagName&&(this._fetchSelect(e.target.dataset.idx,e),this.dispatchEvent(new CustomEvent("input")))}))}disconnectedCallback(){unbind(this.__INPUT__,"wheel",this._handleWheel),unbind(this.__INPUT__,"keydown",this._handleSubmit),unbind(this.__INPUT__,"input",this._handleChange),unbind(document,"mousedown",this._inactiveFn),unbind(this.__LIST__,"click",this._handleSelect)}attributeChangedCallback(e,t,i){if(null!==i&&t!==i)switch(e){case"icon":this.props.icon=i,i?this.__ICO__.setAttribute("is",i):(this.removeAttribute("icon"),this.__ICO__.removeAttribute("is"));break;case"autofocus":this.__INPUT__.setAttribute("autofocus",""),setTimeout(e=>{this.__INPUT__.focus()},10);break;case"label":case"placeholder":this.__INPUT__.setAttribute("placeholder",i);break;case"type":~TYPES.indexOf(i)?this.type=i:this.type="text";break;case"value":this.value=i;break;case"readonly":case"disabled":this[e]=!0}}}; if(!customElements.get('wc-input')){ customElements.define('wc-input', Input) diff --git a/src/lib/form/number.js b/src/lib/form/number.js index 30a145c..431da58 100644 --- a/src/lib/form/number.js +++ b/src/lib/form/number.js @@ -1,14 +1,14 @@ /** * * @authors yutent (yutent@doui.cc) - * @date 2019-09-07 23:35:03 + * @date 2019-11-05 23:34:04 * @version v2.0.1 * */ 'use strict' -import"../scroll/index.js";import"../icon/index.js";import{ebind,bind,unbind}from"../utils.js";export default class Number extends HTMLElement{static get observedAttributes(){return["value","max","min","step","autofocus","readonly","disabled"]}constructor(){super(),Object.defineProperty(this,"root",{value:this.attachShadow({mode:"open"}),writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(this,"props",{value:{value:0,max:null,min:null,step:1,autofocus:!1,readonly:!1,disabled:!1},writable:!0,enumerable:!1,configurable:!0}),this.root.innerHTML="
      - \x3c!-- --\x3e + \x3c!-- --\x3e
      ",this.__OUTER__=this.root.children[1],this.__INPUT__=this.__OUTER__.children[1]}get readonly(){return this.props.readonly}set readonly(e){var t=typeof e;e!==this.props.readonly&&("boolean"===t&&e||"boolean"!==t?(this.props.readonly=!0,this.setAttribute("readonly",""),this.__INPUT__.setAttribute("readonly","")):(this.props.readonly=!1,this.removeAttribute("readonly"),this.__INPUT__.removeAttribute("readonly")))}get disabled(){return this.props.disabled}set disabled(e){var t=typeof e;e!==this.props.disabled&&("boolean"===t&&e||"boolean"!==t?(this.props.disabled=!0,this.setAttribute("disabled",""),this.__INPUT__.setAttribute("disabled","")):(this.props.disabled=!1,this.removeAttribute("disabled"),this.__INPUT__.removeAttribute("disabled")))}get value(){return this.props.value}set value(e){var t=+e;e=t==t?t:0,this.props.value=e,this.__INPUT__.value=this.props.value,this._checkActionEnable()}_checkActionEnable(){var{max:e,min:t,value:i}=this.props;null!==e&&this.__OUTER__.children[2].classList.toggle("disabled",i>=e),null!==t&&this.__OUTER__.children[0].classList.toggle("disabled",i<=t)}_updateValue(e){var{max:t,min:i,value:s,step:a}=this.props;if("+"===e){if(null!==t&&ts-a)return;s-=a}this.props.value=+s.toFixed(2),this.__INPUT__.value=this.props.value,this._checkActionEnable(),this.dispatchEvent(new CustomEvent("input"))}connectedCallback(){this._handleSubmit=ebind(this.__INPUT__,"keydown",e=>{if(!this.disabled&&!this.readonly)return 38===e.keyCode||40===e.keyCode?(e.preventDefault(),this._updateValue(38===e.keyCode?"+":"-")):void(13===e.keyCode&&(e.preventDefault(),this.dispatchEvent(new CustomEvent("submit",{detail:this.value}))))}),this._handleChange=ebind(this.__INPUT__,"change",e=>{isFinite(this.__INPUT__.value)?(this.props.value=+this.__INPUT__.value,this.__INPUT__.value.endsWith(".")||(this.__INPUT__.value=this.props.value)):this.__INPUT__.value=this.props.value=0,this.dispatchEvent(new CustomEvent("input"))}),this._handleAction=bind(this.__OUTER__,"click",e=>{if(!this.disabled&&!this.readonly){var t=e.target;if("SPAN"===t.tagName||"SPAN"===t.parentNode){var i=t.dataset.act||t.parentNode.dataset.act;this._updateValue(i)}}})}disconnectedCallback(){unbind(this.__INPUT__,"keydown",this._handleSubmit)}attributeChangedCallback(e,t,i){if(null!==i&&t!==i)switch(e){case"autofocus":this.__INPUT__.setAttribute("autofocus",""),setTimeout(e=>{this.__INPUT__.focus()},10);break;case"value":this.value=i>>0;break;case"step":case"max":case"min":var s=+i;s==s&&(this.props[e]=s),this._checkActionEnable();break;case"readonly":case"disabled":this[e]=!0}}}; +import"../scroll/index.js";import"../icon/index.js";import{ebind,bind,unbind}from"../utils.js";export default class Number extends HTMLElement{static get observedAttributes(){return["value","max","min","step","autofocus","readonly","disabled"]}constructor(){super(),Object.defineProperty(this,"root",{value:this.attachShadow({mode:"open"}),writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(this,"props",{value:{value:0,max:null,min:null,step:1,autofocus:!1,readonly:!1,disabled:!1},writable:!0,enumerable:!1,configurable:!0}),this.root.innerHTML="
      - \x3c!-- --\x3e + \x3c!-- --\x3e
      ",this.__OUTER__=this.root.children[1],this.__INPUT__=this.__OUTER__.children[1]}get readonly(){return this.props.readonly}set readonly(e){var t=typeof e;e!==this.props.readonly&&("boolean"===t&&e||"boolean"!==t?(this.props.readonly=!0,this.setAttribute("readonly",""),this.__INPUT__.setAttribute("readonly","")):(this.props.readonly=!1,this.removeAttribute("readonly"),this.__INPUT__.removeAttribute("readonly")))}get disabled(){return this.props.disabled}set disabled(e){var t=typeof e;e!==this.props.disabled&&("boolean"===t&&e||"boolean"!==t?(this.props.disabled=!0,this.setAttribute("disabled",""),this.__INPUT__.setAttribute("disabled","")):(this.props.disabled=!1,this.removeAttribute("disabled"),this.__INPUT__.removeAttribute("disabled")))}get value(){return this.props.value}set value(e){var t=+e;e=t==t?t:0,this.props.value=e,this.__INPUT__.value=this.props.value,this._checkActionEnable()}_checkActionEnable(){var{max:e,min:t,value:i}=this.props;null!==e&&this.__OUTER__.children[2].classList.toggle("disabled",i>=e),null!==t&&this.__OUTER__.children[0].classList.toggle("disabled",i<=t)}_updateValue(e){var{max:t,min:i,value:s,step:a}=this.props;if("+"===e){if(null!==t&&ts-a)return;s-=a}this.props.value=+s.toFixed(2),this.__INPUT__.value=this.props.value,this._checkActionEnable(),this.dispatchEvent(new CustomEvent("input"))}connectedCallback(){this._handleSubmit=ebind(this.__INPUT__,"keydown",e=>{if(!this.disabled&&!this.readonly)return 38===e.keyCode||40===e.keyCode?(e.preventDefault(),this._updateValue(38===e.keyCode?"+":"-")):void(13===e.keyCode&&(e.preventDefault(),this.dispatchEvent(new CustomEvent("submit",{detail:this.value}))))}),this._handleChange=ebind(this.__INPUT__,"change",e=>{isFinite(this.__INPUT__.value)?(this.props.value=+this.__INPUT__.value,this.__INPUT__.value.endsWith(".")||(this.__INPUT__.value=this.props.value)):this.__INPUT__.value=this.props.value=0,this.dispatchEvent(new CustomEvent("input"))}),this._handleAction=bind(this.__OUTER__,"click",e=>{if(!this.disabled&&!this.readonly){var t=e.target;if("SPAN"===t.tagName||"SPAN"===t.parentNode){var i=t.dataset.act||t.parentNode.dataset.act;this._updateValue(i)}}})}disconnectedCallback(){unbind(this.__INPUT__,"keydown",this._handleSubmit)}attributeChangedCallback(e,t,i){if(null!==i&&t!==i)switch(e){case"autofocus":this.__INPUT__.setAttribute("autofocus",""),setTimeout(e=>{this.__INPUT__.focus()},10);break;case"value":this.value=i>>0;break;case"step":case"max":case"min":var s=+i;s==s&&(this.props[e]=s),this._checkActionEnable();break;case"readonly":case"disabled":this[e]=!0}}}; if(!customElements.get('wc-number')){ customElements.define('wc-number', Number) diff --git a/src/lib/form/progress.js b/src/lib/form/progress.js index 34e6d5a..1b5c685 100644 --- a/src/lib/form/progress.js +++ b/src/lib/form/progress.js @@ -1,7 +1,7 @@ /** * * @authors yutent (yutent@doui.cc) - * @date 2019-09-07 23:35:03 + * @date 2019-11-05 23:34:04 * @version v2.0.1 * */ diff --git a/src/lib/form/radio.js b/src/lib/form/radio.js index 970236f..4a592d0 100644 --- a/src/lib/form/radio.js +++ b/src/lib/form/radio.js @@ -1,14 +1,14 @@ /** * * @authors yutent (yutent@doui.cc) - * @date 2019-09-07 23:35:03 + * @date 2019-11-05 23:34:04 * @version v2.0.1 * */ 'use strict' -import{bind,unbind}from"../utils.js";export default class Radio extends HTMLElement{static get observedAttributes(){return["label","checked","readonly","disabled"]}constructor(){super(),Object.defineProperty(this,"root",{value:this.attachShadow({mode:"open"}),writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(this,"props",{value:{label:"",checked:!1,readonly:!1,disabled:!1},writable:!0,enumerable:!1,configurable:!0}),this.root.innerHTML=" ",this.__SWITCH__=this.root.lastElementChild}get value(){return this.props.label}set value(e){this.checked=this.props.label===e}get checked(){return this.props.checked}set checked(e){this.props.checked=!!e,this.__SWITCH__.classList.toggle("checked",this.props.checked)}get readonly(){return this.props.readonly}set readonly(e){var o=typeof e;e!==this.props.readonly&&("boolean"===o&&e||"boolean"!==o?(this.props.readonly=!0,this.setAttribute("readonly","")):(this.props.readonly=!1,this.removeAttribute("readonly")))}get disabled(){return this.props.disabled}set disabled(e){var o=typeof e;e!==this.props.disabled&&("boolean"===o&&e||"boolean"!==o?(this.props.disabled=!0,this.setAttribute("disabled","")):(this.props.disabled=!1,this.removeAttribute("disabled")))}connectedCallback(){this._handleClick=bind(this,"click",e=>{this.disabled||this.readonly||this.checked||(this.checked=!0,this.dispatchEvent(new CustomEvent("input")))})}disconnectedCallback(){unbind(this,"click",this._handleClick)}attributeChangedCallback(e,o,t){if(null!==t&&o!==t)switch(e){case"label":this.props.label=t;break;case"checked":case"readonly":case"disabled":this[e]=!0}}}; +import{bind,unbind}from"../utils.js";export default class Radio extends HTMLElement{static get observedAttributes(){return["label","checked","readonly","disabled"]}constructor(){super(),Object.defineProperty(this,"root",{value:this.attachShadow({mode:"open"}),writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(this,"props",{value:{label:"",checked:!1,readonly:!1,disabled:!1},writable:!0,enumerable:!1,configurable:!0}),this.root.innerHTML=" ",this.__SWITCH__=this.root.lastElementChild}get value(){return this.props.label}set value(e){this.checked=this.props.label===e}get checked(){return this.props.checked}set checked(e){this.props.checked=!!e,this.__SWITCH__.classList.toggle("checked",this.props.checked)}get readonly(){return this.props.readonly}set readonly(e){var o=typeof e;e!==this.props.readonly&&("boolean"===o&&e||"boolean"!==o?(this.props.readonly=!0,this.setAttribute("readonly","")):(this.props.readonly=!1,this.removeAttribute("readonly")))}get disabled(){return this.props.disabled}set disabled(e){var o=typeof e;e!==this.props.disabled&&("boolean"===o&&e||"boolean"!==o?(this.props.disabled=!0,this.setAttribute("disabled","")):(this.props.disabled=!1,this.removeAttribute("disabled")))}connectedCallback(){this._handleClick=bind(this,"click",e=>{this.disabled||this.readonly||this.checked||(this.checked=!0,this.dispatchEvent(new CustomEvent("input")))})}disconnectedCallback(){unbind(this,"click",this._handleClick)}attributeChangedCallback(e,o,t){if(null!==t&&o!==t)switch(e){case"label":this.props.label=t;break;case"checked":case"readonly":case"disabled":this[e]=!0}}}; if(!customElements.get('wc-radio')){ customElements.define('wc-radio', Radio) diff --git a/src/lib/form/select.js b/src/lib/form/select.js index d3ec65e..b756646 100644 --- a/src/lib/form/select.js +++ b/src/lib/form/select.js @@ -1,14 +1,14 @@ /** * * @authors yutent (yutent@doui.cc) - * @date 2019-09-07 23:35:03 + * @date 2019-11-05 23:34:04 * @version v2.0.1 * */ 'use strict' -import"../scroll/index.js";import"../icon/index.js";import{ebind,bind,unbind,clickOutside}from"../utils.js";function parseOptions(e,t){let i="";for(let s of e)if(s.list){i+=`
      ${s.name}
      `;for(let e of s.list)t.DICT[e.value]=e,e.disabled||t.LIST.push(e),i+=`
      ${e.label}
      `}else s.disabled||t.LIST.push(s),t.DICT[s.value]=s,i+=`
      ${s.label}
      `;return i}export default class Select extends HTMLElement{static get observedAttributes(){return["label","placeholder","multi","value","options","mvidx","disabled"]}constructor(){super(),Object.defineProperty(this,"root",{value:this.attachShadow({mode:"open"}),writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(this,"props",{value:{label:"",placeholder:"",multi:"",value:"",options:"",mvidx:null,disabled:!1},writable:!0,enumerable:!1,configurable:!0}),this.root.innerHTML="
      ",this.__OUTER__=this.root.children[1],this.__PREPEND__=this.__OUTER__.children[0],this.__INPUT__=this.__OUTER__.children[1],this.__APPEND__=this.__OUTER__.children[3],this.__OPTG__=this.__OUTER__.children[4]}get disabled(){return this.props.disabled}set disabled(e){var t=typeof e;e!==this.props.disabled&&("boolean"===t&&e||"boolean"!==t?(this.props.disabled=!0,this.setAttribute("disabled",""),this.__INPUT__.setAttribute("disabled","")):(this.props.disabled=!1,this.removeAttribute("disabled"),this.__INPUT__.removeAttribute("disabled")))}get value(){return this.props.value}set value(e){var{DICT:t,active:i}=this.props;this.props.value=e,this.__INPUT__.value=t&&t[e]&&t[e].label||e,i||this._updateStyle()}_renderOptions(e){this.props.DICT={},this.props.LIST=[];var t=this.__OPTG__.firstElementChild.firstElementChild;t.innerHTML=parseOptions(e,this.props),this.props.ITEMS=Array.from(t.children).filter(e=>"DD"===e.tagName&&!e.hasAttribute("disabled")),this.value=this.props.value}_moveSelect(e){var{LIST:t,DICT:i,ITEMS:s}=this.props;if(t&&t.length){e.preventDefault();var o=38===e.keyCode?-1:1;null===this.props.mvidx?this.props.mvidx=0:this.props.mvidx+=o,this.props.mvidx<0?this.props.mvidx=0:this.props.mvidx>s.length-1&&(this.props.mvidx=s.length-1),s.forEach((e,t)=>{t===this.props.mvidx?(this.__OPTG__.firstElementChild.scrollTop=e.offsetTop-150,e.setAttribute("focus","")):e.removeAttribute("focus")})}}_updateStyle(e){var{LIST:t,ITEMS:i,value:s}=this.props;if(t&&t.length){if(void 0===e)for(let i,o=-1;i=t[++o];)if(s===i.value){e=o;break}this.props.mvidx=e,i.forEach((t,i)=>{i===e?t.setAttribute("focus",""):t.removeAttribute("focus")})}}_fetchSelect(e,t){var i=this.props.LIST[e];this.value=i.value,this.dispatchEvent(new CustomEvent("select",{detail:i})),t&&this._updateStyle(e),this.props.active=!1,this.__OPTG__.classList.remove("show")}connectedCallback(){for(var e=this.__PREPEND__.assignedNodes(),t=this.__APPEND__.assignedNodes();e.length>1;)this.removeChild(e.pop());for(;t.length>1;)this.removeChild(t.pop());function i(){var{x:e,y:t,width:i}=this.getBoundingClientRect(),s=this.getAttribute("size");this.props.active=!0,t+=s&&"mini"===s?32:50,this.__OPTG__.style.cssText=`left:${e}px;top:${t}px;width:${i}px;`}e.length&&"textarea"!==this.props.type&&this.__OUTER__.setAttribute("prepend",""),t.length&&"textarea"!==this.props.type&&this.__OUTER__.setAttribute("append",""),this._handleKeydown=ebind(this.__INPUT__,"keydown",e=>{if(!this.disabled&&!this.readonly)return 38===e.keyCode||40===e.keyCode?this.props.active?this._moveSelect(e):(i.call(this),void this.__OPTG__.classList.toggle("show",!0)):13===e.keyCode&&null!==this.props.mvidx&&this.props.active?this._fetchSelect(this.props.mvidx):void 0}),this._activeFn=bind(this.__INPUT__,"click",e=>{var{options:t}=this.props;i.call(this),this.__OPTG__.classList.toggle("show")}),this._handleSelect=bind(this.__OPTG__,"click",e=>{"DD"!==e.target.tagName||e.target.hasAttribute("disabled")||(this._fetchSelect(+e.target.dataset.idx,!0),this.dispatchEvent(new CustomEvent("input")))}),this._inactiveFn=clickOutside(this,e=>{this.__OPTG__.classList.toggle("show",!1),this.props.active=!1})}attributeChangedCallback(e,t,i){if(null!==i&&t!==i)switch(e){case"label":case"placeholder":this.__INPUT__.setAttribute("placeholder",i);break;case"options":if(i){try{this._renderOptions(JSON.parse(i))}catch(e){}this.removeAttribute("options")}break;case"value":this.value=i;break;case"readonly":case"disabled":this[e]=!0}}disconnectedCallback(){unbind(this.__INPUT__,"keydown",this._handleKeydown),unbind(this.__INPUT__,"click",this._activeFn),unbind(document,"mousedown",this._inactiveFn),unbind(this.__OPTG__,"click",this._handleSelect)}}; +import"../scroll/index.js";import"../icon/index.js";import{ebind,bind,unbind,clickOutside}from"../utils.js";function parseOptions(e,t){let i="";for(let s of e)if(s.list){i+=`
      ${s.name}
      `;for(let e of s.list)t.DICT[e.value]=e,e.disabled||t.LIST.push(e),i+=`
      ${e.label}
      `}else s.disabled||t.LIST.push(s),t.DICT[s.value]=s,i+=`
      ${s.label}
      `;return i}export default class Select extends HTMLElement{static get observedAttributes(){return["label","placeholder","multi","value","options","mvidx","disabled"]}constructor(){super(),Object.defineProperty(this,"root",{value:this.attachShadow({mode:"open"}),writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(this,"props",{value:{label:"",placeholder:"",multi:"",value:"",options:"",mvidx:null,disabled:!1},writable:!0,enumerable:!1,configurable:!0}),this.root.innerHTML="
      ",this.__OUTER__=this.root.children[1],this.__PREPEND__=this.__OUTER__.children[0],this.__INPUT__=this.__OUTER__.children[1],this.__APPEND__=this.__OUTER__.children[3],this.__OPTG__=this.__OUTER__.children[4]}get disabled(){return this.props.disabled}set disabled(e){var t=typeof e;e!==this.props.disabled&&("boolean"===t&&e||"boolean"!==t?(this.props.disabled=!0,this.setAttribute("disabled",""),this.__INPUT__.setAttribute("disabled","")):(this.props.disabled=!1,this.removeAttribute("disabled"),this.__INPUT__.removeAttribute("disabled")))}get value(){return this.props.value}set value(e){var{DICT:t,active:i}=this.props;this.props.value=e,this.__INPUT__.value=t&&t[e]&&t[e].label||e,i||this._updateStyle()}_renderOptions(e){this.props.DICT={},this.props.LIST=[];var t=this.__OPTG__.firstElementChild.firstElementChild;t.innerHTML=parseOptions(e,this.props),this.props.ITEMS=Array.from(t.children).filter(e=>"DD"===e.tagName&&!e.hasAttribute("disabled")),this.value=this.props.value}_moveSelect(e){var{LIST:t,DICT:i,ITEMS:s}=this.props;if(t&&t.length){e.preventDefault();var o=38===e.keyCode?-1:1;null===this.props.mvidx?this.props.mvidx=0:this.props.mvidx+=o,this.props.mvidx<0?this.props.mvidx=0:this.props.mvidx>s.length-1&&(this.props.mvidx=s.length-1),s.forEach((e,t)=>{t===this.props.mvidx?(this.__OPTG__.firstElementChild.scrollTop=e.offsetTop-150,e.setAttribute("focus","")):e.removeAttribute("focus")})}}_updateStyle(e){var{LIST:t,ITEMS:i,value:s}=this.props;if(t&&t.length){if(void 0===e)for(let i,o=-1;i=t[++o];)if(s===i.value){e=o;break}this.props.mvidx=e,i.forEach((t,i)=>{i===e?t.setAttribute("focus",""):t.removeAttribute("focus")})}}_fetchSelect(e,t){var i=this.props.LIST[e];this.value=i.value,this.dispatchEvent(new CustomEvent("select",{detail:i})),t&&this._updateStyle(e),this.props.active=!1,this.__OPTG__.classList.remove("show")}connectedCallback(){for(var e=this.__PREPEND__.assignedNodes(),t=this.__APPEND__.assignedNodes();e.length>1;)this.removeChild(e.pop());for(;t.length>1;)this.removeChild(t.pop());function i(){var{x:e,y:t,width:i}=this.getBoundingClientRect(),s=this.getAttribute("size");this.props.active=!0,t+=s&&"mini"===s?32:50,this.__OPTG__.style.cssText=`left:${e}px;top:${t}px;width:${i}px;`}e.length&&"textarea"!==this.props.type&&this.__OUTER__.setAttribute("prepend",""),t.length&&"textarea"!==this.props.type&&this.__OUTER__.setAttribute("append",""),this._handleKeydown=ebind(this.__INPUT__,"keydown",e=>{if(!this.disabled&&!this.readonly)return 38===e.keyCode||40===e.keyCode?this.props.active?this._moveSelect(e):(i.call(this),void this.__OPTG__.classList.toggle("show",!0)):13===e.keyCode&&null!==this.props.mvidx&&this.props.active?this._fetchSelect(this.props.mvidx):void 0}),this._activeFn=bind(this.__INPUT__,"click",e=>{var{options:t}=this.props;i.call(this),this.__OPTG__.classList.toggle("show")}),this._handleSelect=bind(this.__OPTG__,"click",e=>{"DD"!==e.target.tagName||e.target.hasAttribute("disabled")||(this._fetchSelect(+e.target.dataset.idx,!0),this.dispatchEvent(new CustomEvent("input")))}),this._inactiveFn=clickOutside(this,e=>{this.__OPTG__.classList.toggle("show",!1),this.props.active=!1})}attributeChangedCallback(e,t,i){if(null!==i&&t!==i)switch(e){case"label":case"placeholder":this.__INPUT__.setAttribute("placeholder",i);break;case"options":if(i){try{this._renderOptions(JSON.parse(i))}catch(e){}this.removeAttribute("options")}break;case"value":this.value=i;break;case"readonly":case"disabled":this[e]=!0}}disconnectedCallback(){unbind(this.__INPUT__,"keydown",this._handleKeydown),unbind(this.__INPUT__,"click",this._activeFn),unbind(document,"mousedown",this._inactiveFn),unbind(this.__OPTG__,"click",this._handleSelect)}}; if(!customElements.get('wc-select')){ customElements.define('wc-select', Select) diff --git a/src/lib/form/star.js b/src/lib/form/star.js new file mode 100644 index 0000000..86bb989 --- /dev/null +++ b/src/lib/form/star.js @@ -0,0 +1,15 @@ +/** + * + * @authors yutent (yutent@doui.cc) + * @date 2019-11-05 23:34:04 + * @version v2.0.1 + * + */ + +'use strict' + +import{ebind,bind,unbind}from"../utils.js";export default class Star extends HTMLElement{static get observedAttributes(){return["value","text","size","color","allow-half","show-value","starSize","disabled"]}constructor(){super(),Object.defineProperty(this,"root",{value:this.attachShadow({mode:"open"}),writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(this,"props",{value:{value:0,text:[],size:"",color:"","allow-half":!1,"show-value":!1,starSize:32,disabled:!1},writable:!0,enumerable:!1,configurable:!0}),this.root.innerHTML=' ',this.__BOX__=this.root.children[1],this.__STARS__=Array.from(this.__BOX__.children),this.__TEXT__=this.__STARS__.pop()}get value(){return this.props.value}set value(e){var t=+e;(e=t==t&&t>0?t:0)>5&&(e=5),this.props.value=e,this._updateDraw(-1)}_updateDraw(e,t=0){var s="star-half",{value:o,tmp:a={i:0,f:0}}=this.props;-1===e&&(e=Math.floor(o),t=+(o%1).toFixed(1),e>0&&e===o&&(e--,t=1)),this.props["allow-half"]||(t=t>0?1:0),e===a.i&&t===a.f||(t>.5&&(s="star-full"),this.__STARS__.forEach((t,s)=>{t.setAttribute("is",s0&&(this.__STARS__[e].setAttribute("is",s),this.__STARS__[e].setAttribute("color",this.props.color)),this.props.tmp={i:e,f:t},0===e&&0===t?this.__TEXT__.textContent="":5===this.props.text.length?this.__TEXT__.textContent=this.props.text[e]:this.props["show-value"]&&(this.__TEXT__.textContent=e+t))}connectedCallback(){ebind(this.__BOX__,"mousemove",e=>{if(!this.props.disabled&&"WC-ICON"===e.target.tagName){let t=+e.target.dataset.idx;this._updateDraw(t,+(e.offsetX/this.props.starSize).toFixed(1))}}),ebind(this.__BOX__,"click",e=>{var{tmp:t,disabled:s}=this.props;s||"WC-ICON"===e.target.tagName&&(this.props.value=t.i+t.f,this.dispatchEvent(new CustomEvent("input")))}),ebind(this.__BOX__,"mouseleave",e=>{this.props.disabled||this._updateDraw(-1)})}attributeChangedCallback(e,t,s){if(null!==s&&t!==s)switch(e){case"size":this.props.starSize=this.__STARS__[0].clientWidth;break;case"allow-half":case"show-value":case"disabled":this.props[e]=!0;break;case"color":s&&(this.props.color=s);break;case"text":s&&5===(s=s.split("|")).length&&(this.props.text=s.map(e=>e.trim()));break;case"value":this.value=s}}}; + +if(!customElements.get('wc-star')){ + customElements.define('wc-star', Star) +} diff --git a/src/lib/form/switch.js b/src/lib/form/switch.js index 0aa81c7..d28ae0c 100644 --- a/src/lib/form/switch.js +++ b/src/lib/form/switch.js @@ -1,14 +1,14 @@ /** * * @authors yutent (yutent@doui.cc) - * @date 2019-09-07 23:35:03 + * @date 2019-11-05 23:34:04 * @version v2.0.1 * */ 'use strict' -import{bind,unbind}from"../utils.js";export default class Switch extends HTMLElement{static get observedAttributes(){return["checked","disabled"]}constructor(){super(),Object.defineProperty(this,"root",{value:this.attachShadow({mode:"open"}),writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(this,"props",{value:{checked:!1,disabled:!1},writable:!0,enumerable:!1,configurable:!0}),this.root.innerHTML="
      ",this.__SWITCH__=this.root.lastElementChild.firstElementChild}get value(){return this.props.checked}set value(e){this.checked=e}get checked(){return this.props.checked}set checked(e){this.props.checked=!!e,this.__SWITCH__.classList.toggle("checked",this.props.checked)}get disabled(){return this.props.disabled}set disabled(e){var t=typeof e;e!==this.props.disabled&&("boolean"===t&&e||"boolean"!==t?(this.props.disabled=!0,this.setAttribute("disabled","")):(this.props.disabled=!1,this.removeAttribute("disabled")))}connectedCallback(){this._handleClick=bind(this,"click",e=>{this.disabled||(this.checked=!this.checked,this.dispatchEvent(new CustomEvent("input")))})}disconnectedCallback(){unbind(this,"click",this._handleClick)}attributeChangedCallback(e,t,i){if(null!==i&&t!==i)switch(e){case"checked":case"disabled":this[e]=!0}}}; +import{bind,unbind}from"../utils.js";export default class Switch extends HTMLElement{static get observedAttributes(){return["active-text","inactive-text","checked","disabled"]}constructor(){super(),Object.defineProperty(this,"root",{value:this.attachShadow({mode:"open"}),writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(this,"props",{value:{"active-text":null,"inactive-text":null,checked:!1,disabled:!1},writable:!0,enumerable:!1,configurable:!0}),this.root.innerHTML="
      ",this.__SWITCH__=this.root.lastElementChild.firstElementChild}get value(){return this.props.checked}set value(e){this.checked=e}get checked(){return this.props.checked}set checked(e){this.props.checked=!!e,this.__SWITCH__.classList.toggle("checked",this.props.checked)}get disabled(){return this.props.disabled}set disabled(e){var t=typeof e;e!==this.props.disabled&&("boolean"===t&&e||"boolean"!==t?(this.props.disabled=!0,this.setAttribute("disabled","")):(this.props.disabled=!1,this.removeAttribute("disabled")))}connectedCallback(){this._handleClick=bind(this,"click",e=>{this.disabled||(this.checked=!this.checked,this.checked?null!==this.props["active-text"]&&(this.textContent=this.props["active-text"]):null!==this.props["inactive-text"]&&(this.textContent=this.props["inactive-text"]),this.dispatchEvent(new CustomEvent("input")))})}disconnectedCallback(){unbind(this,"click",this._handleClick)}attributeChangedCallback(e,t,i){if(null!==i&&t!==i)switch(e){case"checked":case"disabled":this[e]=!0;break;case"active-text":case"inactive-text":this.props[e]=i+""}}}; if(!customElements.get('wc-switch')){ customElements.define('wc-switch', Switch) diff --git a/src/lib/icon/index.js b/src/lib/icon/index.js index 93ab04b..80ed067 100644 --- a/src/lib/icon/index.js +++ b/src/lib/icon/index.js @@ -1,7 +1,7 @@ /** * * @authors yutent (yutent@doui.cc) - * @date 2019-09-07 23:35:03 + * @date 2019-11-05 23:34:04 * @version v2.0.1 * */ diff --git a/src/lib/layer/index.js b/src/lib/layer/index.js index 4dc8edc..4b15c58 100644 --- a/src/lib/layer/index.js +++ b/src/lib/layer/index.js @@ -1,14 +1,14 @@ /** * * @authors yutent (yutent@doui.cc) - * @date 2019-09-07 23:35:03 + * @date 2019-11-05 23:34:04 * @version v2.0.1 * */ 'use strict' -import"../form/input.js";import Drag from"../drag/core.js";import{nextTick,bind,unbind,clickOutside}from"../utils.js";const LANGUAGES={en:{TITLE:"Dialog",BTNS:["Cancel","OK"]},zh:{TITLE:"提示",BTNS:["取消","确定"]}};LANGUAGES["zh-CN"]=LANGUAGES.zh;const lang=LANGUAGES[window.__ENV_LANG__||navigator.language]||LANGUAGES.en;let uniqueInstance=null,toastInstance=null;const UNIQUE_TYPES=["alert","confirm","prompt"];function renderBtns(t){var e="";return t.forEach((t,s)=>{e+=``}),e}class Layer extends HTMLElement{static get observedAttributes(){return["left","right","top","bottom","from","to","btns","type","title","blur","background","mask","mask-close","mask-color","fixed"]}constructor(){super(),Object.defineProperty(this,"root",{value:this.attachShadow({mode:"open"}),writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(this,"props",{value:{left:"auto",right:"auto",top:"auto",bottom:"auto",from:Object.create(null),to:Object.create(null),btns:[],type:"",title:"",blur:!1,background:null,mask:!1,"mask-close":!1,"mask-color":null,fixed:!0},writable:!0,enumerable:!1,configurable:!0}),this.root.innerHTML='
      ',this.__TITLE__=this.root.children[1].firstElementChild,this.__BODY__=this.root.children[1].children[1],this.__CTRL__=this.root.children[1].lastElementChild,this.promise=new Promise((t,e)=>{this.resolve=t,this.reject=e})}set title(t){this.props.title=t,t?(this.__TITLE__.firstElementChild?this.__TITLE__.insertBefore(document.createTextNode(t),this.__TITLE__.firstElementChild):this.__TITLE__.textContent=t,this.__TITLE__.style.display="flex"):this.__TITLE__.style.display=""}set type(t){var{btns:e}=this.props;if(t&&!this._handleBtnClick){switch(t){case"alert":for(;e.length>1;)e.splice(0,1);break;case"confirm":case"prompt":for(;e.length>2;)e.splice(0,1);break;case"toast":case"notify":case"frame":if("notify"===t){var s=document.createElement("wc-icon");s.setAttribute("is","close"),this.__TITLE__.appendChild(s)}e=[];break;default:t="common"}this.props.type=t,e.length?(this.__CTRL__.innerHTML=renderBtns(e),this.__CTRL__.style.display="flex"):this.__CTRL__.style.display="",this.setAttribute(t,"")}}set fixed(t){this.props.fixed=!!t,this._updateFixedStat()}_updateFixedStat(){UNIQUE_TYPES.includes(this.props.type)||(this.props.fixed?this._dragIns&&(this._dragIns.destroy(),this._dragIns=null):(this._dragIns=new Drag(this.root.children[1]).by(this.__TITLE__,{overflow:!!this.props.hasOwnProperty("overflow")&&this.props.overflow}),this.removeAttribute("fixed")))}_intercept(t){this.props.intercept?this.props.intercept(t,e=>{delete this.props.intercept,this.resolve(t),this.close()}):(this.resolve(t),this.close())}close(t){if(!1===this.wrapped)if(this._dragIns&&this._dragIns.destroy(),UNIQUE_TYPES.includes(this.props.type)&&(uniqueInstance=null),delete this.promise,unbind(this.__CTRL__,"click",this._handleBtnClick),this.props.from&&!t){let t="opacity:0;";for(let e in this.props.from)t+=`${e}:${this.props.from[e]};`;this.root.children[1].style.cssText+=t,this.timer=setTimeout(()=>{this.parentNode.removeChild(this)},200)}else clearTimeout(this.timer),this.parentNode.removeChild(this);else this.removeAttribute("common")}show(){!1!==this.wrapped&&this.setAttribute("common","")}connectedCallback(){this.type=this.props.type,this.title=this.props.title,this._handleBtnClick=bind(this.__CTRL__,"click",t=>{if("BUTTON"===t.target.tagName){var e=+t.target.dataset.idx,{type:s}=this.props;switch(s){case"alert":this.resolve(),this.close();break;case"confirm":case"prompt":if(0===e)this.reject(),this.close();else{let t="prompt"===s?this.__INPUT__.value:null;this._intercept(t)}break;default:this._intercept(e)}}}),"prompt"===this.props.type&&(this.__INPUT__=this.__BODY__.firstElementChild.assignedNodes().pop(),this._handleSubmit=bind(this.__INPUT__,"submit",t=>{this._intercept(t.detail)})),this.props.mask&&this.setAttribute("mask",""),this._updateFixedStat(),this.props.mask&&(this._handlMask=clickOutside(this.root.children[1],t=>{this.props["mask-close"]?(!1===this.wrapped&&this.reject(null),this.close()):UNIQUE_TYPES.includes(this.props.type)&&(this.root.children[1].classList.toggle("scale",!0),setTimeout(t=>{this.root.children[1].classList.remove("scale")},100))}),this.props["mask-color"]&&(this.style.backgroundColor=this.props["mask-color"])),this.props.blur&&this.root.children[1].classList.toggle("blur",!0);let t=this.props.from?"":"opacity:1;";if(this.props.background&&(t+=`background: ${this.props.background};`),(this.props.radius||0===this.props.radius)&&(t+=`border-radius: ${this.props.radius};`),this.props.size)for(let e in this.props.size)t+=`${e}:${this.props.size[e]};`;if(this.props.from){for(let e in this.props.from)t+=`${e}:${this.props.from[e]};`;setTimeout(t=>{let e="opacity:1;";for(let t in this.props.to)e+=`${t}:${this.props.to[t]};`;this.root.children[1].style.cssText+=e},50)}t&&(this.root.children[1].style.cssText+=t),"toast"===this.props.type&&(this.timer=setTimeout(()=>{toastInstance=null,this.close()},3e3)),"notify"===this.props.type&&(this._handleClose=bind(this.__TITLE__,"click",t=>{"WC-ICON"===t.target.tagName&&this.close()}))}disconnectedCallback(){unbind(document,"mousedown",this._handlMask),unbind(this.__TITLE__,"click",this._handleClose)}attributeChangedCallback(t,e,s){if(null!==s&&e!==s)switch(t){case"title":case"type":this[t]=s;break;case"mask-color":case"background":this.props[t]=s;break;case"mask":case"mask-close":case"blur":this.props[t]=!0;break;case"left":case"right":case"top":case"bottom":null!==s&&(this.props.from[t]=s,this.props.to=this.props.from,this.removeAttribute(t));break;case"fixed":this.fixed=!0}}}function _layer(t){var e=document.createElement("wc-layer");if("toast"===t.type){var{type:s,content:o}=t;t={type:s,content:o,from:{top:0},to:{top:"30px"}},toastInstance&&toastInstance.close(!0),toastInstance=e}else e.props.mask=t.mask,!1===t.btns?e.props.btns=[]:t.btns&&t.btns.length?e.props.btns=t.btns:e.props.btns=lang.BTNS.concat(),t.intercept&&"function"==typeof t.intercept&&(e.props.intercept=t.intercept),e.props.mask=t.mask,e.props["mask-close"]=t["mask-close"],t.hasOwnProperty("overflow")&&(e.props.overflow=t.overflow),e.props["mask-color"]=t["mask-color"],e.props.blur=t.blur,e.props.radius=t.radius,e.props.background=t.background,t.size&&"object"==typeof t.size&&(e.props.size=t.size),UNIQUE_TYPES.includes(t.type)&&(uniqueInstance&&uniqueInstance.close(!0),uniqueInstance=e);return t.to&&"object"==typeof t.to&&(e.props.to=t.to,t.from&&"object"==typeof t.from?e.props.from=t.from:e.props.from=t.to),e.props.type=t.type,e.props.fixed=t.fixed,e.props.title=t.title,e.innerHTML=t.content,e.wrapped=!1,document.body.appendChild(e),e.promise}Object.assign(_layer,{alert(t,e=lang.TITLE){return this({type:"alert",title:e,content:t,mask:!0})},confirm(t,e=lang.TITLE,s){return"function"==typeof e&&(s=e,e=lang.TITLE),this({type:"confirm",title:e,content:t,mask:!0,intercept:s})},prompt(t=lang.TITLE,e){return this({type:"prompt",title:t,content:'',mask:!0,intercept:e})},frame(t,e={}){return this({...e,type:"frame",content:``,mask:!0,"mask-close":!0})},notify(t){return this({type:"notify",title:"通知",content:t,blur:!0,from:{right:"-300px",top:0},to:{right:0}})},toast(t,e="info"){switch(e){case"info":case"warn":case"error":break;default:e="info"}return this({content:`\n
      \n \n ${t}\n
      `,type:"toast"})}}),window.layer=_layer;export default _layer; +import"../form/input.js";import Drag from"../drag/core.js";import{nextTick,bind,unbind,clickOutside}from"../utils.js";const LANGUAGES={en:{TITLE:"Dialog",BTNS:["Cancel","OK"]},zh:{TITLE:"提示",BTNS:["取消","确定"]}};LANGUAGES["zh-CN"]=LANGUAGES.zh;const lang=LANGUAGES[window.__ENV_LANG__||navigator.language]||LANGUAGES.en;let uniqueInstance=null,toastInstance=null;const UNIQUE_TYPES=["alert","confirm","prompt"];function renderBtns(t){var e="";return t.forEach((t,s)=>{e+=``}),e}class Layer extends HTMLElement{static get observedAttributes(){return["left","right","top","bottom","from","to","btns","type","title","blur","background","mask","mask-close","mask-color","fixed"]}constructor(){super(),Object.defineProperty(this,"root",{value:this.attachShadow({mode:"open"}),writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(this,"props",{value:{left:"auto",right:"auto",top:"auto",bottom:"auto",from:Object.create(null),to:Object.create(null),btns:[],type:"",title:"",blur:!1,background:null,mask:!1,"mask-close":!1,"mask-color":null,fixed:!0},writable:!0,enumerable:!1,configurable:!0}),this.root.innerHTML='
      ',this.__TITLE__=this.root.children[1].firstElementChild,this.__BODY__=this.root.children[1].children[1],this.__CTRL__=this.root.children[1].lastElementChild,this.promise=new Promise((t,e)=>{this.resolve=t,this.reject=e})}set title(t){this.props.title=t,t?(this.__TITLE__.firstElementChild?this.__TITLE__.insertBefore(document.createTextNode(t),this.__TITLE__.firstElementChild):this.__TITLE__.textContent=t,this.__TITLE__.style.display="flex"):this.__TITLE__.style.display=""}set type(t){var{btns:e}=this.props;if(t&&!this._handleBtnClick){switch(t){case"alert":for(;e.length>1;)e.splice(0,1);break;case"confirm":case"prompt":for(;e.length>2;)e.splice(0,1);break;case"toast":case"notify":case"frame":if("notify"===t){var s=document.createElement("wc-icon");s.setAttribute("is","close"),this.__TITLE__.appendChild(s)}e=[];break;default:t="common"}this.props.type=t,e.length?(this.__CTRL__.innerHTML=renderBtns(e),this.__CTRL__.style.display="flex"):this.__CTRL__.style.display="",this.setAttribute(t,"")}}set fixed(t){this.props.fixed=!!t,this._updateFixedStat()}_updateFixedStat(){UNIQUE_TYPES.includes(this.props.type)||(this.props.fixed?this._dragIns&&(this._dragIns.destroy(),this._dragIns=null):(this._dragIns=new Drag(this.root.children[1]).by(this.__TITLE__,{overflow:!!this.props.hasOwnProperty("overflow")&&this.props.overflow}),this.removeAttribute("fixed")))}_intercept(t){this.props.intercept?this.props.intercept(t,e=>{delete this.props.intercept,this.resolve(t),this.close()}):(this.resolve(t),this.close())}close(t){if(!1===this.wrapped)if(this._dragIns&&this._dragIns.destroy(),UNIQUE_TYPES.includes(this.props.type)&&(uniqueInstance=null),delete this.promise,unbind(this.__CTRL__,"click",this._handleBtnClick),this.props.from&&!t){let t="opacity:0;";for(let e in this.props.from)t+=`${e}:${this.props.from[e]};`;this.root.children[1].style.cssText+=t,this.timer=setTimeout(()=>{this.parentNode.removeChild(this)},200)}else clearTimeout(this.timer),this.parentNode.removeChild(this);else this.removeAttribute("common")}show(){!1!==this.wrapped&&this.setAttribute("common","")}connectedCallback(){this.type=this.props.type,this.title=this.props.title,this._handleBtnClick=bind(this.__CTRL__,"click",t=>{if("BUTTON"===t.target.tagName){var e=+t.target.dataset.idx,{type:s}=this.props;switch(s){case"alert":this.resolve(),this.close();break;case"confirm":case"prompt":if(0===e)this.reject(),this.close();else{let t="prompt"===s?this.__INPUT__.value:null;this._intercept(t)}break;default:this._intercept(e)}}}),"prompt"===this.props.type&&(this.__INPUT__=this.__BODY__.firstElementChild.assignedNodes().pop(),this._handleSubmit=bind(this.__INPUT__,"submit",t=>{this._intercept(t.detail)})),this.props.mask&&this.setAttribute("mask",""),this._updateFixedStat(),this.props.mask&&(this._handlMask=clickOutside(this.root.children[1],t=>{t.target===this&&(this.props["mask-close"]?(!1===this.wrapped&&this.reject(null),this.close()):UNIQUE_TYPES.includes(this.props.type)&&(this.root.children[1].classList.toggle("scale",!0),setTimeout(t=>{this.root.children[1].classList.remove("scale")},100)))}),this.props["mask-color"]&&(this.style.backgroundColor=this.props["mask-color"])),this.props.blur&&this.root.children[1].classList.toggle("blur",!0);let t=this.props.from?"":"opacity:1;";if(this.props.background&&(t+=`background: ${this.props.background};`),(this.props.radius||0===this.props.radius)&&(t+=`border-radius: ${this.props.radius};`),this.props.size)for(let e in this.props.size)t+=`${e}:${this.props.size[e]};`;if(this.props.from){for(let e in this.props.from)t+=`${e}:${this.props.from[e]};`;setTimeout(t=>{let e="opacity:1;";for(let t in this.props.to)e+=`${t}:${this.props.to[t]};`;this.root.children[1].style.cssText+=e},50)}t&&(this.root.children[1].style.cssText+=t),"toast"===this.props.type&&(this.timer=setTimeout(()=>{toastInstance=null,this.close()},3e3)),"notify"===this.props.type&&(this._handleClose=bind(this.__TITLE__,"click",t=>{"WC-ICON"===t.target.tagName&&this.close()}))}disconnectedCallback(){unbind(document,"mousedown",this._handlMask),unbind(this.__TITLE__,"click",this._handleClose)}attributeChangedCallback(t,e,s){if(null!==s&&e!==s)switch(t){case"title":case"type":this[t]=s;break;case"mask-color":case"background":this.props[t]=s;break;case"mask":case"mask-close":case"blur":this.props[t]=!0;break;case"left":case"right":case"top":case"bottom":null!==s&&(this.props.from[t]=s,this.props.to=this.props.from,this.removeAttribute(t));break;case"fixed":this.fixed=!0}}}function _layer(t){var e=document.createElement("wc-layer");if(t.type||(t.type="common"),"toast"===t.type){var{type:s,content:o}=t;t={type:s,content:o,from:{top:0},to:{top:"30px"}},toastInstance&&toastInstance.close(!0),toastInstance=e}else e.props.mask=t.mask,!1===t.btns?e.props.btns=[]:t.btns&&t.btns.length?e.props.btns=t.btns:e.props.btns=lang.BTNS.concat(),t.intercept&&"function"==typeof t.intercept&&(e.props.intercept=t.intercept),e.props.mask=t.mask,e.props["mask-close"]=t["mask-close"],t.hasOwnProperty("overflow")&&(e.props.overflow=t.overflow),e.props["mask-color"]=t["mask-color"],e.props.blur=t.blur,e.props.radius=t.radius,e.props.background=t.background,t.size&&"object"==typeof t.size&&(e.props.size=t.size),UNIQUE_TYPES.includes(t.type)&&(uniqueInstance&&uniqueInstance.close(!0),uniqueInstance=e);return t.to&&"object"==typeof t.to&&(e.props.to=t.to,t.from&&"object"==typeof t.from?e.props.from=t.from:e.props.from=t.to),e.props.type=t.type,e.props.title=t.title,t.hasOwnProperty("fixed")&&(e.props.fixed=t.fixed),e.innerHTML=t.content,e.wrapped=!1,document.body.appendChild(e),e.promise}Object.assign(_layer,{alert(t,e=lang.TITLE){return this({type:"alert",title:e,content:t,mask:!0})},confirm(t,e=lang.TITLE,s){return"function"==typeof e&&(s=e,e=lang.TITLE),this({type:"confirm",title:e,content:t,mask:!0,intercept:s})},prompt(t=lang.TITLE,e){return this({type:"prompt",title:t,content:'',mask:!0,intercept:e})},frame(t,e={}){return this({...e,type:"frame",content:``,mask:!0,"mask-close":!0})},notify(t){return this({type:"notify",title:"通知",content:t,blur:!0,from:{right:"-300px",top:0},to:{right:0}})},toast(t,e="info"){switch(e){case"info":case"warn":case"error":break;default:e="info"}return this({content:`\n
      \n \n ${t}\n
      `,type:"toast"})}}),window.layer=_layer;export default _layer; if(!customElements.get('wc-layer')){ customElements.define('wc-layer', Layer) diff --git a/src/lib/pager/index.js b/src/lib/pager/index.js index f178af6..335902a 100644 --- a/src/lib/pager/index.js +++ b/src/lib/pager/index.js @@ -1,14 +1,14 @@ /** * * @authors yutent (yutent@doui.cc) - * @date 2019-09-01 23:16:06 + * @date 2019-11-05 23:34:04 * @version v2.0.1 * */ 'use strict' -function calculate(t,e,r){var o,a=[],s=0,i=t<3?6-t:2;if(e<2||r)return a.push({to:t,txt:t}),a;t-i>1&&e>5&&(o=(o=t-2*i)<1?1:o,a.push({to:o,txt:"..."}));e-t0&&a.push({to:n,txt:n});t+ie?e:o,a.push({to:o,txt:"..."}));return a}export default class Pager extends HTMLElement{static get observedAttributes(){return["layout","total","curr","pagesize","simple"]}constructor(){super(),Object.defineProperty(this,"root",{value:this.attachShadow({mode:"open"}),writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(this,"props",{value:{layout:"home, prev, next, end",total:0,curr:1,pagesize:20,simple:!1},writable:!0,enumerable:!1,configurable:!0}),this.root.innerHTML='
      ',this.__LAYOUT__=this.root.children[1],this.__HOME__=this.__LAYOUT__.children[0],this.__PREV__=this.__LAYOUT__.children[1],this.__PAGE__=this.__LAYOUT__.children[2],this.__NEXT__=this.__LAYOUT__.children[3],this.__END__=this.__LAYOUT__.children[4]}update(){var{curr:t,totalpage:e,simple:r}=this.props,o=calculate(t,e,r);this.__PAGE__.innerHTML=o.map(e=>``).join("")}connectedCallback(){var{pagesize:t,total:e}=this.props;this.props.totalpage=Math.ceil(e/t),this.update(),this.__LAYOUT__.addEventListener("click",t=>{if("BUTTON"===t.target.tagName){var{curr:e,totalpage:r}=this.props,o=t.target.dataset.page,a=+o;if(a==a){if(a===e)return}else switch(o){case"prev":if((a=e-1)<1)return;break;case"next":if((a=e+1)>r)return;break;case"end":if(r===e)return;a=r}this.props.curr=a,this.update(),this.dispatchEvent(new CustomEvent("pick",{detail:a}))}},!1)}attributeChangedCallback(t,e,r){if(e!==r)switch(t){case"total":case"pagesize":case"curr":this.props[t]=+r||this.props[t];var{pagesize:o,total:a}=this.props;this.props.totalpage=Math.ceil(a/o),this.update();break;case"simple":this.props.simple=!0}}}; +function calculate(t,e,r){var o,a=[],s=0,i=t<3?6-t:2;if(e<2||r)return a.push({to:t,txt:t}),a;t-i>1&&e>5&&(o=(o=t-2*i)<1?1:o,a.push({to:o,txt:"..."}));e-t0&&a.push({to:n,txt:n});t+ie?e:o,a.push({to:o,txt:"..."}));return a}export default class Pager extends HTMLElement{static get observedAttributes(){return["layout","total","curr","pagesize","simple"]}constructor(){super(),Object.defineProperty(this,"root",{value:this.attachShadow({mode:"open"}),writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(this,"props",{value:{layout:"home, prev, next, end",total:0,curr:1,pagesize:20,simple:!1},writable:!0,enumerable:!1,configurable:!0}),this.root.innerHTML='
      ',this.__LAYOUT__=this.root.children[1],this.__HOME__=this.__LAYOUT__.children[0],this.__PREV__=this.__LAYOUT__.children[1],this.__PAGE__=this.__LAYOUT__.children[2],this.__NEXT__=this.__LAYOUT__.children[3],this.__END__=this.__LAYOUT__.children[4]}update(){var{curr:t,totalpage:e,simple:r}=this.props,o=calculate(t,e,r);this.__PAGE__.innerHTML=o.map(e=>``).join("")}connectedCallback(){var{pagesize:t,total:e}=this.props;this.props.totalpage=Math.ceil(e/t),this.update(),this.__LAYOUT__.addEventListener("click",t=>{if("BUTTON"===t.target.tagName){var{curr:e,totalpage:r}=this.props,o=t.target.dataset.page,a=+o;if(a==a){if(a===e)return}else switch(o){case"prev":if((a=e-1)<1)return;break;case"next":if((a=e+1)>r)return;break;case"end":if(r===e)return;a=r}this.props.curr=a,this.update(),this.dispatchEvent(new CustomEvent("pick",{detail:a}))}},!1)}attributeChangedCallback(t,e,r){if(null!==r&&e!==r)switch(t){case"total":case"pagesize":case"curr":this.props[t]=+r||this.props[t];var{pagesize:o,total:a}=this.props;this.props.totalpage=Math.ceil(a/o),this.update();break;case"simple":this.props.simple=!0}}}; if(!customElements.get('wc-pager')){ customElements.define('wc-pager', Pager) diff --git a/src/lib/request/index.js b/src/lib/request/index.js index a97aa5d..9cd1ce5 100644 --- a/src/lib/request/index.js +++ b/src/lib/request/index.js @@ -1,447 +1 @@ -/** - * - * @authors yutent (yutent@doui.cc) - * @date 2018-03-25 23:59:13 - * @version $Id$ - */ - -'use strict' -import Format from "./lib/format.js" - -// 本地协议/头 判断正则 -const rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/ -const log = console.log - -const noop = function(e, res) { - this.defer.resolve(res) -} - -let isLocal = false -try { - isLocal = rlocalProtocol.test(location.protocol) -} catch (e) {} - -let originAnchor = document.createElement('a') -originAnchor.href = location.href - -const NOBODY_METHODS = ['GET', 'HEAD'] -const ERRORS = { - 10001: 'Argument url is required', - 10012: 'Parse error', - 10100: 'Request canceled', - 10104: 'Request pending...', - 10200: 'Ok', - 10204: 'No content', - 10304: 'Not modified', - 10500: 'Internal Server Error', - 10504: 'Connected timeout' -} - -const FORM_TYPES = { - form: 'application/x-www-form-urlencoded; charset=UTF-8', - json: 'application/json; charset=UTF-8', - text: 'text/plain; charset=UTF-8' -} - -const convert = { - text(val) { - return val - }, - xml(val, xml) { - return xml !== undefined ? xml : Format.parseXML(val) - }, - html(val) { - return Format.parseHTML(val) - }, - json(val) { - return JSON.parse(val) - }, - script(val) { - return Format.parseJS(val) - } -} - -class _Request { - constructor(url = '', method = 'GET', param = {}) { - if (!url) { - throw new Error(ERRORS[10001]) - } - - // url规范化 - url = url.replace(/#.*$/, '') - - if (request.BASE_URL) { - if (!/^([a-z]+:|\/\/)/.test(url)) { - url = request.BASE_URL + url - } - } - - method = method.toUpperCase() - - this.xhr = new XMLHttpRequest() - this.defer = Promise.defer() - this.opt = { - url, - method, - headers: {}, - data: {}, - dataType: 'text', - withCredentials: false // 跨域选项,是否验证凭证 - } - - // 取消网络请求 - this.defer.promise.abort = () => { - this.cancel = true - this.xhr.abort() - } - this.__next__(Object.assign({}, request.__INIT__, param)) - return this.defer.promise - } - - __next__(param) { - /* -------------------------------------------------------------- */ - /* ------------------------ 1»» 配置头信息 ---------------------- */ - /* -------------------------------------------------------------- */ - if (param.headers) { - Object.assign(this.opt.headers, param.headers) - } - - /* -------------------------------------------------------------- */ - /* --------- 2»» 设置表单类型, 其中 form-data不能手动设置 ---------- */ - /* -------------------------------------------------------------- */ - let hasAttach = false - if (param.formType) { - switch (param.formType) { - case 'form': - this.__set__('form') - break - case 'json': - this.__set__('json') - break - case 'form-data': - this.opt.method = 'POST' - hasAttach = true - break - default: - if (NOBODY_METHODS.includes(this.opt.method)) { - this.__set__('form') - } else { - this.__set__('text') - } - } - } else { - this.__set__('form') - } - - /* -------------------------------------------------------------- */ - /* ------------------- 3»» 设置缓存 ---------------------------- */ - /* -------------------------------------------------------------- */ - if (param.cache) { - if (NOBODY_METHODS.includes(this.opt.method)) { - this.opt.cache = true - } - } - - /* -------------------------------------------------------------- */ - /* ------------------- 4»» 设置超时时间(毫秒) --------------------- */ - /* -------------------------------------------------------------- */ - param.timeout = param.timeout >>> 0 - if (param.timeout > 0) { - this.opt.timeout = param.timeout - } - - /* -------------------------------------------------------------- */ - /* -------------------------- 5»» 请求的内容 --------------------- */ - /* -------------------------------------------------------------- */ - if (param.data) { - let type = typeof param.data - - switch (type) { - case 'number': - case 'string': - this.__set__('text') - this.opt.data = param.data - break - case 'object': - // 解析表单DOM - if (param.data.nodeName === 'FORM') { - this.opt.method = param.data.method.toUpperCase() || 'POST' - - this.opt.data = Format.parseForm(param.data) - hasAttach = this.opt.data.constructor === FormData - - if (hasAttach) { - delete this.opt.headers['content-type'] - } - // 如果是一个 FormData对象 - // 则直接改为POST - } else if (param.data.constructor === FormData) { - hasAttach = true - this.opt.method = 'POST' - delete this.opt.headers['content-type'] - this.opt.data = param.data - } else { - // 有附件,则改为FormData - if (hasAttach) { - this.opt.data = Format.mkFormData(param.data) - } else { - this.opt.data = param.data - } - } - } - } - - /* -------------------------------------------------------------- */ - /* -------------------------- 6»» 处理跨域 --------------------- */ - /* -------------------------------------------------------------- */ - if (param.withCredentials) { - this.opt.withCredentials = true - } - try { - let anchor = document.createElement('a') - anchor.href = this.opt.url - - this.opt.crossDomain = - originAnchor.protocol !== anchor.protocol || - originAnchor.host !== anchor.host - } catch (err) {} - - // 6.1»» 进一步处理跨域 - // 非跨域或跨域但支持Cors时自动加上一条header信息,用以标识这是ajax请求 - // 如果是跨域,开启Cors会需要服务端额外返回一些headers - - if (this.opt.crossDomain) { - if (this.opt.withCredentials) { - this.xhr.withCredentials = true - this.opt.headers['X-Requested-With'] = 'XMLHttpRequest' - } - } else { - this.opt.headers['X-Requested-With'] = 'XMLHttpRequest' - } - - /* -------------------------------------------------------------- */ - /* ------------- 7»» 根据method类型, 处理g表单数据 ---------------- */ - /* -------------------------------------------------------------- */ - // 是否允许发送body - let allowBody = !NOBODY_METHODS.includes(this.opt.method) - if (allowBody) { - if (!hasAttach) { - if (param.formType === 'json') { - this.opt.data = JSON.stringify(this.opt.data) - } else { - this.opt.data = Format.param(this.opt.data) - } - } - } else { - // 否则拼接到url上 - this.opt.data = Format.param(this.opt.data) - - if (this.opt.data) { - this.opt.url += (/\?/.test(this.opt.url) ? '&' : '?') + this.opt.data - } - - if (this.opt.cache === false) { - this.opt.url += - (/\?/.test(this.opt.url) ? '&' : '?') + '_=' + Math.random() - } - } - - /* -------------------------------------------------------------- */ - /* ------------- 8»» 设置响应的数据类型 ---------------- */ - /* -------------------------------------------------------------- */ - // arraybuffer | blob | document | json | text - if (param.dataType) { - this.opt.dataType = param.dataType.toLowerCase() - } - this.xhr.responseType = this.opt.dataType - - /* -------------------------------------------------------------- */ - /* ------------- 9»» 构造请求 ---------------- */ - /* -------------------------------------------------------------- */ - - // response ready - this.xhr.onreadystatechange = ev => { - if (this.opt.timeout > 0) { - this.opt['time' + this.xhr.readyState] = ev.timeStamp - if (this.xhr.readyState === 4) { - this.opt.isTimeout = - this.opt.time4 - this.opt.time1 > this.opt.timeout - } - } - - if (this.xhr.readyState !== 4) { - return - } - - this.__dispatch__(this.opt.isTimeout) - } - - // 9.1»» 初始化xhr - this.xhr.open(this.opt.method, this.opt.url, true) - - // 9.2»» 设置头信息 - for (let i in this.opt.headers) { - this.xhr.setRequestHeader(i, this.opt.headers[i]) - } - - // 9.3»» 发起网络请求 - this.xhr.send(this.opt.data) - - // 9.4»» 超时处理 - if (this.opt.timeout && this.opt.timeout > 0) { - this.xhr.timeout = this.opt.timeout - } - } - - __set__(type) { - this.opt.headers['content-type'] = FORM_TYPES[type] - } - - __dispatch__(isTimeout) { - let result = { - status: 200, - statusText: 'ok', - text: '', - body: '', - error: null - } - - // 主动取消 - if (this.cancel) { - return this.__cancel__(result) - } - - // 超时 - if (isTimeout) { - return this.__timeout__(result) - } - - // 是否请求成功(resful规范) - let isSucc = this.xhr.status >= 200 && this.xhr.status < 400 - - let headers = this.xhr.getAllResponseHeaders().split('\n') || [] - let contentType = '' - - //处理返回的 Header, 拿到content-type - for (let it of headers) { - it = it.trim() - if (it) { - it = it.split(':') - let tmp = it.shift().toLowerCase() - if (tmp === 'content-type') { - contentType = it - .join(':') - .trim() - .toLowerCase() - break - } - } - } - - if (isSucc) { - result.status = this.xhr.status - if (result.status === 204) { - result.statusText = ERRORS[10204] - } else if (result.status === 304) { - result.statusText = ERRORS[10304] - } - } else { - result.status = this.xhr.status || 500 - result.statusText = this.xhr.statusText || ERRORS[10500] - result.error = new Error(result.statusText) - } - // log(this.opt.dataType, this.xhr) - switch (this.opt.dataType) { - case 'arraybuffer': - case 'blob': - case 'document': - case 'json': - result.text = result.body = this.xhr.response - break - // text - default: - try { - //处理返回的数据 - let dataType = contentType.match(/json|xml|script|html/) - - dataType = (dataType && dataType[0].toLowerCase()) || 'text' - - result.text = this.xhr.response - result.body = convert[dataType](result.text, this.xhr.response) - } catch (err) { - result.error = err - result.statusText = ERRORS[10012] - } - break - } - this.__success__(isSucc, result) - } - - __success__(isSucc, result) { - if (isSucc) { - this.defer.resolve(result) - } else { - this.defer.reject(result) - } - delete this.xhr - delete this.opt - delete this.defer - } - - __cancel__(result) { - result.status = 0 - result.statusText = ERRORS[10100] - result.error = new Error(ERRORS[10100]) - - this.defer.reject(result) - - delete this.xhr - delete this.opt - delete this.defer - } - - __timeout__(result) { - result.status = 504 - result.statusText = ERRORS[10504] - result.error = new Error(ERRORS[10504]) - - this.defer.reject(result) - - delete this.xhr - delete this.opt - delete this.defer - } -} - -if (!window.request) { - window.request = { - get(url, param = {}) { - return new _Request(url, 'GET', param) - }, - post(url, param = {}) { - return new _Request(url, 'POST', param) - }, - upload(url, param = {}) { - param.formType = 'form-data' - return this.post(url, param) - }, - download(url, param = {}) { - param.dataType = 'blob' - return this.get(url, param) - }, - open(url, method = 'GET', param = {}) { - if (typeof method === 'object') { - param = method - method = 'GET' - } - return new _Request(url, method, param) - }, - version: '2.0.0-normal', - init(param = {}) { - this.__INIT__ = param - } - } - Anot.ui.request = request.version -} - -export default request +"use strict";import Format from"./lib/format.js";const rlocalProtocol=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,log=console.log,noop=function(t,e){this.defer.resolve(e)};let isLocal=!1;try{isLocal=rlocalProtocol.test(location.protocol)}catch(t){}let originAnchor=document.createElement("a");originAnchor.href=location.href;const NOBODY_METHODS=["GET","HEAD"],ERRORS={10001:"Argument url is required",10012:"Parse error",10100:"Request canceled",10104:"Request pending...",10200:"Ok",10204:"No content",10304:"Not modified",10500:"Internal Server Error",10504:"Connected timeout"},FORM_TYPES={form:"application/x-www-form-urlencoded; charset=UTF-8",json:"application/json; charset=UTF-8",text:"text/plain; charset=UTF-8"},convert={text:t=>t,xml:(t,e)=>void 0!==e?e:Format.parseXML(t),html:t=>Format.parseHTML(t),json:t=>JSON.parse(t),script:t=>Format.parseJS(t)};class _Request{constructor(t="",e="GET",s={}){if(!t)throw new Error(ERRORS[10001]);return t=t.replace(/#.*$/,""),request.BASE_URL&&(/^([a-z]+:|\/\/)/.test(t)||(t=request.BASE_URL+t)),e=e.toUpperCase(),this.xhr=new XMLHttpRequest,this.defer=Promise.defer(),this.opt={url:t,method:e,headers:{},data:{},dataType:"text",withCredentials:!1},this.defer.promise.abort=(()=>{this.cancel=!0,this.xhr.abort()}),this.__next__(Object.assign({},request.__INIT__,s)),this.defer.promise}__next__(t){t.headers&&Object.assign(this.opt.headers,t.headers);let e=!1;if(t.formType)switch(t.formType){case"form":this.__set__("form");break;case"json":this.__set__("json");break;case"form-data":this.opt.method="POST",e=!0;break;default:NOBODY_METHODS.includes(this.opt.method)?this.__set__("form"):this.__set__("text")}else this.__set__("form");if(t.cache&&NOBODY_METHODS.includes(this.opt.method)&&(this.opt.cache=!0),t.timeout=t.timeout>>>0,t.timeout>0&&(this.opt.timeout=t.timeout),t.data){switch(typeof t.data){case"number":case"string":this.__set__("text"),this.opt.data=t.data;break;case"object":"FORM"===t.data.nodeName?(this.opt.method=t.data.method.toUpperCase()||"POST",this.opt.data=Format.parseForm(t.data),(e=this.opt.data.constructor===FormData)&&delete this.opt.headers["content-type"]):t.data.constructor===FormData?(e=!0,this.opt.method="POST",delete this.opt.headers["content-type"],this.opt.data=t.data):this.opt.data=e?Format.mkFormData(t.data):t.data}}t.withCredentials&&(this.opt.withCredentials=!0);try{let t=document.createElement("a");t.href=this.opt.url,this.opt.crossDomain=originAnchor.protocol!==t.protocol||originAnchor.host!==t.host}catch(t){}this.opt.crossDomain?this.opt.withCredentials&&(this.xhr.withCredentials=!0,this.opt.headers["X-Requested-With"]="XMLHttpRequest"):this.opt.headers["X-Requested-With"]="XMLHttpRequest",!NOBODY_METHODS.includes(this.opt.method)?e||("json"===t.formType?this.opt.data=JSON.stringify(this.opt.data):this.opt.data=Format.param(this.opt.data)):(this.opt.data=Format.param(this.opt.data),this.opt.data&&(this.opt.url+=(/\?/.test(this.opt.url)?"&":"?")+this.opt.data),!1===this.opt.cache&&(this.opt.url+=(/\?/.test(this.opt.url)?"&":"?")+"_="+Math.random())),t.dataType&&(this.opt.dataType=t.dataType.toLowerCase()),this.xhr.responseType=this.opt.dataType,this.xhr.onreadystatechange=(t=>{this.opt.timeout>0&&(this.opt["time"+this.xhr.readyState]=t.timeStamp,4===this.xhr.readyState&&(this.opt.isTimeout=this.opt.time4-this.opt.time1>this.opt.timeout)),4===this.xhr.readyState&&this.__dispatch__(this.opt.isTimeout)}),this.xhr.open(this.opt.method,this.opt.url,!0);for(let t in this.opt.headers)this.xhr.setRequestHeader(t,this.opt.headers[t]);this.xhr.send(this.opt.data),this.opt.timeout&&this.opt.timeout>0&&(this.xhr.timeout=this.opt.timeout)}__set__(t){this.opt.headers["content-type"]=FORM_TYPES[t]}__dispatch__(t){let e={status:200,statusText:"ok",text:"",body:"",error:null};if(this.cancel)return this.__cancel__(e);if(t)return this.__timeout__(e);let s=this.xhr.status>=200&&this.xhr.status<400,o=this.xhr.getAllResponseHeaders().split("\n")||[],r="";for(let t of o)if(t=t.trim()){if("content-type"===(t=t.split(":")).shift().toLowerCase()){r=t.join(":").trim().toLowerCase();break}}switch(s?(e.status=this.xhr.status,204===e.status?e.statusText=ERRORS[10204]:304===e.status&&(e.statusText=ERRORS[10304])):(e.status=this.xhr.status||500,e.statusText=this.xhr.statusText||ERRORS[10500],e.error=new Error(e.statusText)),this.opt.dataType){case"arraybuffer":case"blob":case"document":case"json":e.text=e.body=this.xhr.response;break;default:try{let t=r.match(/json|xml|script|html/);t=t&&t[0].toLowerCase()||"text",e.text=this.xhr.response,e.body=convert[t](e.text,this.xhr.response)}catch(t){e.error=t,e.statusText=ERRORS[10012]}}this.__success__(s,e)}__success__(t,e){t?this.defer.resolve(e):this.defer.reject(e),delete this.xhr,delete this.opt,delete this.defer}__cancel__(t){t.status=0,t.statusText=ERRORS[10100],t.error=new Error(ERRORS[10100]),this.defer.reject(t),delete this.xhr,delete this.opt,delete this.defer}__timeout__(t){t.status=504,t.statusText=ERRORS[10504],t.error=new Error(ERRORS[10504]),this.defer.reject(t),delete this.xhr,delete this.opt,delete this.defer}}window.request||(window.request={get:(t,e={})=>new _Request(t,"GET",e),post:(t,e={})=>new _Request(t,"POST",e),upload(t,e={}){return e.formType="form-data",this.post(t,e)},download(t,e={}){return e.dataType="blob",this.get(t,e)},open:(t,e="GET",s={})=>("object"==typeof e&&(s=e,e="GET"),new _Request(t,e,s)),version:"2.0.0-normal",init(t={}){this.__INIT__=t}},Anot.ui.request=request.version);export default request; \ No newline at end of file diff --git a/src/lib/request/lib/format.js b/src/lib/request/lib/format.js index ce5d8a7..4f48fb0 100644 --- a/src/lib/request/lib/format.js +++ b/src/lib/request/lib/format.js @@ -1,225 +1 @@ -/** - * - * @authors yutent (yutent@doui.cc) - * @date 2016-11-26 16:35:45 - * - */ - -'use strict' - -function serialize(p, obj, q) { - let k - if (Array.isArray(obj)) { - obj.forEach(function(it, i) { - k = p ? `${p}[${Array.isArray(it) ? i : ''}]` : i - // k = p ? p + '[' + (Array.isArray(it) ? i : '') + ']' : i - if (typeof it === 'object') { - serialize(k, it, q) - } else { - q(k, it) - } - }) - } else { - for (let i in obj) { - k = p ? `${p}[${i}]` : i - // k = p ? p + '[' + i + ']' : i - if (typeof obj[i] === 'object') { - serialize(k, obj[i], q) - } else { - q(k, obj[i]) - } - } - } -} - -const toS = Object.prototype.toString -const doc = window.document -const encode = encodeURIComponent -const decode = decodeURIComponent - -const TagHooks = function() { - this.option = doc.createElement('select') - this.thead = doc.createElement('table') - this.td = doc.createElement('tr') - this.area = doc.createElement('map') - this.tr = doc.createElement('tbody') - this.col = doc.createElement('colgroup') - this.legend = doc.createElement('fieldset') - this._default = doc.createElement('div') - this.g = doc.createElementNS('http://www.w3.org/2000/svg', 'svg') - - this.optgroup = this.option - this.tbody = this.tfoot = this.colgroup = this.caption = this.thead - this.th = this.td - - 'circle,defs,ellipse,image,line,path,polygon,polyline,rect,symbol,text,use'.replace( - /,/g, - m => { - this[m] = this.g //处理svg - } - ) -} - -const Helper = { - tagHooks: new TagHooks(), - rtagName: /<([\w:]+)/, - rxhtml: /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, - scriptTypes: { - 'text/javascript': 1, - 'text/ecmascript': 1, - 'application/ecmascript': 1, - 'application/javascript': 1 - }, - rhtml: /<|&#?\w+;/ -} - -export default { - parseJS: function(code) { - code = (code + '').trim() - if (code) { - if (code.indexOf('use strict') === 1) { - let script = doc.createElement('script') - script.text = code - doc.head.appendChild(script).parentNode.removeChild(script) - } else { - eval(code) - } - } - }, - parseXML: function(data, xml, tmp) { - try { - tmp = new DOMParser() - xml = tmp.parseFromString(data, 'text/xml') - } catch (e) { - xml = void 0 - } - - if ( - !xml || - !xml.documentElement || - xml.getElementsByTagName('parsererror').length - ) { - console.error('Invalid XML: ' + data) - } - return xml - }, - parseHTML: function(html) { - let fragment = doc.createDocumentFragment().cloneNode(false) - - if (typeof html !== 'string') { - return fragment - } - - if (!Helper.rhtml.test(html)) { - fragment.appendChild(document.createTextNode(html)) - return fragment - } - - html = html.replace(Helper.rxhtml, '<$1>').trim() - let tag = (Helper.rtagName.exec(html) || ['', ''])[1].toLowerCase() - let wrap = Helper.tagHooks[tag] || Helper.tagHooks._default - let firstChild = null - - //使用innerHTML生成的script节点不会触发请求与执行text属性 - wrap.innerHTML = html - let script = wrap.getElementsByTagName('script') - if (script.length) { - for (let i = 0, el; (el = script[i++]); ) { - if (Helper.scriptTypes[el.type]) { - let tmp = doc.createElement('script').cloneNode(false) - el.attributes.forEach(function(attr) { - tmp.setAttribute(attr.name, attr.value) - }) - tmp.text = el.text - el.parentNode.replaceChild(tmp, el) - } - } - } - - while ((firstChild = wrap.firstChild)) { - fragment.appendChild(firstChild) - } - - return fragment - }, - parseForm: function(form) { - let data = {} - let hasAttach = false - for (let i = 0, field; (field = form.elements[i++]); ) { - switch (field.type) { - case 'select-one': - case 'select-multiple': - if (field.name.length && !field.disabled) { - for (let j = 0, opt; (opt = field.options[j++]); ) { - if (opt.selected) { - data[field.name] = opt.value || opt.text - } - } - } - break - case 'file': - if (field.name.length && !field.disabled) { - data[field.name] = field.files[0] - hasAttach = true - } - break - case undefined: - case 'submit': - case 'reset': - case 'button': - break //按钮啥的, 直接忽略 - case 'radio': - case 'checkbox': - // 只处理选中的 - if (!field.checked) break - default: - if (field.name.length && !field.disabled) { - data[field.name] = field.value - } - } - } - // 如果有附件, 改为FormData - if (hasAttach) { - return this.mkFormData(data) - } else { - return data - } - }, - mkFormData(data) { - let form = new FormData() - for (let i in data) { - let el = data[i] - if (Array.isArray(el)) { - el.forEach(function(it) { - form.append(i + '[]', it) - }) - } else { - form.append(i, data[i]) - } - } - return form - }, - param: function(obj) { - if (!obj || typeof obj === 'string' || typeof obj === 'number') { - return obj - } - - let arr = [] - let q = function(k, v) { - if (/native code/.test(v)) { - return - } - - v = typeof v === 'function' ? v() : v - v = toS.call(v) !== '[object File]' ? encode(v) : v - - arr.push(encode(k) + '=' + v) - } - - if (typeof obj === 'object') { - serialize('', obj, q) - } - - return arr.join('&') - } -} +"use strict";function serialize(e,t,r){let o;if(Array.isArray(t))t.forEach(function(t,a){o=e?`${e}[${Array.isArray(t)?a:""}]`:a,"object"==typeof t?serialize(o,t,r):r(o,t)});else for(let a in t)o=e?`${e}[${a}]`:a,"object"==typeof t[a]?serialize(o,t[a],r):r(o,t[a])}const toS=Object.prototype.toString,doc=window.document,encode=encodeURIComponent,decode=decodeURIComponent,TagHooks=function(){this.option=doc.createElement("select"),this.thead=doc.createElement("table"),this.td=doc.createElement("tr"),this.area=doc.createElement("map"),this.tr=doc.createElement("tbody"),this.col=doc.createElement("colgroup"),this.legend=doc.createElement("fieldset"),this._default=doc.createElement("div"),this.g=doc.createElementNS("http://www.w3.org/2000/svg","svg"),this.optgroup=this.option,this.tbody=this.tfoot=this.colgroup=this.caption=this.thead,this.th=this.td,"circle,defs,ellipse,image,line,path,polygon,polyline,rect,symbol,text,use".replace(/,/g,e=>{this[e]=this.g})},Helper={tagHooks:new TagHooks,rtagName:/<([\w:]+)/,rxhtml:/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,scriptTypes:{"text/javascript":1,"text/ecmascript":1,"application/ecmascript":1,"application/javascript":1},rhtml:/<|&#?\w+;/};export default{parseJS:function(code){if(code=(code+"").trim(),code)if(1===code.indexOf("use strict")){let e=doc.createElement("script");e.text=code,doc.head.appendChild(e).parentNode.removeChild(e)}else eval(code)},parseXML:function(e,t,r){try{t=(new DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&t.documentElement&&!t.getElementsByTagName("parsererror").length||console.error("Invalid XML: "+e),t},parseHTML:function(e){let t=doc.createDocumentFragment().cloneNode(!1);if("string"!=typeof e)return t;if(!Helper.rhtml.test(e))return t.appendChild(document.createTextNode(e)),t;e=e.replace(Helper.rxhtml,"<$1>").trim();let r=(Helper.rtagName.exec(e)||["",""])[1].toLowerCase(),o=Helper.tagHooks[r]||Helper.tagHooks._default,a=null;o.innerHTML=e;let i=o.getElementsByTagName("script");if(i.length)for(let e,t=0;e=i[t++];)if(Helper.scriptTypes[e.type]){let t=doc.createElement("script").cloneNode(!1);e.attributes.forEach(function(e){t.setAttribute(e.name,e.value)}),t.text=e.text,e.parentNode.replaceChild(t,e)}for(;a=o.firstChild;)t.appendChild(a);return t},parseForm:function(e){let t={},r=!1;for(let o,a=0;o=e.elements[a++];)switch(o.type){case"select-one":case"select-multiple":if(o.name.length&&!o.disabled)for(let e,r=0;e=o.options[r++];)e.selected&&(t[o.name]=e.value||e.text);break;case"file":o.name.length&&!o.disabled&&(t[o.name]=o.files[0],r=!0);break;case void 0:case"submit":case"reset":case"button":break;case"radio":case"checkbox":if(!o.checked)break;default:o.name.length&&!o.disabled&&(t[o.name]=o.value)}return r?this.mkFormData(t):t},mkFormData(e){let t=new FormData;for(let r in e){let o=e[r];Array.isArray(o)?o.forEach(function(e){t.append(r+"[]",e)}):t.append(r,e[r])}return t},param:function(e){if(!e||"string"==typeof e||"number"==typeof e)return e;let t=[];return"object"==typeof e&&serialize("",e,function(e,r){/native code/.test(r)||(r="function"==typeof r?r():r,r="[object File]"!==toS.call(r)?encode(r):r,t.push(encode(e)+"="+r))}),t.join("&")}}; \ No newline at end of file diff --git a/src/lib/scroll/index.js b/src/lib/scroll/index.js index 73ceeda..e11a68d 100644 --- a/src/lib/scroll/index.js +++ b/src/lib/scroll/index.js @@ -1,14 +1,14 @@ /** * * @authors yutent (yutent@doui.cc) - * @date 2019-09-07 23:35:03 + * @date 2019-11-05 23:34:04 * @version v2.0.1 * */ 'use strict' -import{bind,ebind,unbind}from"../utils.js";const IS_FF=!!window.sidebar;export default class Scroll extends HTMLElement{static get observedAttributes(){return[]}constructor(){super(),Object.defineProperty(this,"root",{value:this.attachShadow({mode:"open"}),writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(this,"props",{value:{},writable:!0,enumerable:!1,configurable:!0}),this.root.innerHTML='
      ',this.__BOX__=this.root.children[1],this.__X__=this.root.children[2].children[0],this.__Y__=this.root.children[3].children[0]}get scrollTop(){return this.__BOX__.scrollTop}set scrollTop(t){if((t=+t)==t){var{sh:s,oh:i,yh:e}=this.props;this.__BOX__.scrollTop=t;var o=this.__BOX__.scrollTop/(s-i)*(i-e);this.props.thumbY=o,this.__Y__.style.transform=`translateY(${o}px)`}}get scrollLeft(){return this.__BOX__.scrollLeft}set scrollLeft(t){if(n=+n,n==n){var{sw:s,ow:i,xw:e}=this.props;this.__BOX__.scrollLeft=n;var o=this.__BOX__.scrollLeft/(s-i)*(i-e);this.props.thumbX=o,this.__X__.style.transform=`translateX(${o}px)`}}get scrollHeight(){return this.__BOX__.scrollHeight}_fetchScrollX(t){var{sw:s,ow:i,xw:e}=this.props;return t<0?t=0:t>i-e&&(t=i-e),this.__BOX__.scrollLeft=t/(i-e)*(s-i),this.__X__.style.transform=`translateX(${t}px)`,t}_fetchScrollY(t){var{sh:s,oh:i,yh:e}=this.props;return t<0?t=0:t>i-e&&(t=i-e),this.__BOX__.scrollTop=t/(i-e)*(s-i),this.__Y__.style.transform=`translateY(${t}px)`,t}connectedCallback(){this._initFn=bind(this.__BOX__,"mouseenter",t=>{var s=this.__BOX__.offsetWidth,i=this.__BOX__.scrollWidth,e=this.__BOX__.offsetHeight,o=this.__BOX__.scrollHeight,r=e*e/o>>0,h=s*s/i>>0;r<50&&(r=50),h<50&&(h=50),h===s&&(h=0),r===e&&(r=0),this.props.oh=e,this.props.sh=o,this.props.ow=s,this.props.sw=i,this.props.yh=r,this.props.xw=h,this.__X__.style.width=h+"px",this.__Y__.style.height=r+"px"}),this._wheelFn=ebind(this.__BOX__,"wheel",t=>{t.preventDefault();var{sh:s,oh:i,yh:e,sw:o,ow:r,xw:h}=this.props;if(h||e){var l,_;if(IS_FF)l=t.deltaMode?10*t.deltaX:t.deltaX,_=t.deltaMode?10*t.deltaY:t.deltaY;else{var n=Math.abs(t.wheelDelta);n<120?(l=t.deltaX,_=t.deltaY):(l=t.deltaX/(n/120),_=t.deltaY/(n/120))}if(this.__BOX__.scrollTop+=_,this.__BOX__.scrollLeft+=l,h){var a=this.__BOX__.scrollLeft/(o-r)*(r-h);this.props.thumbX=a,this.__X__.style.transform=`translateX(${a}px)`}if(e){var p=this.__BOX__.scrollTop/(s-i)*(i-e);this.props.thumbY=p,this.__Y__.style.transform=`translateY(${p}px)`}}});var t,s,i,e,o=o=>{var{thumbY:r,thumbX:h}=this.props;null!==t&&(i=this._fetchScrollX(h+o.pageX-t)),null!==s&&(e=this._fetchScrollY(r+o.pageY-s))},r=h=>{t=null,s=null,this.props.thumbX=i,this.props.thumbY=e,unbind(document,"mousemove",o),unbind(document,"mouseup",r)};bind(this.__Y__,"mousedown",t=>{s=t.pageY,this.props.thumbY||(this.props.thumbY=0),bind(document,"mousemove",o),bind(document,"mouseup",r)}),bind(this.__X__,"mousedown",s=>{t=s.pageX,this.props.thumbX||(this.props.thumbX=0),bind(document,"mousemove",o),bind(document,"mouseup",r)})}disconnectedCallback(){unbind(this.__BOX__,"mouseenter",this._initFn),unbind(this.__BOX__,"wheel",this._wheelFn)}}; +import{bind,ebind,unbind}from"../utils.js";const IS_FF=!!window.sidebar;export default class Scroll extends HTMLElement{static get observedAttributes(){return[]}constructor(){super(),Object.defineProperty(this,"root",{value:this.attachShadow({mode:"open"}),writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(this,"props",{value:{},writable:!0,enumerable:!1,configurable:!0}),this.root.innerHTML='
      ',this.__BOX__=this.root.children[1],this.__X__=this.root.children[2].children[0],this.__Y__=this.root.children[3].children[0]}get scrollTop(){return this.__BOX__.scrollTop}set scrollTop(t){if((t=+t)==t){var{sh:s,oh:i,yh:e}=this.props;this.__BOX__.scrollTop=t;var o=this.__BOX__.scrollTop/(s-i)*(i-e);this.props.thumbY=o,this.__Y__.style.transform=`translateY(${o}px)`}}get scrollLeft(){return this.__BOX__.scrollLeft}set scrollLeft(t){if(n=+n,n==n){var{sw:s,ow:i,xw:e}=this.props;this.__BOX__.scrollLeft=n;var o=this.__BOX__.scrollLeft/(s-i)*(i-e);this.props.thumbX=o,this.__X__.style.transform=`translateX(${o}px)`}}get scrollHeight(){return this.__BOX__.scrollHeight}_fetchScrollX(t){var{sw:s,ow:i,xw:e}=this.props;return t<0?t=0:t>i-e&&(t=i-e),this.__BOX__.scrollLeft=t/(i-e)*(s-i),this.__X__.style.transform=`translateX(${t}px)`,t}_fetchScrollY(t){var{sh:s,oh:i,yh:e}=this.props;return t<0?t=0:t>i-e&&(t=i-e),this.__BOX__.scrollTop=t/(i-e)*(s-i),this.__Y__.style.transform=`translateY(${t}px)`,t}connectedCallback(){this._initFn=bind(this.__BOX__,"mouseenter",t=>{var s=this.__BOX__.offsetWidth,i=this.__BOX__.scrollWidth,e=this.__BOX__.offsetHeight,o=this.__BOX__.scrollHeight,r=e*e/o>>0,h=s*s/i>>0;r<50&&(r=50),h<50&&(h=50),h===s&&(h=0),r===e&&(r=0),this.props.oh=e,this.props.sh=o,this.props.ow=s,this.props.sw=i,this.props.yh=r,this.props.xw=h,this.__X__.style.width=h+"px",this.__Y__.style.height=r+"px"}),this._wheelFn=ebind(this.__BOX__,"wheel",t=>{t.preventDefault();var{sh:s,oh:i,yh:e,sw:o,ow:r,xw:h}=this.props;if(h||e){var _,l;if(IS_FF)_=t.deltaMode?10*t.deltaX:t.deltaX,l=t.deltaMode?10*t.deltaY:t.deltaY;else{var n=Math.abs(t.wheelDelta);n<120?(_=t.deltaX,l=t.deltaY):(_=t.deltaX/(n/120),l=t.deltaY/(n/120))}if(this.__BOX__.scrollTop+=l,this.__BOX__.scrollLeft+=_,h){var a=this.__BOX__.scrollLeft/(o-r)*(r-h);this.props.thumbX=a,this.__X__.style.transform=`translateX(${a}px)`}if(e){var p=this.__BOX__.scrollTop/(s-i)*(i-e);this.props.thumbY=p,this.__Y__.style.transform=`translateY(${p}px)`}}});var t,s,i,e,o=o=>{var{thumbY:r,thumbX:h}=this.props;null!==t&&(i=this._fetchScrollX(h+o.pageX-t)),null!==s&&(e=this._fetchScrollY(r+o.pageY-s))},r=h=>{t=null,s=null,this.props.thumbX=i,this.props.thumbY=e,unbind(document,"mousemove",o),unbind(document,"mouseup",r)};bind(this.__Y__,"mousedown",t=>{s=t.pageY,this.props.thumbY||(this.props.thumbY=0),bind(document,"mousemove",o),bind(document,"mouseup",r)}),bind(this.__X__,"mousedown",s=>{t=s.pageX,this.props.thumbX||(this.props.thumbX=0),bind(document,"mousemove",o),bind(document,"mouseup",r)}),this.__observer=new MutationObserver(this._initFn),this.__observer.observe(this,{childList:!0,subtree:!0,characterData:!0})}disconnectedCallback(){this.__observer.disconnect(),unbind(this.__BOX__,"mouseenter",this._initFn),unbind(this.__BOX__,"wheel",this._wheelFn)}}; if(!customElements.get('wc-scroll')){ customElements.define('wc-scroll', Scroll) diff --git a/src/tools/windows.js b/src/tools/windows.js index 7c017d5..767eb1d 100644 --- a/src/tools/windows.js +++ b/src/tools/windows.js @@ -15,7 +15,7 @@ exports.createMainWindow = function(icon) { // 创建浏览器窗口 let win = new BrowserWindow({ title: 'sonist', - width: 1024, + width: 1000, height: 640, frame: false, resizable: false, @@ -69,7 +69,7 @@ exports.createErrorWindow = function() { exports.createDesktopLrcWindow = function(screen) { let win = new BrowserWindow({ title: '', - width: 1024, + width: 1000, height: 100, frame: false, resizable: false,