zoukankan      html  css  js  c++  java
  • jquery插件的写法

    jquery插件及zepto插件,写法上有些区别。

    区别点: 
    1、自定义事件的命名空间 
    jq的时间命名空间是用点“.”,而zepto是用冒号“:” 

    //jquery
    $(this).trigger('cusevent.pluginname');
    
    //zepto
    $(this).trigger('cusevent:pluginname');

    2、data() 方法 
    jq的data方法非常强大,可以存储字符串、对象、函数等一切js数据 
    而zepto的data方法则非常简陋,只能纯一下字符串。 
    由于写插件时,常用data方法来缓存插件实例化后的内容,所以这里需要做一下兼容修改。

    // i is simply a counter, the rest 
    // of what is stored will be instances
    $.waiting.lookup = {
        i: 0
    };
    
    // store the new instance.. $t=$(this)
    $.waiting.lookup[++$.waiting.lookup.i] = new $.waiting($t, o);
    $t.data('waiting', $.waiting.lookup.i);
    
    // retrieve the instance
    var inst = $.waiting.lookup[$(this).data('waiting')];

    最后附上,JQ插件的编写模板,写插件的时候就不用考虑代码组织结构了。

    /**
     * Created by hugohua on 14-4-1.
     * jQuery plugin template
     */
    
    /**
     * 将插件封装在一个闭包里面,防止外部代码污染  冲突
     */
    (function ($) {
        /**
         * 定义一个插件 Plugin
         */
        var Plugin,
            privateMethod;  //插件的私有方法,也可以看做是插件的工具方法集
    
        /**
         * 这里是插件的主体部分
         * 这里是一个自运行的单例模式。
         * 这里之所以用一个 Plugin 的单例模式 包含一个 Plugin的类,主要是为了封装性,更好的划分代码块
         * 同时 也 方便区分私有方法及公共方法
         * PS:但有时私有方法为了方便还是写在了Plugin类里,这时建议私有方法前加上"_"
         */
        Plugin = (function () {
    
            /**
             * 插件实例化部分,初始化时调用的代码可以放这里
             * @param element 传入jq对象的选择器,如 $("#J_plugin").plugin() ,其中 $("#J_plugin") 即是 element
             * @param options 插件的一些参数神马的
             * @constructor
             */
            function Plugin(element, options) {
                //将dom jquery对象赋值给插件,方便后续调用
                this.$element = $(element);
    
                //将插件的默认参数及用户定义的参数合并到一个新的obj里
                this.settings = $.extend({}, $.fn.plugin.defaults,options);
                //如果将参数设置在dom的自定义属性里,也可以这样写
                this.settings = $.extend({}, $.fn.plugin.defaults, this.$element.data(), options);
    
                //初始化调用一下
                this.init();
            }
    
            /**
             * 写法一
             * 插件的公共方法,相当于接口函数,用于给外部调用
             */
            Plugin.prototype.doSomething = function () {
                /**
                 * 方法内容
                 */
            };
    
            /**
             * 写法二
             * 将插件所有函数放在prototype的大对象里
             * @type {{}}
             */
            Plugin.prototype = {
    
                init:function(){
                    console.log('init');
                },
    
                doSomething2:function(){
    
                }
            };
    
            return Plugin;
    
        })();
    
        /**
         * 插件的私有方法
         */
        privateMethod = function () {
    
        };
    
        /**
         * 这里是将Plugin对象 转为jq插件的形式进行调用
         * 定义一个插件 plugin
         */
        $.fn.plugin = function (options) {
            return this.each(function () {
                var $me = $(this),
                    instance = $me.data('plugin');
                if(!instance){
                    //将实例化后的插件缓存在dom结构里(内存里)
                    $me.data('plugin', new Plugin(this, options));
                }
    
                /**
                 * 优雅处: 如果插件的参数是一个字符串,则 调用 插件的 字符串方法。
                 * 如 $('#id').plugin('doSomething') 则实际调用的是 $('#id).plugin.doSomething();
                 * doSomething是刚才定义的接口。
                 * 这种方法 在 juqery ui 的插件里 很常见。
                 */
                if ($.type(options) === 'string') instance[options]();
            });
        };
    
        /**
         * 插件的默认值
         */
        $.fn.plugin.defaults = {
            property1: 'value',
            property2: 'value'
        };
    
        /**
         * 优雅处: 通过data-xxx 的方式 实例化插件。
         * 这样的话 在页面上就不需要显示调用了。
         * 可以查看bootstrap 里面的JS插件写法
         */
        $(function () {
            return new Plugin($('[data-plugin]'));
        });
    })(JQuery);
    /**
     * Created by hugohua on 14-4-1.
     * zepto plugin template
     */
    
    /**
     * 将插件封装在一个闭包里面,防止外部代码污染  冲突
     */
    (function ($) {
        /**
         * 定义一个插件 Plugin
         */
        var Plugin,
            privateMethod;  //插件的私有方法,也可以看做是插件的工具方法集
    
        /**
         * 这里是插件的主体部分
         * 这里是一个自运行的单例模式。
         * 这里之所以用一个 Plugin 的单例模式 包含一个 Plugin的类,主要是为了封装性,更好的划分代码块
         * 同时 也 方便区分私有方法及公共方法
         * PS:但有时私有方法为了方便还是写在了Plugin类里,这时建议私有方法前加上"_"
         */
        Plugin = (function () {
    
            /**
             * 插件实例化部分,初始化时调用的代码可以放这里
             * @param element 传入jq对象的选择器,如 $("#J_plugin").plugin() ,其中 $("#J_plugin") 即是 element
             * @param options 插件的一些参数神马的
             * @constructor
             */
            function Plugin(element, options) {
                //将插件的默认参数及用户定义的参数合并到一个新的obj里
                this.settings = $.extend({}, $.fn.plugin.defaults, options);
                //将dom jquery对象赋值给插件,方便后续调用
                this.$element = $(element);
                //初始化调用一下
                this.init();
            }
    
            /**
             * 写法一
             * 插件的公共方法,相当于接口函数,用于给外部调用
             */
            Plugin.prototype.doSomething = function () {
                /**
                 * 方法内容
                 */
            };
    
            /**
             * 写法二
             * 将插件所有函数放在prototype的大对象里
             * @type {{}}
             */
            Plugin.prototype = {
    
                init:function(){
    
                },
    
                doSomething2:function(){
    
                }
            };
    
            return Plugin;
    
        })();
    
        /**
         * 插件的私有方法
         */
        privateMethod = function () {
    
        };
    
        /**
         * 这里是将Plugin对象 转为jq插件的形式进行调用
         * 定义一个插件 plugin
         * zepto的data方法与jq的data方法不同
         * 这里的实现方式可参考文章:http://trentrichardson.com/2013/08/20/creating-zepto-plugins-from-jquery-plugins/
         */
        $.fn.plugin = function(options){
            return this.each(function () {
                var $this = $(this),
                    instance = $.fn.plugin.lookup[$this.data('plugin')];
                if (!instance) {
                    //zepto的data方法只能保存字符串,所以用此方法解决一下
                    $.fn.plugin.lookup[++$.fn.plugin.lookup.i] = new Plugin(this,options);
                    $this.data('plugin', $.fn.plugin.lookup.i);
                    instance = $.fn.plugin.lookup[$this.data('plugin')];
                }
    
                if (typeof options === 'string') instance[options]();
            })
        };
    
        $.fn.plugin.lookup = {i: 0};
    
        /**
         * 插件的默认值
         */
        $.fn.plugin.defaults = {
            property1: 'value',
            property2: 'value'
        };
    
        /**
         * 优雅处: 通过data-xxx 的方式 实例化插件。
         * 这样的话 在页面上就不需要显示调用了。
         * 可以查看bootstrap 里面的JS插件写法
         */
        $(function () {
            return new Plugin($('[data-plugin]'));
        });
    })(JQuery);
  • 相关阅读:
    BZOJ5302: [Haoi2018]奇怪的背包
    BZOJ5303: [Haoi2018]反色游戏
    UOJ#217. 【UNR #1】奇怪的线段树(广义线段树性质+上下界最小流)
    Codeforces 702F T-Shirts(平衡树+复杂度分析)
    满足决策单调性的 DP 的通用做法
    JZOJ 6754. 2020.07.18【NOI2020】模拟T3 (树链剖分+分治+闵科夫斯基和)
    JZOJ 6756. 2020.07.21【NOI2020】模拟T2 (搜索有用状态+背包dp)
    JZOJ 6757 2020.07.21【NOI2020】模拟T3 (至少容斥+OGF+NTT)
    线性规划转对偶问题
    GDOI 2020 赛前反思
  • 原文地址:https://www.cnblogs.com/xiaobie123/p/5211497.html
Copyright © 2011-2022 走看看