zoukankan      html  css  js  c++  java
  • 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(///([sS]+?)//)
                        || ["//" + 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对象上;
  • 相关阅读:
    向局域网共享文件夹 写文件(示例)
    安装adb之后出现 找不到设备的情况
    .net 下发送calendar
    解决api 跨域 webconfig添加节点
    String类为什么是不可变的
    Sql
    2020职业规划
    摘录
    Docker
    软件测试工程师的职责是什么
  • 原文地址:https://www.cnblogs.com/enych/p/12403628.html
Copyright © 2011-2022 走看看