layui 源码分析
//入口1 ################################################ /* 调用 layui.config({ version: "2.0.8", base: '/larryms/', //实际使用时,建议改成绝对路径 //mods:'index', rightMenu: true // false关闭,设置为custom时使用自定义,不使用默认menu }) */ //该方法是 传递的对象 增加到 o 对象上; n.prototype.config = function (e) { for (var t in e) { var z = t; //t为属性名 var z1 = e[t]; //z1为属性值 } e = e || {}; for (var t in e) o[t] = e[t]; return this } , n.prototype.modules = function () { var e = {}; for (var t in u) e[t] = u[t]; return e }(), //入口2 ################################################ /* 调用 layui.extend({ larry: 'js/base' }) */ //该方法是 在扩展属性modules上增加 属性和值; n.prototype.extend = function (e) { var t = this; e = e || {}; for (var o in e) t[o] || t.modules[o] ? i("模块名 " + o + " 已被占用") : t.modules[o] = e[o]; return t }
//入口3 ############################################### /* 调用 layui.use('larry'); */ n.prototype.use = function (e, n, l) { //定义一个函数s ; 有可能是加载完成后在移除 function s(e, t) { var n = "PLaySTATION 3" === navigator.platform ? /^complete$/ : /^(complete|loaded)$/; ("load" === e.type || n.test((e.currentTarget || e.srcElement).readyState)) && (o.modules[f] = t, d.removeChild(v), function r() { return ++m > 1e3 * o.timeout / 4 ? i(f + " is not a valid module") : void (o.status[f] ? c() : setTimeout(r, 4)) }()) } //定义一个函数c function c() { l.push(layui[f]), e.length > 1 ? y.use(e.slice(1), n, l) : "function" == typeof n && n.apply(layui, l) } var y = this; var p = o.dir = o.dir ? o.dir : r; // 最后 p ="http://localhost:62081/larryms/layui/" //获取head元素 var d = t.getElementsByTagName("head")[0]; //判断 e是否是字符串类型, 如果是, 把 e = 该字符串的数组 [e]; e = "string" == typeof e ? [e] : e; //jq对象定义的时候执行 该句 window.jQuery && jQuery.fn.on && ( y.each(e, function (t, o) { "jquery" === o && e.splice(t, 1) } ), layui.jquery = layui.$ = jQuery ); //e = ["larry"]; e[0] = "larry"; var f = e[0], m = 0; if ( l = l || [], o.host = o.host || (p.match(/\/\/([\s\S]+?)\//) || ["//" + location.host + "/"])[0], 0 === e.length || layui["layui.all"] && u[f] || !layui["layui.all"] && layui["layui.mobile"] && u[f] ) { return c(), y; } if (o.modules[f]) //立即调用函数; !function g() { return ++m > 1e3 * o.timeout / 4 ? i(f + " is not a valid module") : void ("string" == typeof o.modules[f] && o.status[f] ? c() : setTimeout(g, 4)) }(); else { //创建一个script标签 var v = t.createElement("script"); //js的路径; u是模块对象 var h = (u[f] ? p + "lay/" : /^\{\/\}/.test(y.modules[f]) ? "" : o.base || "") + (y.modules[f] || f) + ".js"; //js路径处理 h = h.replace(/^\{\/\}/, ""); // 浏览器会异步的下载该文件;加载完成 并执行 v.async = !0; v.charset = "utf-8"; //设置 script 标签的 src v.src = h + function () { var e = o.version === !0 ? o.v || (new Date).getTime() : o.version || ""; return e ? "?v=" + e : "" }(); // 该节点 追加到head 中 d.appendChild(v); var zzz = !v.attachEvent; var zzz2 = a; !v.attachEvent || v.attachEvent.toString && v.attachEvent.toString().indexOf("[native code") < 0 || a ? v.addEventListener("load", function (e) { s(e, h) //执行s函数 }, !1) //IE元素 只支持 onreadystatechange事件 : v.attachEvent("onreadystatechange", function (e) { s(e, h) //执行s函数 }); o.modules[f] = h; } return y }
//内部 属性
, n = function () { this.v = "2.4.5" } ,//r是自执行函数;是获得js 的路径 r = function () { //t是document; //t.currentScript表示正在运行的script元素 var test = t.currentScript; var e = t.currentScript ? t.currentScript.src : function () { //document.scripts 表示获取所有script元素集合 for (var e, o = t.scripts, n = o.length - 1, r = n; r > 0; r--) if ("interactive" === o[r].readyState) { e = o[r].src; break } //如果e 未定义 返回.src;否则返回e; return e || o[n].src }(); //截取字符串;获取加载路径; //src: "http://localhost:62081/larryms/layui/layui.js" //r = "http://localhost:62081/larryms/layui/ return e.substring(0, e.lastIndexOf("/") + 1) }()
other
o对象 o = { modules: {}, status: {}, timeout: 10, event: {} } n.prototype.cache = o; 扩展属性cache=o;对象 layui对象下的cache属性 cache: callback: {} event: {} modules: {} status: {} timeout: 10 __proto__: Object 多了一个callback属性; o.callback = {}, (function (e) { var o = { modules: {} }, n = function () { }; n.prototype.cache = o; n.prototype.fun =function () { var t =o; } o.callback = {}; e.layui = new n })(window) // 类似于 o 内部变量地址 赋值 给扩展属性 cache; //操作 layui.cache实际是操作 内部变量 o; var z = layui; layui.cache.AAAAAAA = 0; layui.fun(); o对象下的属性 1. callback: {} 2. event: {} 3. homeUrl: "console.html" 4. menuData: {code: 1, msg: "success", data: Array(4)} 5. modules: {} 6. page: "switchs,index" 7. status: {} 8. timeout: 10 如果对 layui的cache 赋值; 实际上是赋值到o对象上;