本文介绍如何通过参考1.4.2版本的progressbar的源码自己编写一个HelloWorld级别的easyui插件,以及如何拓展插件的功能。

有利于我们理解easyui插件的实现,以及了解如何对easyui插件进行拓展,或者当发现bug时在不修改源码的情况下对bug进行修复。

1. 首先让我们来看看progressbar的源码(已经删除了一些对本文不重要的)。

比较了一下有源码的那几个插件,发现这个只有3KB,最小,所以拿这个学习最好了;而且这个progressbar没有涉及继承其他控件,易于理解。

(function($){
function init(target) {
$(target).addClass('progressbar');
return $(target);
} $.fn.progressbar = function(options, param){
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){
$.extend(state.options, options);
} else {
state = $.data(this, 'progressbar', {
options: $.extend({}, $.fn.progressbar.defaults, $.fn.progressbar.parseOptions(this), options),
bar: init(this)
});
}
});
}; $.fn.progressbar.methods = {
options: function(jq){
return $.data(jq[0], 'progressbar').options;
},
getValue: function(jq){
return $.data(jq[0], 'progressbar').options.value;
}
}; $.fn.progressbar.parseOptions = function(target){
return $.extend({}, $.parser.parseOptions(target, ['width','height','text',{value:'number'}]));
}; $.fn.progressbar.defaults = {
width: 'auto',
height: 22,
value: 0, // percentage value
text: '{value}%',
onChange:function(newValue,oldValue){}
};
})(jQuery);

我们倒着看,

①$.fn.progressbar.defaults定义了一些参数的默认值,而且是直接定义在$.fn.progressbar.defaults上的,是全局的。

②$.fn.progressbar.parseOptions是一个对data-options="......"中的属性进行解析的方法,其实$.parser.parseOptions已经帮助我们做了主要工作,我们只需要设置一下参数是什么类型的数据就行,如这里的value设置为number类型。

③$.fn.progressbar.methods定义了这个插件的行为(一些方法),可以看出也是全局的。

④$.fn.progressbar这个是重点了,typeof options == 'string'时就是调用插件的某个方法,如$('#xxx').progressbar('setValue', 10);否则就相当于调用无参方法$('#xxx').progressbar(),有点像是个构造函数。

2. 实现自己的hello插件

jquery.hello.js

(function($){
function init(target) {
//注:此处还不能获取options //所以这里可以进行一些如设置样式、绑定事件的事情
$(target).css('cursor', 'pointer'); $(target).bind('click', function (e, preventBubble) {
$.fn.hello.methods.sayHello($(e.target));
return false;
}); return $(target);
} //easyui插件函数
$.fn.hello = function (options, param) {
//如果options为string,则是方法调用,如$('#divMyPlugin').hello('sayHello');
if (typeof options == 'string'){
var method = $.fn.hello.methods[options];
if (method){
return method(this, param);
}
} //否则是插件初始化函数,如$('#divMyPlugin').hello();
options = options || {};
return this.each(function(){
var state = $.data(this, 'hello');
if (state){
$.extend(state.options, options);
} else {
//easyui的parser会依次计算options、initedObj
state = $.data(this, 'hello', {
options: $.extend({}, $.fn.hello.defaults, $.fn.hello.parseOptions(this), options),
initedObj: init(this) //这里的initedObj名称随便取的
});
} $(this).css('color', state.options.myColor);
});
}; //设置hello插件的一些方法的默认实现
//注:第一个参数为当前元素对应的jQuery对象
$.fn.hello.methods = {
options: function(jq){
return $.data(jq[0], 'hello').options;
},
sayHello: function (jq) {
var opts = $.data(jq[0], 'hello').options; //获取配置参数
for (var i = 0; i < opts.repeatTimes; i++) {
opts.howToSay(opts.to);
}
}
}; //设置参数转换方法
$.fn.hello.parseOptions = function (target) {
var opts = $.extend({}, $.parser.parseOptions(target, ['to', 'myColor', { repeatTimes: 'number' }]));//这里可以指定参数的类型
return opts;
}; //设置hello插件的一些默认值
$.fn.hello.defaults = {
to: 'world',
repeatTimes: 1,
myColor: null,
howToSay: function (to) {
alert('Hello, ' + to + "!");
}
}; //注册自定义easyui插件hello
$.parser.plugins.push("hello");
})(jQuery);

3. 给hello插件拓展功能

我们前面已经说了$.fn.hello.methods是全局的,所以所谓拓展就是直接给$.fn.hello.methods加方法。

如果需要改写原有实现,可以直接将原来的方法覆盖掉就可以了,如:$.fn.hello.methods.sayHello = function(jq){ ...... };

jquery.hello.extension.js

(function($){

    //拓展方法
$.fn.hello.methods.sayHi = function (jq) {
//var opts = $.data(jq[0], 'hello').options;
alert("Hi");
} })(jQuery);

4. 使用hello插件

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="keywords" content="">
<meta name="description" content="">
<title></title>
<link rel="stylesheet" type="text/css" href="http://www.jeasyui.com/easyui/themes/default/easyui.css">
<link rel="stylesheet" type="text/css" href="http://www.jeasyui.com/easyui/themes/icon.css">
<script src="http://code.jquery.com/jquery-1.11.3.min.js"></script>
<script type="text/javascript" src="http://www.jeasyui.com/easyui/jquery.easyui.min.js"></script>
<script type="text/javascript" src="jquery.hello.js"></script>
<script type="text/javascript" src="jquery.hello.extension.js"></script>
</head>
<body>
<div id="divMyPlugin1" class="easyui-hello" data-options="to:'world', myColor:'red' ">点我sayHello一次</div>
<div id="divMyPlugin2" class="easyui-hello" data-options="to:'world', repeatTimes:3, myColor:'green', howToSay:customeHowToSay">点我sayHello三次</div>
<button onclick="invokePluginMethod()">调用插件的方法</button><button onclick="invokePluginExMethod()">调用插件的拓展方法</button><button onclick="$('#divMsg').empty()">Clear</button>
<div id="divMsg"> </div>
<script type="text/javascript"> function invokePluginMethod() {
$('#divMyPlugin2').hello('sayHello');
} function invokePluginExMethod() {
$('#divMyPlugin2').hello('sayHi');
} function customeHowToSay(to) {
$('<p></p>').html('你好, <span style="color:red">' + to + '<span>!' + new Date().getTime()).appendTo($('#divMsg'));
} </script>
</body>
</html>

5. 在线查看

这里

如何自己编写一个easyui插件的更多相关文章

  1. 如何自己编写一个easyui插件续

    接着如何自己编写一个easyui插件继续分享一下如何从上一节写的“hello”插件继承出一个“hello2”. 参考了combobox的源码中继承combo,当然我这个简单很多了.都是根据自己的理解来 ...

  2. 如何编写一个gulp插件

    很久以前,我们在"细说gulp"随笔中,以压缩JavaScript为例,详细地讲解了如何利用gulp来完成前端自动化. 再来短暂回顾下,当时除了借助gulp之外,我们还利用了第三方 ...

  3. 从零开始编写一个vue插件

    title: 从零开始编写一个vue插件 toc: true date: 2018-12-17 10:54:29 categories: Web tags: vue mathjax 写毕设的时候需要一 ...

  4. 自己动手编写一个VS插件(五)

    作者:朱金灿 来源:http://blog.csdn.net/clever101 继续编写VisualStudio插件.这次我编写的插件叫DevAssist(意思是开发助手).在看了前面的文章之后你知 ...

  5. 自己动手编写一个Mybatis插件:Mybatis脱敏插件

    1. 前言 在日常开发中,身份证号.手机号.卡号.客户号等个人信息都需要进行数据脱敏.否则容易造成个人隐私泄露,客户资料泄露,给不法分子可乘之机.但是数据脱敏不是把敏感信息隐藏起来,而是看起来像真的一 ...

  6. 自己动手编写一个VS插件(八)

    作者:朱金灿 来源:http://blog.csdn.net/clever101 利用业余时间继续开发一个VS插件.我要开发的插件是一个代码库插件,主要是用于积累我平时要使用的代码.在之前我已经实现了 ...

  7. 自己动手编写一个VS插件(七)

    作者:朱金灿 来源:http://blog.csdn.net/clever101 继续开发VS插件.今天在添加ATL控件时出现一个"未能返回新代码元素"的错误,如下图: 解决办法是 ...

  8. 自己动手编写一个VS插件(六)

    作者:朱金灿 来源:http://blog.csdn.net/clever101 在上篇中我们已经实现了创建和显示一个工具栏出来,它的效果图是这样的: 现在我们实现一些简单功能,具体就是单击按钮弹出一 ...

  9. webpack编写一个plugin插件

    插件向第三方开发者提供了 webpack 引擎中完整的能力.使用阶段式的构建回调,开发者可以引入它们自己的行为到 webpack 构建流程中.创建插件比创建 loader 更加高级,因为你将需要理解一 ...

随机推荐

  1. Hibernate大福利 下载链接

    正在学马士兵Hibernate的同学来看这里,这里提供了他视频里需要的JAR包,请尽情下载,给好评喔. 一.Hibernate 3.3.2 核心JAR包 http://pan.baidu.com/s/ ...

  2. 完美演绎DevExpress XtraPrinting Library 的打印功能

    完美演绎DevExpress XtraPrinting Library 的打印功能 2010-05-14 17:40:49|  分类: 默认分类|字号 订阅     设计报告不仅费时间,而且还乏味!但 ...

  3. SQL基础之数据库

    1.基础概念 首先要强调一点,就是我们的数据库是由数据库系统来管理的,我们登入数据库并在其上进行操作时最终均要通过数据库系统来完成.可以理解成在数据库上进行操作的是客户端,数据库系统是服务端.一个数据 ...

  4. TM4C123G红外触摸屏:开发板好不容易实现了原理,放到专家设计的板子上无法运行,于是专家跑路项目黄了

    使用TI的TM4C123G LaunchPad开发板,USB接口,来对同样的芯片进行烧写. 我们只用烧写那一块功能,不用另外一个芯片的开发功能,需要跳线   源码项目:   从官方网站TM4C123G ...

  5. 让 Generator 自启动

    文章同步自个人博客:http://www.52cik.com/2016/07/11/generator-co.html 此前只是简单使用而没有真正的去研究 Generator,这次要好好折腾下这货. ...

  6. Nodejs进阶:基于express+multer的文件上传

    关于作者 程序猿小卡,前腾讯IMWEB团队成员,阿里云栖社区专家博主.欢迎加入 Express前端交流群(197339705). 正在填坑:<Nodejs学习笔记> / <Expre ...

  7. sql server存储过程编程

    存储过程是一组完成特定功能的SQL 语句集合,经编译后存储在数据库中.   存储过程作为一个单元进行处理并以一个名称来标识.它能向用户返回数据.向数据库表中写入或修改数据等操作. 用户通过指定存储过程 ...

  8. MVC认知路【点点滴滴支离破碎】【二】----Razor服务器标记语言

    Razor 代码块包含在 @{....}中 内嵌表达式(变量和函数)已 @ 开头 代码语句用分号结束 变量使用 var 关键字声明 字符创用引号括起来 C#代码区分大小写 C#文件的扩展是 .csht ...

  9. 快速向表中插入大量数据Oracle中append与Nologging

    来源于:http://blog.sina.com.cn/s/blog_61cd89f60102e7gi.html 当需要对一个非常大的表INSERT的时候,会消耗非常多的资源,因为update表的时候 ...

  10. extjs 箱子布局

    a.flex 配置项 flex 配置项不是设置在布局上,而是设置在子项的配置项.每个子项相对的 flex 值都会与全体子项 flex 累加的值相比较,根据此结果,处理每个子项的 flex 最后是多少. ...