zoukankan      html  css  js  c++  java
  • easyui源码翻译1.32--EasyLoader(简单加载)

    前言

    扩展自$.fn.datebox.defaults,使用$.fn.datetimebox.defaults重写默认值对象。下载该插件翻译源码

    源码

     

    /**
     * jQuery EasyUI 1.3.2
     * 
     *翻译; qq 1364386878
     */
    (function () {
        //预定义模块
        //将所有的插件,和插件资源和依赖文件放进modules对象中。  
        var modules = {
            draggable: { js: "jquery.draggable.js" },
            droppable: { js: "jquery.droppable.js" },
            resizable: { js: "jquery.resizable.js" },
            linkbutton: { js: "jquery.linkbutton.js", css: "linkbutton.css" },
            progressbar: { js: "jquery.progressbar.js", css: "progressbar.css" },
            pagination: { js: "jquery.pagination.js", css: "pagination.css", dependencies: ["linkbutton"] },
            datagrid: {
                js: "jquery.datagrid.js", css: "datagrid.css",
                dependencies: ["panel", "resizable", "linkbutton", "pagination"]
            },
            treegrid: { js: "jquery.treegrid.js", css: "tree.css", dependencies: ["datagrid"] },
            propertygrid: { js: "jquery.propertygrid.js", css: "propertygrid.css", dependencies: ["datagrid"] },
            panel: { js: "jquery.panel.js", css: "panel.css" },
            window: {
                js: "jquery.window.js", css: "window.css",
                dependencies: ["resizable", "draggable", "panel"]
            },
            dialog: { js: "jquery.dialog.js", css: "dialog.css", dependencies: ["linkbutton", "window"] },
            messager: {
                js: "jquery.messager.js", css: "messager.css",
                dependencies: ["linkbutton", "window", "progressbar"]
            },
            layout: {
                js: "jquery.layout.js", css: "layout.css",
                dependencies: ["resizable", "panel"]
            },
            form: { js: "jquery.form.js" },
            menu: { js: "jquery.menu.js", css: "menu.css" },
            tabs: { js: "jquery.tabs.js", css: "tabs.css", dependencies: ["panel", "linkbutton"] },
            splitbutton: { js: "jquery.splitbutton.js", css: "splitbutton.css", dependencies: ["linkbutton", "menu"] },
            menubutton: { js: "jquery.menubutton.js", css: "menubutton.css", dependencies: ["linkbutton", "menu"] },
            accordion: { js: "jquery.accordion.js", css: "accordion.css", dependencies: ["panel"] },
            calendar: { js: "jquery.calendar.js", css: "calendar.css" },
            combo: {
                js: "jquery.combo.js", css: "combo.css",
                dependencies: ["panel", "validatebox"]
            },
            combobox: { js: "jquery.combobox.js", css: "combobox.css", dependencies: ["combo"] },
            combotree: { js: "jquery.combotree.js", dependencies: ["combo", "tree"] },
            combogrid: { js: "jquery.combogrid.js", dependencies: ["combo", "datagrid"] },
            validatebox: { js: "jquery.validatebox.js", css: "validatebox.css" },
            numberbox: { js: "jquery.numberbox.js", dependencies: ["validatebox"] },
            searchbox: { js: "jquery.searchbox.js", css: "searchbox.css", dependencies: ["menubutton"] },
            spinner: { js: "jquery.spinner.js", css: "spinner.css", dependencies: ["validatebox"] },
            numberspinner: { js: "jquery.numberspinner.js", dependencies: ["spinner", "numberbox"] },
            timespinner: { js: "jquery.timespinner.js", dependencies: ["spinner"] },
            tree: {
                js: "jquery.tree.js", css: "tree.css",
                dependencies: ["draggable", "droppable"]
            },
            datebox: {
                js: "jquery.datebox.js", css: "datebox.css",
                dependencies: ["calendar", "combo"]
            },
            datetimebox: {
                js: "jquery.datetimebox.js",
                dependencies: ["datebox", "timespinner"]
            },
            slider: {
                js: "jquery.slider.js",
                dependencies: ["draggable"]
            },
            parser: { js: "jquery.parser.js" }
        };
        ////预定义区域 //将国际化文件放入一个locales对象中  
        var locales = {
            "af": "easyui-lang-af.js",
            "bg": "easyui-lang-bg.js",
            "ca": "easyui-lang-ca.js",
            "cs": "easyui-lang-cs.js",
            "cz": "easyui-lang-cz.js",
            "da": "easyui-lang-da.js",
            "de": "easyui-lang-de.js",
            "en": "easyui-lang-en.js",
            "es": "easyui-lang-es.js",
            "fr": "easyui-lang-fr.js",
            "it": "easyui-lang-it.js",
            "nl": "easyui-lang-nl.js",
            "ptcallbackR": "easyui-lang-ptcallbackR.js",
            "ru": "easyui-lang-ru.js",
            "tr": "easyui-lang-tr.js",
            "zh_CN": "easyui-lang-zh_CN.js",
            "zh_TW": "easyui-lang-zh_TW.js"
        };
    
        //定义一个局部变量,做循环遍历时候,存放状态  
        var queues = {};
        //加载js
        function loadjs(module, callback) {
            //标志变量,js是否加载并执行  
            var state = false;     
            var script = document.createElement("script");
            script.type = "text/javascript";
            script.language = "javascript";
            script.src = module;
            //onload是firefox 浏览器事件,onreadystatechange,是ie的,为了兼容,两个都写上,这样写会导致内存泄露  
            //script.readyState只是ie下有这个属性,如果这个值为undefined,说明是在firefox,就直接可以执行下面的代码了。反之为ie,需要对script.readyState  
            //状态具体值进行判别,loaded和complete状态表示,脚本加载了并执行了。 
            script.onload = script.onreadystatechange = function () {
                if (!state && (!script.readyState || script.readyState == "loaded" || script.readyState == "complete")) {
                    state = true;
                    ////释放内存,还会泄露
                    script.onload = script.onreadystatechange = null;
                    if (callback) {//加载后执行回调  
                        callback.call(script);
                    }
                }
            };
            //具体加载动作,上面的onload是注册事件,  
            document.getElementsByTagName("head")[0].appendChild(script);
        };
        //运行js ,看代码逻辑可知,运行js,只是在js执行后,将这个script删除而已,主要用来加载国际化文件
        function runJs(module, callback) {
            loadjs(module, function () {
                document.getElementsByTagName("head")[0].removeChild(this);
                if (callback) {
                    callback();
                }
            });
        };
        //加载css方法
        function loadcss(module, callback) {       
            var link = document.createElement("link");
            link.rel = "stylesheet";
            link.type = "text/css";
            link.media = "screen";
            link.href = module;
            document.getElementsByTagName("head")[0].appendChild(link);
            if (callback) {
                callback.call(link);
            }
        };
        //加载单一一个plugin,仔细研究module ,可以发现,pingin之间通过dependence,构造成了一颗依赖树,  
        //这个方法,就是加载具体树中的一个节点
        function loadSinglejs(name, callback) {
            //把整个plugin的状态设置为loading  
            queues[name] = "loading";
            var module = modules[name];
            //把js状态设置为loading  
            var jsStatus = "loading";
            //如果允许css,并且plugin有css,则加载css,否则设置加载过了,其实是不加载
            var state = (easyloader.css && module["css"]) ? "loading" : "loaded";
            //加载css,plugin 的css,如果是全称,就用全称,否则把简写换成全称,所以简写的css文件要放入到themes/type./文件下  
            if (easyloader.css && module["css"]) {
                if (/^http/i.test(module["css"])) {
                    var url = module["css"];
                } else {
                    var url = easyloader.base + "themes/" + easyloader.theme + "/" + module["css"];
                }
                loadcss(url, function () {
                    state = "loaded";
                    //js, css加载完,才调用回调  
                    if (jsStatus  == "loaded" && state == "loaded") {
                        finish();
                    }
                });
            }
            //加载js,全称用全称,简写补全。 
            if (/^http/i.test(module["js"])) {
                var url = module["js"];
            } else {
                var url = easyloader.base + "plugins/" + module["js"];
            }
            loadjs(url, function () {
                jsStatus  = "loaded";
                if (jsStatus  == "loaded" && state == "loaded") {
                    finish();
                }
            });
            //加载完调用的方法,改plugin状态  
            function finish() {
                queues[name] = "loaded";
                //调用正在加载的方法,其实已经加载完了
                easyloader.onProgress(name);
                if (callback) {
                    callback();
                }
            };
        };
        ////加载主模块入口,  
        function loadModule(module, callback) {
            //定义数组,最后是形成的是依赖插件列表,最独立的插件放在首位,name是末尾  
            var mm = [];
            var doLoad = false;
            //name有两种,一种是string ,一种是string array,这样一次可以加载多个plugin,都是调用add方法进行添加  
            if (typeof module == "string") {
                add(module);
            } else {
                for (var i = 0; i < module.length; i++) {
                    add(module[i]);
                }
            }
            function add(moduleN) {
                //如果modules中没有这个plugin那退出  
                if (!modules[moduleN]) {
                    return;
                }
                //如果有,查看它是否依赖其他plugin  
                var d = modules[moduleN]["dependencies"];
                //如果依赖,就加载依赖的plugin.同时在加载依赖的plugin的依赖。注意循环中调用了add,是递归
                if (d) {
                    for (var i = 0; i < d.length; i++) {
                        add(d[i]);
                    }
                }
                mm.push(moduleN);
            };
    
            function finish() {
                if (callback) {
                    callback();
                }
                //调用onLoad,传递name 为参数 
                easyloader.onLoad(options);
            };
            //形成依赖树,不行还没有做实质性工作呢,那就是加载。打起精神来,最核心的代码就是以下的了  
            //超时用  
            var time = 0;
            //定义一个加载方法,定义后直接调用  
            function loadMm() {
                //如果mm有长度,长度!=0,加载plugin,为0,即加载完毕,开始加载国际化文件。
                if (mm.length) {
                    var m = mm[0];
                    if (!queues[m]) {//状态序列中没有这个plugin的信息,说明没有加载这个plug,调用laodSingle进行加载  s
                        doLoad  = true;
                        loadSinglejs(m, function () {
                            mm.shift();//加载完成后,将这个元素从数组去除,在继续加载,直到数组  
                            loadMm();
                        });
                    } else {
                        if (queues[m] == "loaded") {//如果这个plugin已经加载,就不用加载,以为mm中可能有重复项  
                            mm.shift();
                            loadMm();
                        } else {
                            //超时时候,10秒钟调用一次loadMn().注意arguments.callee代表函数本身  
                            if (time  < easyloader.timeout) {
                                time  += 10;
                                setTimeout(arguments.callee, 10);
                            }
                        }
                    }
                } else {
                    if (easyloader.locale && doLoad  == true && locales[easyloader.locale]) {
                        var url = easyloader.base + "locale/" + locales[easyloader.locale];
                        runJs(url, function () {
                            finish();
                        });
                    } else {
                        finish();
                    }
                }
            };
            loadMm();
        };
        //  定义一个加载器,注意,是全局变量,没有var,  
        easyloader = {
            modules: modules,//预定义模块
            locales: locales,//预定义区域
            base: ".",//easyui 基础目录,必须用'/'结束
            theme: "default",//主题的名称预定义在themes目录下
            css: true,//定义在加载模块的时候加载 CSS 文件
            locale: null,//区域名称
            timeout: 2000,//超时的值以毫秒为单位,载入如果超时则重载
            //加载指定模块。当加载成功的回调函数被调用。
            //模块参数有效的类型包括:
            //● 一个单一的模块名称
            //● 模块数组
            //● ".css"后缀结尾的CSS文件
            //● ".js"后缀结尾的JS文件
            load: function (module, callback) {
               
                if (/.css$/i.test(module)) {
                    if (/^http/i.test(module)) {
                        loadcss(module, callback);
                    } else {
                        loadcss(easyloader.base + module, callback);
                    }
                } else {
                    if (/.js$/i.test(module)) {
                        if (/^http/i.test(module)) {
                            loadjs(module, callback);
                        } else {
                            loadjs(easyloader.base + module, callback);
                        }
                    } else {
                        loadModule(module, callback);
                    }
                }
            },
            //当一个模块加载成功的时候触发
            onProgress: function (name) {
            },
            //当一个模块以及他的依赖加载成功的时候触发
            onLoad: function (name) {
            }
        };
        //以上一直在定义函数,和变量,此处为真正执行处  
        //获取页面的所有的script,主要是为了获取我们现在解释的easyloader.js文件路径,来设置base属性  
        var init = document.getElementsByTagName("script");
      
        for (var i = 0; i < init.length; i++) {
            var src = init[i].src;
            if (!src) {
                continue;
            }
            var m = src.match(/easyloader.js(W|$)/i);
            if (m) {
                //如果有,base为easyloadr.js 的相同前缀  
                easyloader.base = src.substring(0, m.index);//http://localhost:28046/jquery-easyui-1.3.2/plugins2/
              
            }
        }
        //定义一个简化调用接口  
        window.using = easyloader.load;
        if (window.jQuery) {
            jQuery(function () {
                //系统数据加载完后,加载parser.js插件,该插件是渲染界面的  
                easyloader.load("parser", function () {
                    jQuery.parser.parse();
                });
            });
        }
    })();
    View Code

    示例代码

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>Basic EasyLoader - jQuery EasyUI Demo</title>
        <link rel="stylesheet" type="text/css" href="../../themes/default/easyui.css">
        <link rel="stylesheet" type="text/css" href="../../themes/icon.css">
        <link rel="stylesheet" type="text/css" href="../demo.css">
        <script type="text/javascript" src="../../jquery-1.8.0.min.js"></script>
        
        <script src="../../plugins2/easyloader.js"></script>
    </head>
    <body>
        <h2>Basic EasyLoader</h2>
        <div class="demo-info">
            <div class="demo-tip icon-tip"></div>
            <div>Click the buttons below to load components dynamically.</div>
        </div>
        <div style="margin:10px 0;">
            <a href="#" class="easyui-linkbutton" onclick="load1()">Load Calendar</a>
            <a href="#" class="easyui-linkbutton" onclick="load2()">Load Dialog</a>
            <a href="#" class="easyui-linkbutton" onclick="load3()">Load DataGrid</a>
        </div>
        <div id="cc"></div>
        <div id="dd"></div>
        <table id="tt"></table>
        <script type="text/javascript" src="../../easyloader.js"></script>
        <script>
            function load1(){
                using('calendar', function(){
                    $('#cc').calendar({
                        180,
                        height:180
                    });
                });
            }
            function load2(){
                using(['dialog','messager'], function(){
                    $('#dd').dialog({
                        title:'Dialog',
                        300,
                        height:200
                    });
                    $.messager.show({
                        title:'info',
                        msg:'dialog created'
                    });
                });
            }
            function load3(){
                using('datagrid', function(){
                    $('#tt').datagrid({
                        title:'DataGrid',
                        300,
                        height:200,
                        fitColumns:true,
                        columns:[[
                            {field:'productid',title:'Product ID',100},
                            {field:'productname',title:'Product Name',200}
                        ]],
                        data: [
                            {"productid":"FI-SW-01","productname":"Koi"},
                            {"productid":"K9-DL-01","productname":"Dalmation"},
                            {"productid":"RP-SN-01","productname":"Rattlesnake"},
                            {"productid":"RP-LI-02","productname":"Iguana"},
                            {"productid":"FL-DSH-01","productname":"Manx"},
                            {"productid":"FL-DLH-02","productname":"Persian"},
                            {"productid":"AV-CB-01","productname":"Amazon Parrot"}
                        ]
                    });
                });
            }
        </script>
    
    </body>
    </html>
    View Code

    插件效果

    热爱编程,热爱技术,热爱生活
  • 相关阅读:
    Javascript定义类(class)的三种方法
    npm命令ionic安装失败cordova安装失败解决方法
    解决类似 Requires: libstdc++.so.6(GLIBCXX_3.4.15)(64bit)的问题
    log_format为Nginx设置日志格式
    Nginx设置日志分割方法
    java和h5 canvas德州扑克开发中(二)
    java和h5 canvas德州扑克开发中(一)
    使用Reaver破解开启了WPS功能的wifi密码(wpa/wpa2)
    在Wifi网络中嗅探明文密码(HTTP POST请求、POP等)
    创建假的wifi热点
  • 原文地址:https://www.cnblogs.com/DemoLee/p/3500265.html
Copyright © 2011-2022 走看看