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对象上;

 

posted @ 2020-03-03 17:49  enych  阅读(972)  评论(0编辑  收藏  举报