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(); }); }); } })();
示例代码
<!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({ width:180, height:180 }); }); } function load2(){ using(['dialog','messager'], function(){ $('#dd').dialog({ title:'Dialog', width:300, height:200 }); $.messager.show({ title:'info', msg:'dialog created' }); }); } function load3(){ using('datagrid', function(){ $('#tt').datagrid({ title:'DataGrid', width:300, height:200, fitColumns:true, columns:[[ {field:'productid',title:'Product ID',width:100}, {field:'productname',title:'Product Name',width: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>
插件效果
热爱编程,热爱技术,热爱生活