JQuery-easyui 分析(1)
下载了jquery-easyui的源码,做简单分析。
easyui的代码库结构很简单。n个控件(widget)的文件(比如jquery.calendar.js, 一看就明白它是日历组件咯)加上两个基础文件--easyloader.js 和parser.js;
easyloader.js 话说是负责加载每个widget的Js文件和css文件的,当然也负责把parser.js给load近来。
首先看看easyloader.js:
这个js里有一个modules对象:
var modules={messager:{ js:'jquery.messager.js', css:'messager.css', dependencies:['linkbutton','window','progressbar'] }, //... 省略其他 }
这个代码段messager自然是easyui里一个widget,js,css属性都是widget对应的文件名;
dependencies 是依赖项;也就是说加载messager的时候先要把linkbutton,window,progressbar先加载进来。
加载widget的方法一目了然,是loadJS,loadCss,loadModule 这几个方法。
二:Parser.JS
easyui的widget都是声明式的,比如: <a href="#" class="easyui-linkbutton" data-options="iconCls:'icon-add'">Add</a>
声明class为easyui-linkbutton,则easyui库会把这个超链接变成按钮。 那么easyui库就必须读到这个class,然后转换。
转换在parser.js 的parse方法中进行。
在parser.js 中有一个plugins数组,保存了所有easyui的widget名称,如下代码:
plugins:['linkbutton','menu','menubutton','splitbutton','progressbar', 'tree','combobox','combotree','numberbox','validatebox','searchbox', 'numberspinner','timespinner','calendar','datebox','datetimebox','slider', 'layout','panel','datagrid','propertygrid','treegrid','tabs','accordion','window','dialog' ],
然后parse方法循环数组,每循环到一个widget名,就从网页中获取相关的jquery对象
parse: function(context){ var aa = []; for(var i=0; i<$.parser.plugins.length; i++){ //循环widget数组 var name = $.parser.plugins[i]; var r = $('.easyui-' + name, context); //从网页中查找shen if (r.length){ if (r[name]){ r[name](); } else { aa.push({name:name,jq:r}); } } }
余下就是调用easyloader进行加载了。
有一个问题还没明白,当把所有的widget合并到一个js文件里的时候,easyloader的load方法,还需要么?这个要继续分析他的代码了。。
很可惜,下载的代码并不是最新的版本。作者似乎故意只发上一个版本的源码。最新的技术,国之利器,不可示人啊。