如何自己编写一个easyui插件

本文介绍如何通过参考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 >‘ + to + ‘<span>!‘ new Date().getTime()).appendTo($(‘#divMsg‘));

        }

    </script>

</body>

</html>

5. 在线查看

这里http://liqipeng.github.io/MyDemoCode/demos/easyui/02write-a-easyui-plugin.html

来源 http://www.cnblogs.com/liqipeng/p/write-a-easyui-plugin.html

时间: 2024-08-04 21:38:52

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

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

接着如何自己编写一个easyui插件继续分享一下如何从上一节写的“hello”插件继承出一个“hello2”. 参考了combobox的源码中继承combo,当然我这个简单很多了.都是根据自己的理解来写的,没有参考什么权威资料,欢迎各位看官拍砖. 1. 实现效果 点击这里在线查看增加了一个输入框,sayHello的是输入的名字. 2. 贴代码 (function ($) { function init(target) { $(target).addClass('hello2'); return

如何编写一个gulp插件

很久以前,我们在"细说gulp"随笔中,以压缩JavaScript为例,详细地讲解了如何利用gulp来完成前端自动化. 再来短暂回顾下,当时除了借助gulp之外,我们还利用了第三方gulp插件”gulp-uglify”,来达到压缩JavaScript文件的目的. 代码如下: 今儿,我们的重点就是,自己也来实现一个gulp插件. 正文 其实,如果只是单纯地想要编写一个gulp插件不难,可以借助through2或者through-gulp来编写(through-gulp是基于through

如何编写一个Maven插件

如何编写一个Maven插件 本文基于eclipse ee. 建立一个maven插件工程: 主要就是让项目能依赖maven-plugin-api: 编写一个Mojo类: /** * 用于输出消息的Mojo * @goal hello */ public class HelloMojo extends AbstractMojo { /** * @parameter expression="${echo.message}" default-value="Hello Maven Wo

从零开始编写一个vue插件

title: 从零开始编写一个vue插件 toc: true date: 2018-12-17 10:54:29 categories: Web tags: vue mathjax 写毕设的时候需要一个mathjax编辑器,因此直接写一个插件试一下. 准备账号 进入npm注册账号 初始化项目 vue init webpack-simple mathjax-toolbar cd mathjax-toolbar npm install 得到的项目内的/src结构如下: src/ ├── assets

如何编写一个WebPack的插件原理及实践

_ 阅读目录 一:webpack插件的基本原理 二:理解 Compiler对象 和 Compilation 对象 三:插件中常用的API 四:编写插件实战 回到顶部 一:webpack插件的基本原理 webpack构建工具大家应该不陌生了,那么下面我们来简单的了解下什么是webpack的插件.比如我现在写了一个插件叫 "kongzhi-plugin" 这个插件.那么这个插件在处理webpack编译过程中会处理一些特定的任务. 比如我们现在在webpack.config.js 中引入了一

nopcommerce商城系统--如何编写一个插件

原址:http://www.nopcommerce.com/docs/77/how-to-write-a-nopcommerce-plugin.aspx plug-in (或 plugin)是一个为更大的软件应用程序添加特定的能力的组件(Wikipedia) 插件是用来扩展nopCommerce功能的.nopCommerce拥有多种类型的插件.例如:支付方式(PayPal),税务机构,送货方式计算方法(UPS, USP, FedEx),小部件(如"在线聊天"块)等等. nopComme

编写一个简单的Jquery插件

1.实现内容 定义一个简单的jquery插件,alert传递进来的参数 2.插件js文件(jquery.showplugin.js) (function ($) { //定义插件中的方法 var methods = { //Object showName: function (name) { alert('Name:' + name); }, showAge: function (age) { alert('Age' + age); } }; //method方法名 $.fn.showplugi

[转]nopcommerce商城系统--如何编写一个插件

本文转自:http://www.cnblogs.com/ganqiyin/p/3680771.html 原址:http://www.nopcommerce.com/docs/77/how-to-write-a-nopcommerce-plugin.aspx plug-in (或 plugin)是一个为更大的软件应用程序添加特定的能力的组件(Wikipedia) 插件是用来扩展nopCommerce功能的.nopCommerce拥有多种类型的插件.例如:支付方式(PayPal),税务机构,送货方式

Hexo+NexT(六):手把手教你编写一个Hexo过滤器插件

Hexo+NexT介绍到这里,我认为已经可以很好地完成任务了.它所提供的一些基础功能及配置,都已经进行了讲解.你已经可以随心所欲地配置一个自己的博客环境,然后享受码字的乐趣. 把博客托管到Github上,是个很好的想法,没有自己空间的博主肯定很欢迎.其实文章编译之后,他就是一个非常简单的静态网站.部署的目的就是简单的把静态网站文件夹拷贝到Github的一个仓库里,然后把这个仓库当作一个网站文件夹,仅此而已,非常简单.所以,没有讲的价值. 但是,作为一个Coder,研究了Hexo,总得来点真本事,