标签:javascript 代码解析 扩展 easyui plugin
作者博客:http://blog.csdn.net/stationxp 作者微博:http://weibo.com/liuhailong2008 转载请取得作者同意
var modules = { progressbar:{ js:'jquery.progressbar.js', css:'progressbar.css' }, numberbox:{ js:'jquery.numberbox.js', dependencies:['textbox'] }, parser:{ js:'jquery.parser.js' } }; var locales = { 'zh_CN':'easyui-lang-zh_CN.js' };
var queues = {}; function loadJs(url, callback){ } function runJs(url, callback){ loadJs(url, function(){}); } function loadCss(url, callback){} // 解决加载状态的问题 loading/loaded function loadSingle(name, callback){ loadCss(url, function(){ }); loadJs(url, function(){ }); } //解决dependencies的问题 function loadModule(name, callback){loadSingle(m, function(){});}
easyloader = { modules:modules, locales:locales, base:'.', theme:'default', css:true, locale:null, timeout:2000, load: function(name, callback){ loadCss(easyloader.base + name, callback); loadJs(name, callback); loadModule(name, callback); }, onProgress: function(name){}, onLoad: function(name){} }; window.using = easyloader.load;
if (window.jQuery){ jQuery(function(){ easyloader.load('parser', function(){ // 即using jQuery.parser.parse(); // 忽然意识到,easyloader本身是不以来jQuery的。 }); }); }
$.parser = { auto: true, onComplete: function(context){}, plugins:['draggable','droppable','resizable','pagination','tooltip', 'linkbutton' ], //这里仅包含页面组件 parse: function(context){ var aa = []; for(var i=0; i<$.parser.plugins.length; i++){ // 逐个处理plugin var name = $.parser.plugins[i]; // 通过 样式类名约定,Err,这样好吗? // 侵入性太强,窃以为这是封闭性的做法 var r = $('.easyui-' + name, context); if (r.length){ // 假如是 progressbar 组件,name的值是 progressbar if (r[name]){ // r 是jQuery对象,r['progressbar']有效,即已经加载过这个组件 r[name](); // 调用 r.progressbar() , 每个组件都体现为一个方法 } else { // 如果组件还未加载,加载后再调用 // 以下为逻辑模拟,并非源码 easyloader.load(name, function(){ r[name](); }); } } } }
<link rel="stylesheet" type="text/css" href="progressbar.css"> <script type="text/javascript" src="jquery.progressbar.js"></script>
$(function(){ $('#p').progressbar(); });
<script type="text/javascript" src="jquery.parser.js"></script>
<html> <head> <meta charset="UTF-8"> <title>Easy ProgressBar</title> <link rel="stylesheet" type="text/css" href="progressbar.css"> <script type="text/javascript" src="jquery.min.js"></script> <script type="text/javascript" src="jquery.parser.js"></script> <script type="text/javascript" src="jquery.progressbar.js"></script> <script type="text/javascript"> $(function(){ $('#p').progressbar(); $('#p').progressbar('setValue', 90); }); </script> </head> <body> <h2>Easy ProgressBar</h2> <div id="p" style="width:400px;"></div> </body> </html>
(function($){ // 定义属性和事件的默认值 $.fn.progressbar.defaults = { width: 'auto', height: 22, value: 0, // percentage value text: '{value}%', onChange:function(newValue,oldValue){} }; // 初始化方法,在入口函数中调用 // 这是很典型的一个页面组件,在初始化的时候增加样式,增加页面元素,绑定事件 function init(target){ // 增加样式 $(target).addClass('progressbar'); // 增加页面元素以实现功能 $(target).html('<div class="progressbar-text"></div><div class="progressbar-value"><div class="progressbar-text"></div></div>'); // 页面大小调整时触发?force传true可强制改变大小 $(target).bind('_resize', function(e,force){ if ($(this).hasClass('easyui-fluid') || force){ setSize(target); } // 阻止事件冒泡? return false; }); return $(target); } /* 入口函数 */ $.fn.progressbar = function(options, param){ // 如果第一个参数是 string 类型,那就是在调用方法 // 形如: $('#x').progressbar('getValue'); if (typeof options == 'string'){ var method = $.fn.progressbar.methods[options]; if (method){ return method(this, param); } } // 配置项默认为空对象 options = options || {}; // 插件扩展的基本写法 return this.each(function(){ // 从缓存中取状态数据 var state = $.data(this, 'progressbar'); if (state){ // 如果找到,把新传入的options合并 $.extend(state.options, options); } else { // 新创建一个,并加入缓存 state = $.data(this, 'progressbar', { //$.fn.progressbar.parseOptions(this)是自定义的,稍后看代码 // 这里可以看到配置信息的优先级 options: $.extend({}, $.fn.progressbar.defaults, $.fn.progressbar.parseOptions(this), options), bar: init(this) // init()返回的是 $(target) }); } $(this).progressbar('setValue', state.options.value); setSize(this); }); }; // 闭包之内,对$.fn.progressbar函数内可见,对外不可见 function setSize(target,width){ // 从缓存中取得配置信息 var opts = $.data(target, 'progressbar').options; // 获得bar对象,即 init()返回的 $(target) var bar = $.data(target, 'progressbar').bar; if (width) opts.width = width; // parser中定义的 bar._size(opts); // 更改进度条显示 bar.find('div.progressbar-text').css('width', bar.width()); bar.find('div.progressbar-text,div.progressbar-value').css({ height: bar.height()+'px', lineHeight: bar.height()+'px' }); } // 提供给用户调用的方法 $.fn.progressbar.methods = { // 调用方式: $('p').progressbar('options').value; // 第一个参数jq已经被progressbar传了this options: function(jq){ return $.data(jq[0], 'progressbar').options; }, // 调用方式: $('p').progressbar('resize',width); resize: function(jq, width){ return jq.each(function(){ setSize(this, width); }); }, // 调用方式: $('p').progressbar('getValue'); getValue: function(jq){ return $.data(jq[0], 'progressbar').options.value; }, // 调用方式: $('p').progressbar('setValue',90); setValue: function(jq, value){ if (value < 0) value = 0; if (value > 100) value = 100; return jq.each(function(){ var opts = $.data(this, 'progressbar').options; var text = opts.text.replace(/{value}/, value); var oldValue = opts.value; opts.value = value; $(this).find('div.progressbar-value').width(value+'%'); $(this).find('div.progressbar-text').html(text); if (oldValue != value){ opts.onChange.call(this, value, oldValue); } }); } }; // 调用了 $.parser.parseOptions // 有两处依赖 parser $.fn.progressbar.parseOptions = function(target){ return $.extend({}, $.parser.parseOptions(target, ['width','height','text',{value:'number'}])); }; })(jQuery);
easyloader是个优秀的资源加载框架。
parser是easyui的核心,实现了自动加载解析(虽然约定过于死板,不是我喜欢的风格)页面控件,同时提供优秀的页面操作基础函数(这个价值很大)。
progressbar代码清晰,结构合理,可以作为自己开发页面组件的模版。
Java程序员的JavaScript学习笔记(13—— jQuery UI)
标签:javascript 代码解析 扩展 easyui plugin
原文地址:http://blog.csdn.net/stationxp/article/details/40534209