You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							756 lines
						
					
					
						
							22 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							756 lines
						
					
					
						
							22 KiB
						
					
					
				| /*! | |
| 
 | |
|  @Title: layui | |
|  @Description:经典模块化前端 UI 框架 | |
|  @Site: www.layui.com | |
|  @Author: 贤心 | |
|  @License:MIT | |
| 
 | |
|  */ | |
| 
 | |
| !(function (win) { | |
|   'use strict'; | |
| 
 | |
|   var doc = document; | |
|   var config = { | |
|     modules: {}, // 记录模块物理路径 | |
|     status: {}, // 记录模块加载状态 | |
|     timeout: 10, // 符合规范的模块请求最长等待秒数 | |
|     event: {}, // 记录模块自定义事件 | |
|     version: '30233', // 系统版本号 为了解决浏览器的缓存问题; 系统中的js、html文件路径都会拼上此版本号 | |
|   }; | |
|   var Layui = function () { | |
|     this.v = '2.5.5'; // 版本号 | |
|   }; | |
|   // 获取layui所在目录 | |
|   var getPath = (function () { | |
|     var jsPath = doc.currentScript | |
|       ? doc.currentScript.src | |
|       : (function () { | |
|           var js = doc.scripts; | |
|           var last = js.length - 1; | |
|           var src; | |
|           for (var i = last; i > 0; i--) { | |
|             if (js[i].readyState === 'interactive') { | |
|               src = js[i].src; | |
|               break; | |
|             } | |
|           } | |
|           return src || js[last].src; | |
|         })(); | |
|     return jsPath.substring(0, jsPath.lastIndexOf('/') + 1); | |
|   })(); | |
|   // 异常提示 | |
|   var error = function (msg) { | |
|     win.console && console.error && console.error('Layui hint: ' + msg); | |
|   }; | |
|   var isOpera = typeof opera !== 'undefined' && opera.toString() === '[object Opera]'; | |
|   // 内置模块 | |
|   var modules = { | |
|     layer: 'modules/layer', // 弹层 | |
|     laydate: 'modules/laydate', // 日期 | |
|     laypage: 'modules/laypage', // 分页 | |
|     laytpl: 'modules/laytpl', // 模板引擎 | |
|     layim: 'modules/layim', // web通讯 | |
|     layedit: 'modules/layedit', // 富文本编辑器 | |
|     form: 'modules/form', // 表单集 | |
|     upload: 'modules/upload', // 上传 | |
|     transfer: 'modules/transfer', // 上传 | |
|     tree: 'modules/tree', // 树结构 | |
|     table: 'modules/table', // 表格 | |
|     element: 'modules/element', // 常用元素操作 | |
|     rate: 'modules/rate', // 评分组件 | |
|     colorpicker: 'modules/colorpicker', // 颜色选择器 | |
|     slider: 'modules/slider', // 滑块 | |
|     carousel: 'modules/carousel', // 轮播 | |
|     flow: 'modules/flow', // 流加载 | |
|     util: 'modules/util', // 工具块 | |
|     code: 'modules/code', // 代码修饰器 | |
|     jquery: 'modules/jquery', // DOM库(第三方) | |
|     mobile: 'modules/mobile', // 移动大模块 | 若当前为开发目录,则为移动模块入口,否则为移动模块集合 | |
|     'layui.all': '../layui.all', // PC模块合并版 | |
|   }; | |
| 
 | |
|   // 记录基础数据 | |
|   Layui.prototype.cache = config; | |
| 
 | |
|   // 定义模块 | |
|   Layui.prototype.define = function (deps, factory) { | |
|     var that = this; | |
|     var type = typeof deps === 'function'; | |
|     var callback = function () { | |
|       var setApp = function (app, exports) { | |
|         layui[app] = exports; | |
|         config.status[app] = true; | |
|       }; | |
|       typeof factory === 'function' && | |
|         factory(function (app, exports) { | |
|           setApp(app, exports); | |
|           config.callback[app] = function () { | |
|             factory(setApp); | |
|           }; | |
|         }); | |
|       return this; | |
|     }; | |
| 
 | |
|     type && ((factory = deps), (deps = [])); | |
| 
 | |
|     if (!layui['layui.all'] && layui['layui.mobile']) { | |
|       return callback.call(that); | |
|     } | |
| 
 | |
|     that.use(deps, callback); | |
|     return that; | |
|   }; | |
| 
 | |
|   // 使用特定模块 | |
|   Layui.prototype.use = function (apps, callback, exports) { | |
|     var that = this; | |
|     var dir = (config.dir = config.dir ? config.dir : getPath); | |
|     var head = doc.getElementsByTagName('head')[0]; | |
| 
 | |
|     apps = typeof apps === 'string' ? [apps] : apps; | |
| 
 | |
|     // 如果页面已经存在jQuery1.7+库且所定义的模块依赖jQuery,则不加载内部jquery模块 | |
|     if (window.jQuery && jQuery.fn.on) { | |
|       that.each(apps, function (index, item) { | |
|         if (item === 'jquery') { | |
|           apps.splice(index, 1); | |
|         } | |
|       }); | |
|       layui.jquery = layui.$ = jQuery; | |
|     } | |
| 
 | |
|     var item = apps[0]; | |
|     var timeout = 0; | |
|     exports = exports || []; | |
| 
 | |
|     // 静态资源host | |
|     config.host = config.host || (dir.match(/\/\/([\s\S]+?)\//) || ['//' + location.host + '/'])[0]; | |
| 
 | |
|     // 加载完毕 | |
|     function onScriptLoad (e, url) { | |
|       var readyRegExp = | |
|         navigator.platform === 'PLaySTATION 3' ? /^complete$/ : /^(complete|loaded)$/; | |
|       if (e.type === 'load' || readyRegExp.test((e.currentTarget || e.srcElement).readyState)) { | |
|         config.modules[item] = url; | |
|         head.removeChild(node); | |
|         (function poll () { | |
|           if (++timeout > (config.timeout * 1000) / 4) { | |
|             return error(item + ' is not a valid module'); | |
|           } | |
|           config.status[item] ? onCallback() : setTimeout(poll, 4); | |
|         })(); | |
|       } | |
|     } | |
| 
 | |
|     // 回调 | |
|     function onCallback () { | |
|       exports.push(layui[item]); | |
|       apps.length > 1 | |
|         ? that.use(apps.slice(1), callback, exports) | |
|         : typeof callback === 'function' && callback.apply(layui, exports); | |
|     } | |
| 
 | |
|     // 如果引入了完整库(layui.all.js),内置的模块则不必再加载 | |
|     if ( | |
|       apps.length === 0 || | |
|       (layui['layui.all'] && modules[item]) || | |
|       (!layui['layui.all'] && layui['layui.mobile'] && modules[item]) | |
|     ) { | |
|       return onCallback(), that; | |
|     } | |
| 
 | |
|     // 首次加载模块 | |
|     if (!config.modules[item]) { | |
|       var node = doc.createElement('script'); | |
|       // 如果是内置模块,则按照 dir 参数拼接模块路径 | |
|       // 如果是扩展模块,则判断模块路径值是否为 {/} 开头, | |
|       // 如果路径值是 {/} 开头,则模块路径即为后面紧跟的字符。 | |
|       // 否则,则按照 base 参数拼接模块路径 | |
|       var url = | |
|         (modules[item] | |
|           ? dir + 'lay/' | |
|           : /^\{\/\}/.test(that.modules[item]) | |
|           ? '' | |
|           : config.base || '') + | |
|         (that.modules[item] || item) + | |
|         '.js'; | |
| 
 | |
|       url = url.replace(/^\{\/\}/, ''); | |
| 
 | |
|       node.async = true; | |
|       node.charset = 'utf-8'; | |
|       node.src = | |
|         url + | |
|         (function () { | |
|           var version = | |
|             config.version === true ? config.v || new Date().getTime() : config.version || ''; | |
|           return version ? '?v=' + version : ''; | |
|         })(); | |
| 
 | |
|       head.appendChild(node); | |
| 
 | |
|       if ( | |
|         node.attachEvent && | |
|         !(node.attachEvent.toString && node.attachEvent.toString().indexOf('[native code') < 0) && | |
|         !isOpera | |
|       ) { | |
|         node.attachEvent('onreadystatechange', function (e) { | |
|           onScriptLoad(e, url); | |
|         }); | |
|       } else { | |
|         node.addEventListener( | |
|           'load', | |
|           function (e) { | |
|             onScriptLoad(e, url); | |
|           }, | |
|           false | |
|         ); | |
|       } | |
| 
 | |
|       config.modules[item] = url; | |
|     } else { | |
|       // 缓存 | |
|       (function poll () { | |
|         if (++timeout > (config.timeout * 1000) / 4) { | |
|           return error(item + ' is not a valid module'); | |
|         } | |
|         typeof config.modules[item] === 'string' && config.status[item] | |
|           ? onCallback() | |
|           : setTimeout(poll, 4); | |
|       })(); | |
|     } | |
| 
 | |
|     return that; | |
|   }; | |
| 
 | |
|   // 获取节点的style属性值 | |
|   Layui.prototype.getStyle = function (node, name) { | |
|     var style = node.currentStyle ? node.currentStyle : win.getComputedStyle(node, null); | |
|     return style[style.getPropertyValue ? 'getPropertyValue' : 'getAttribute'](name); | |
|   }; | |
| 
 | |
|   // css外部加载器 | |
|   Layui.prototype.link = function (href, fn, cssname) { | |
|     var that = this; | |
|     var link = doc.createElement('link'); | |
|     var head = doc.getElementsByTagName('head')[0]; | |
| 
 | |
|     if (typeof fn === 'string') { | |
|       cssname = fn; | |
|     } | |
| 
 | |
|     var app = (cssname || href).replace(/\.|\//g, ''); | |
|     var id = (link.id = 'layuicss-' + app); | |
|     var timeout = 0; | |
| 
 | |
|     link.rel = 'stylesheet'; | |
|     link.href = href + (config.debug ? '?v=' + new Date().getTime() : ''); | |
|     link.media = 'all'; | |
| 
 | |
|     if (!doc.getElementById(id)) { | |
|       head.appendChild(link); | |
|     } | |
| 
 | |
|     if (typeof fn !== 'function') { | |
|       return that; | |
|     } | |
| 
 | |
|     // 轮询css是否加载完毕 | |
|     (function poll () { | |
|       if (++timeout > (config.timeout * 1000) / 100) { | |
|         return error(href + ' timeout'); | |
|       } | |
|       parseInt(that.getStyle(doc.getElementById(id), 'width')) === 1989 | |
|         ? (function () { | |
|             fn(); | |
|           })() | |
|         : setTimeout(poll, 100); | |
|     })(); | |
| 
 | |
|     return that; | |
|   }; | |
| 
 | |
|   // 存储模块的回调 | |
|   config.callback = {}; | |
| 
 | |
|   // 重新执行模块的工厂函数 | |
|   Layui.prototype.factory = function (modName) { | |
|     if (layui[modName]) { | |
|       return typeof config.callback[modName] === 'function' ? config.callback[modName] : null; | |
|     } | |
|   }; | |
| 
 | |
|   // css内部加载器 | |
|   Layui.prototype.addcss = function (firename, fn, cssname) { | |
|     return layui.link(config.dir + 'css/' + firename, fn, cssname); | |
|   }; | |
| 
 | |
|   // 图片预加载 | |
|   Layui.prototype.img = function (url, callback, error) { | |
|     var img = new Image(); | |
|     img.src = url; | |
|     if (img.complete) { | |
|       return callback(img); | |
|     } | |
|     img.onload = function () { | |
|       img.onload = null; | |
|       typeof callback === 'function' && callback(img); | |
|     }; | |
|     img.onerror = function (e) { | |
|       img.onerror = null; | |
|       typeof error === 'function' && error(e); | |
|     }; | |
|   }; | |
| 
 | |
|   // 全局配置 | |
|   Layui.prototype.config = function (options) { | |
|     options = options || {}; | |
|     for (var key in options) { | |
|       config[key] = options[key]; | |
|     } | |
|     return this; | |
|   }; | |
| 
 | |
|   // 记录全部模块 | |
|   Layui.prototype.modules = (function () { | |
|     var clone = {}; | |
|     for (var o in modules) { | |
|       clone[o] = modules[o]; | |
|     } | |
|     return clone; | |
|   })(); | |
| 
 | |
|   // 拓展模块 | |
|   Layui.prototype.extend = function (options) { | |
|     var that = this; | |
| 
 | |
|     // 验证模块是否被占用 | |
|     options = options || {}; | |
|     for (var o in options) { | |
|       if (that[o] || that.modules[o]) { | |
|         error('\u6A21\u5757\u540D ' + o + ' \u5DF2\u88AB\u5360\u7528'); | |
|       } else { | |
|         that.modules[o] = options[o]; | |
|       } | |
|     } | |
| 
 | |
|     return that; | |
|   }; | |
| 
 | |
|   // 路由解析 | |
|   Layui.prototype.router = function (hash) { | |
|     var that = this; | |
|     var hash = hash || location.hash; | |
|     var data = { | |
|       path: [], | |
|       search: {}, | |
|       hash: (hash.match(/[^#](#.*$)/) || [])[1] || '', | |
|     }; | |
| 
 | |
|     if (!/^#\//.test(hash)) { | |
|       return data; | |
|     } // 禁止非路由规范 | |
|     hash = hash.replace(/^#\//, ''); | |
|     data.href = '/' + hash; | |
|     hash = hash.replace(/([^#])(#.*$)/, '$1').split('/') || []; | |
| 
 | |
|     // 提取Hash结构 | |
|     that.each(hash, function (index, item) { | |
|       /^\w+=/.test(item) | |
|         ? (function () { | |
|             item = item.split('='); | |
|             data.search[item[0]] = item[1]; | |
|           })() | |
|         : data.path.push(item); | |
|     }); | |
| 
 | |
|     return data; | |
|   }; | |
| 
 | |
|   // 本地持久性存储 | |
|   Layui.prototype.data = function (table, settings, storage) { | |
|     table = table || 'layui'; | |
|     storage = storage || localStorage; | |
| 
 | |
|     if (!win.JSON || !win.JSON.parse) { | |
|       return; | |
|     } | |
| 
 | |
|     // 如果settings为null,则删除表 | |
|     if (settings === null) { | |
|       return delete storage[table]; | |
|     } | |
| 
 | |
|     settings = typeof settings === 'object' ? settings : { key: settings }; | |
| 
 | |
|     try { | |
|       var data = JSON.parse(storage[table]); | |
|     } catch (e) { | |
|       var data = {}; | |
|     } | |
| 
 | |
|     if ('value' in settings) { | |
|       data[settings.key] = settings.value; | |
|     } | |
|     if (settings.remove) { | |
|       delete data[settings.key]; | |
|     } | |
|     storage[table] = JSON.stringify(data); | |
| 
 | |
|     return settings.key ? data[settings.key] : data; | |
|   }; | |
| 
 | |
|   // 本地会话性存储 | |
|   Layui.prototype.sessionData = function (table, settings) { | |
|     return this.data(table, settings, sessionStorage); | |
|   }; | |
| 
 | |
|   // 设备信息 | |
|   Layui.prototype.device = function (key) { | |
|     var agent = navigator.userAgent.toLowerCase(); | |
|     // 获取版本号 | |
|     var getVersion = function (label) { | |
|       var exp = new RegExp(label + '/([^\\s\\_\\-]+)'); | |
|       label = (agent.match(exp) || [])[1]; | |
|       return label || false; | |
|     }; | |
|     // 返回结果集 | |
|     var result = { | |
|       os: (function () { | |
|         // 底层操作系统 | |
|         if (/windows/.test(agent)) { | |
|           return 'windows'; | |
|         } else if (/linux/.test(agent)) { | |
|           return 'linux'; | |
|         } else if (/iphone|ipod|ipad|ios/.test(agent)) { | |
|           return 'ios'; | |
|         } else if (/mac/.test(agent)) { | |
|           return 'mac'; | |
|         } | |
|       })(), | |
|       ie: (function () { | |
|         // ie版本 | |
|         return !!win.ActiveXObject || 'ActiveXObject' in win | |
|           ? (agent.match(/msie\s(\d+)/) || [])[1] || '11' // 由于ie11并没有msie的标识 | |
|           : false; | |
|       })(), | |
|       weixin: getVersion('micromessenger'), // 是否微信 | |
|     }; | |
| 
 | |
|     // 任意的key | |
|     if (key && !result[key]) { | |
|       result[key] = getVersion(key); | |
|     } | |
| 
 | |
|     // 移动设备 | |
|     result.android = /android/.test(agent); | |
|     result.ios = result.os === 'ios'; | |
| 
 | |
|     return result; | |
|   }; | |
| 
 | |
|   // 提示 | |
|   Layui.prototype.hint = function () { | |
|     return { | |
|       error: error, | |
|     }; | |
|   }; | |
| 
 | |
|   // 遍历 | |
|   Layui.prototype.each = function (obj, fn) { | |
|     var key; | |
|     var that = this; | |
|     if (typeof fn !== 'function') { | |
|       return that; | |
|     } | |
|     obj = obj || []; | |
|     if (obj.constructor === Object) { | |
|       for (key in obj) { | |
|         if (fn.call(obj[key], key, obj[key])) { | |
|           break; | |
|         } | |
|       } | |
|     } else { | |
|       for (key = 0; key < obj.length; key++) { | |
|         if (fn.call(obj[key], key, obj[key])) { | |
|           break; | |
|         } | |
|       } | |
|     } | |
|     return that; | |
|   }; | |
| 
 | |
|   // 将数组中的对象按其某个成员排序 | |
|   Layui.prototype.sort = function (obj, key, desc) { | |
|     var clone = JSON.parse(JSON.stringify(obj || [])); | |
| 
 | |
|     if (!key) { | |
|       return clone; | |
|     } | |
| 
 | |
|     // 如果是数字,按大小排序,如果是非数字,按字典序排序 | |
|     clone.sort(function (o1, o2) { | |
|       var isNum = /^-?\d+$/; | |
|       var v1 = o1[key]; | |
|       var v2 = o2[key]; | |
| 
 | |
|       if (isNum.test(v1)) { | |
|         v1 = parseFloat(v1); | |
|       } | |
|       if (isNum.test(v2)) { | |
|         v2 = parseFloat(v2); | |
|       } | |
| 
 | |
|       if (v1 && !v2) { | |
|         return 1; | |
|       } else if (!v1 && v2) { | |
|         return -1; | |
|       } | |
| 
 | |
|       if (v1 > v2) { | |
|         return 1; | |
|       } else if (v1 < v2) { | |
|         return -1; | |
|       } else { | |
|         return 0; | |
|       } | |
|     }); | |
| 
 | |
|     desc && clone.reverse(); // 倒序 | |
|     return clone; | |
|   }; | |
| 
 | |
|   // 阻止事件冒泡 | |
|   Layui.prototype.stope = function (thisEvent) { | |
|     thisEvent = thisEvent || win.event; | |
|     try { | |
|       thisEvent.stopPropagation(); | |
|     } catch (e) { | |
|       thisEvent.cancelBubble = true; | |
|     } | |
|   }; | |
| 
 | |
|   // 自定义模块事件 | |
|   Layui.prototype.onevent = function (modName, events, callback) { | |
|     if (typeof modName !== 'string' || typeof callback !== 'function') { | |
|       return this; | |
|     } | |
| 
 | |
|     return Layui.event(modName, events, null, callback); | |
|   }; | |
| 
 | |
|   // 执行自定义模块事件 | |
|   Layui.prototype.event = Layui.event = function (modName, events, params, fn) { | |
|     var that = this; | |
|     var result = null; | |
|     var filter = events.match(/\((.*)\)$/) || []; // 提取事件过滤器字符结构,如:select(xxx) | |
|     var eventName = (modName + '.' + events).replace(filter[0], ''); // 获取事件名称,如:form.select | |
|     var filterName = filter[1] || ''; // 获取过滤器名称,,如:xxx | |
|     var callback = function (_, item) { | |
|       var res = item && item.call(that, params); | |
|       res === false && result === null && (result = false); | |
|     }; | |
| 
 | |
|     // 添加事件 | |
|     if (fn) { | |
|       config.event[eventName] = config.event[eventName] || {}; | |
| 
 | |
|       // 这里不再对多次事件监听做支持,避免更多麻烦 | |
|       // config.event[eventName][filterName] ? config.event[eventName][filterName].push(fn) : | |
|       config.event[eventName][filterName] = [fn]; | |
|       return this; | |
|     } | |
| 
 | |
|     // 执行事件回调 | |
|     layui.each(config.event[eventName], function (key, item) { | |
|       // 执行当前模块的全部事件 | |
|       if (filterName === '{*}') { | |
|         layui.each(item, callback); | |
|         return; | |
|       } | |
| 
 | |
|       // 执行指定事件 | |
|       key === '' && layui.each(item, callback); | |
|       filterName && key === filterName && layui.each(item, callback); | |
|     }); | |
|     return result; | |
|   }; | |
| 
 | |
|   // 加载自定义事件 | |
|   NodeList.prototype.forEach = Array.prototype.forEach; | |
|   window.customEvent = { | |
|     rootScope: { | |
|       name: 'document', | |
|       handleEvent: {}, | |
|       events: {}, | |
|       children: [], | |
|     }, | |
| 
 | |
|     /** | |
|      * @description: 用于处理模板解析 | |
|      * @param {String} template 传递已经被latpl编译的模板 | |
|      * @param {String} locationId id | |
|      * @return {String} 返回已经被latpl编译的模板 | |
|      */ | |
|     parse: function (template, locationId) { | |
|       var $ = layui.$; | |
|       // 查找父级组件 | |
|       var that = this; | |
|       var currentScope = null; | |
|       if (!locationId) { | |
|         // 根节点初始化Scope | |
|         currentScope = that.rootScope; | |
|       } else { | |
|         var parentId = $("*[edoc='" + locationId + "']") | |
|           .parents('*[edoc]') | |
|           .first() | |
|           .attr('edoc'); | |
|         var parentScope = that.findScope(parentId, that.rootScope) || that.rootScope; | |
|         var currentScope = that.findScope(locationId, that.rootScope); | |
|         if (!currentScope) { | |
|           currentScope = { | |
|             name: locationId, | |
|             handleEvent: {}, | |
|             events: {}, | |
|           }; | |
|           parentScope.children | |
|             ? parentScope.children.push(currentScope) | |
|             : (parentScope.children = [currentScope]); | |
|         } | |
|       } | |
|       // 匹配模板内部存在 @ 绑定事件的DOM | |
|       return template.replace(/<[^<]*(@\w*=\w*(\(\S*\))?\s*)+[^>]*>/gi, function (domStr) { | |
|         var randomFlag = 'data-ident=' + Math.floor(Math.random() * 1000); | |
|         while (currentScope.handleEvent[randomFlag]) { | |
|           randomFlag = 'data-ident=' + Math.floor(Math.random() * 1000); | |
|         } | |
|         // 初始化handleEvent | |
|         currentScope.handleEvent[randomFlag] = {}; | |
|         // 替换生成唯一标记 然后匹配DOM上的绑定事件 | |
|         // (\((?<=\()[^\)]+\))? | |
|         return domStr | |
|           .replace('>', ' ' + randomFlag + ' >') | |
|           .replace(/@\w*=\w*(\([^\)]+\))?\s*/gi, function (subStr) { | |
|             // 生成绑定事件的格式 | |
|             var event = subStr.replace('@', '').trim().split('='); | |
|             currentScope.handleEvent[randomFlag][event[0]] = event[1]; | |
|             return ''; | |
|           }); | |
|       }); | |
|     }, | |
| 
 | |
|     /** | |
|      * @description: 用于绑定监听事件,并触发相关的回调 | |
|      * @param {Object} data data | |
|      * @param {String} locationId id | |
|      * @return {Object} null | |
|      */ | |
|     bindEvent: function (data, locationId) { | |
|       var $ = layui.$; | |
|       var currentScope = this.findScope(locationId, this.rootScope) || this.rootScope; | |
|       var filter = $(locationId ? '*[edoc="' + currentScope.name + '"]' : 'body'); | |
|       try { | |
|         Object.keys(currentScope.handleEvent).forEach(function (event) { | |
|           if (currentScope.handleEvent[event].bindStatus) {return null;} | |
|           var _EventDOM = filter.find('*[' + event + ']'); | |
|           var _Events = currentScope.handleEvent[event.trim()]; | |
|           Object.keys(_Events).forEach(function (_EventName) { | |
|             var _FnTemp = _Events[_EventName].split('('); | |
|             var _FnName = _FnTemp[0]; | |
|             var _FnArgs = _FnTemp[1] ? _FnTemp[1].replace(')', '') : data; | |
|             try { | |
|               if (typeof _FnArgs === 'string' && isNaN(_FnArgs)) { | |
|                 _FnArgs = JSON.parse(_FnArgs); | |
|               } | |
|             } catch (e) { | |
|               console.error(_FnArgs, '参数无法转化为对象', e); | |
|             } | |
|             _EventDOM.on(_EventName, function (event) { | |
|               currentScope.events[_FnName](_FnArgs, event.currentTarget); | |
|             }); | |
|             Object.defineProperty(currentScope.handleEvent[event], 'bindStatus', { | |
|               value: true, | |
|             }); | |
|           }); | |
|         }); | |
|       } catch (error) { | |
|         console.error(error); | |
|       } | |
|     }, | |
| 
 | |
|     /** | |
|      * @description: 用于提供回调以挂载给绑定事件调用 | |
|      * @param {String} name 回调函数名称 | |
|      * @param {Function} callback 回调函数 | |
|      * @return {Object} null | |
|      */ | |
|     toggleEvent: function (name, callback) { | |
|       var customEvent = window.customEvent; | |
|       var currentScope = | |
|         this.constructor.name === 'Object' | |
|           ? customEvent.rootScope | |
|           : customEvent.findScope(this.id, customEvent.rootScope); | |
|       if (currentScope && currentScope.events) {currentScope.events[name] = callback;} | |
|     }, | |
|     // | |
|     refresh:function(locationId){ | |
|       var that=this | |
|       try { | |
|         var node=that.findScope(locationId,that.rootScope) | |
|         if(node){ | |
|           node.handleEvent={}, | |
|           node.events={} | |
|         } | |
|       } catch (error) { | |
|         console.log(error); | |
|       } | |
|     }, | |
|     // 依赖方法 | |
|     /** | |
|      * @description:数组去重 | |
|      * @param {Array} arr 重复数组 | |
|      * @return {Array} 去重数组 | |
|      */ | |
|     unique: function (arr) { | |
|       var obj = {}; | |
|       var newArr = []; | |
|       for (var i = 0; i < arr.length; i++) { | |
|         if (obj[arr[i]] === undefined) { | |
|           newArr.push(arr[i]); | |
|           obj[arr[i]] = 1; | |
|         } | |
|       } | |
|       return newArr; | |
|     }, | |
|     /** | |
|      * @description: 查找作用域(不查根节点) | |
|      * @param {String} scopeName 作用域名词 | |
|      * @param {Object} scopeTree 作用域树 | |
|      * @return {Object} scope | |
|      */ | |
|     findScope: function (scopeName, scopeTree) { | |
|       try { | |
|         var childScopes = scopeTree.children; | |
|         for (var index = 0; index < childScopes.length; index++) { | |
|           var scope = childScopes[index]; | |
|           if (scope.name === scopeName) { | |
|             return scope; | |
|           } | |
|           if (scope.children) { | |
|             var result = window.customEvent.findScope(scopeName, scope); | |
|             if (result) { | |
|               return result; | |
|             } | |
|           } | |
|         } | |
|         return null; | |
|       } catch (error) { | |
|         console.log(error); | |
|       } | |
|     }, | |
|   }; | |
| 
 | |
|   win.layui = new Layui(); | |
| })(window);
 |