亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > JavaScript > 正文

jQuery插件開發的五種形態小結

2024-05-06 16:15:57
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了jQuery插件開發的五種形態小結,具體的內容就是解決javascript插件的8種特征,非常的詳細,這里推薦給小伙伴們。
 

關于jQuery插件的開發自己也做了少許研究,自己也寫過多個插件,在自己的團隊了也分享過一次關于插件的課。開始的時候整覺的很復雜的代碼,現在再次看的時候就清晰了許多。這里我把我自己總結出來的東西分享出來,幫助那些和我一樣曾經遇到過同樣問題的人。

我要做什么
我想要得到的javascript 插件應該會有以下幾個特征

代碼相對獨立
鏈式操作
插件可配置
有可操作的方法,插件的生命周期可控制
配置可被緩存
可擴展
無沖突處理
事件代理,動態初始化

* 以下的代碼均假設存在 jQuery

插件的第一形態

面對這種情況,通常我們會通過定義function的方式來實現。

 

復制代碼代碼如下:

function pluginName($selector){
    $.each($selector, function () {
        $(this).css("background-color", "#ccc");
        // to do something...
    });
}
// pluginName(document.getElementsByClassName("demo"));

 

因為我談的是jQuery插件開發,那么我現在把這段代碼擴展到jQuery上,代碼如下:

 

復制代碼代碼如下:

// IIFE(立即調用函數表達式);  [參考 http://suqing.iteye.com/blog/1981591/]
;(function ($) {
    // 擴展這個方法到jQuery.
    // $.extend() 是吧方法擴展到 $ 對象上,和 $.fn.extend 不同。 擴展到 $.fn.xxx 上后,
    // 調用的時候就可以是 $(selector).xxx()
    $.fn.extend({
        // 插件名字
        pluginName: function () {
            // 遍歷匹配元素的集合
            // 注意這里有個"return",作用是把處理后的對象返回,實現鏈式操作
            return this.each(function () {
                // 在這里編寫相應的代碼進行處理
            });
        }
    });
// 傳遞jQuery到內層作用域去, 如果window,document用的多的話, 也可以在這里傳進去.
// })(jQuery, window, document, undefined);
})(jQuery, undefined);
// 調用方式 $(".selector").pluginName().otherMethod();

 

但是還差的遠,目前只解決了兩個問題

代碼相對獨立
鏈式操作

插件可配置
有可操作的方法,插件的生命周期可控制
配置可被緩存
可擴展
無沖突處理
事件代理,動態初始化

插件的第二形態

現在來給插件添加參數支持。代碼如下

 

復制代碼代碼如下:

;(function($){
    $.fn.pluginName = function(options) {
        // 合并參數,通過“extend”合并默認參數和自定義參數
        var args = $.extend({}, $.fn.pluginName.defaults, options);
        return this.each(function() {
            console.log(args.text);
            // to do something...
        });
    };
    // 默認參數
    $.fn.pluginName.defaults = {
        text : "hello"
    };
})(jQuery);
// $(".selector").pluginName({
//     text : "hello world!"
// });

 

添加參數支持還比較容易些,又解決一問題

代碼相對獨立
鏈式操作
插件可配置

有可操作的方法,插件的生命周期可控制
配置可被緩存
可擴展
無沖突處理
事件代理,動態初始化

插件的第三形態

現在來添加方法的支持,我前面所提到的生命周期可控制,意思差不多,例如添加reInit,destory等方法來控制插件。

 

復制代碼代碼如下:

;(function($){
    $.fn.pluginName = function (method) {
        // 如果第一個參數是字符串, 就查找是否存在該方法, 找到就調用; 如果是object對象, 就調用init方法;.
        if (methods[method]) {
            // 如果存在該方法就調用該方法
            // apply 是吧 obj.method(arg1, arg2, arg3) 轉換成 method(obj, [arg1, arg2, arg3]) 的過程.
            // Array.prototype.slice.call(arguments, 1) 是把方法的參數轉換成數組.
            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
        } else if (typeof method === 'object' || !method) {
            // 如果傳進來的參數是"{...}", 就認為是初始化操作.
            return methods.init.apply(this, arguments);
        } else {
            $.error('Method ' + method + ' does not exist on jQuery.pluginName');
        }
    };
    // 不把方法擴展在 $.fn.pluginName 上. 在閉包內建個"methods"來保存方法, 類似共有方法.
    var methods = {
        /**
         * 初始化方法
         * @param _options
         * @return {*}
         */
        init : function (_options) {
            return this.each(function () {
                var $this = $(this);
                var args = $.extend({}, $.fn.pluginName.defaults, _options);
                // ...
            })
        },
        publicMethod : function(){
            private_methods.demoMethod();
        }
    };
    // 私有方法
    function private_methods = {
        demoMethod : function(){}
    }
    // 默認參數
    $.fn.pluginName.defaults = {
    };
})(jQuery);
// 調用方式
// $("div").pluginName({...});  // 初始化
// $("div").pluginName("publicMethod");  // 調用方法

 

又解決一問題

代碼相對獨立
鏈式操作
插件可配置
有可操作的方法,插件的生命周期可控制

配置可被緩存
可擴展
無沖突處理
事件代理,動態初始化

插件的第四形態

第三形態的插件修改就已經可以應對大多數插件的需求了。精益求精嘛,繼續升級。
第四形態的插件是照幫司徒正美的《javascript框架設計》的代碼。加了點面向對象的知識。

 

復制代碼代碼如下:

(function ($) {
    var Plugin = function (element, options) {
        this.element = element;
        this.options = options;
    };
    Plugin.prototype = {
        create: function () {
            console.log(this.element);
            console.log(this.options);
        }
    };
    $.fn.pluginName = function (options) {
        // 合并參數
        return this.each(function () {
            // 在這里編寫相應的代碼進行處理
            var ui = $._data(this, "pluginName");
            // 如果該元素沒有初始化過(可能是新添加的元素), 就初始化它.
            if (!ui) {
                var opts = $.extend(true, {}, $.fn.pluginName.defaults, typeof options === "object" ? options : {});
                ui = new Plugin(this, opts);
                // 緩存插件
                $._data(this, "pluginName", ui);
            }
            // 調用方法
            if (typeof options === "string" && typeof ui[options] == "function") {
                // 執行插件的方法
                ui[options].apply(ui, args);
            }
        });
    };
    $.fn.pluginName.defaults = {};
})(jQuery);
// 調用的方式和之前一樣。

 

這里特別要提下緩存這個東西,插件用多了,覺的這個真的是好東西。
在傳統面向對象的插件開發中,至少會聲明個變量保存它,但是我到目前寫的jQuery插件中都沒有,用起來很麻煩。自從把初始化后的插件緩存起來后,方便了許多。通過代碼$("#target").data("pluginName")就可以取到對象了。 來看看還有什么問題沒有解決

代碼相對獨立
鏈式操作
插件可配置
有可操作的方法,插件的生命周期可控制
配置可被緩存

可擴展
無沖突處理
事件代理,動態初始化

插件的第五形態

看了上面的代碼是否腦子有點暈了,如果是,休息片刻,稍后回來,下面的代碼更精彩。 最后一個方案算是比較全面的了。方案來自Bootstrap,下面代碼以 Bootstrap 的 button 插件為例.

 

復制代碼代碼如下:

!function ($) {
    // ecma262v5 的新東西, 強制使用嚴謹的代碼編寫.
    "use strict";
    // BUTTON PUBLIC CLASS DEFINITION
    // ==============================
    var Button = function (element, options) {
        this.$element = $(element);
        this.options = $.extend({}, Button.DEFAULTS, options);
    };
    Button.DEFAULTS = {
        loadingText: 'loading...'
    };
    Button.prototype.setState = function (state) {
        // ...
    };
    Button.prototype.toggle = function () {
        // ...
    };
    // BUTTON PLUGIN DEFINITION
    // ========================
    var old = $.fn.button; // 這里的 $.fn.button 有可能是之前已經有定義過的插件,在這里做無沖突處理使用。
    $.fn.button = function (option) {
        return this.each(function () {
            var $this = $(this);
            // 判斷是否初始化過的依據
            var data = $this.data('bs.button');
            var options = typeof option == 'object' && option;
            // 如果沒有初始化過, 就初始化它
            if (!data) $this.data('bs.button', (data = new Button(this, options)));
            if (option == 'toggle') data.toggle();
            else if (option) data.setState(option)
        })
    };
    // ① 暴露類名, 可以通過這個為插件做自定義擴展
    $.fn.button.Constructor = Button;
    // 擴展的方式
    // 設置 : $.fn.button.Constructor.newMethod = function(){}
    // 使用 : $btn.button("newMethod");
    // ② 無沖突處理
    $.fn.button.noConflict = function () {
        $.fn.button = old;
        return this
    };
    // ③ 事件代理, 智能初始化
    $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) {
        var $btn = $(e.target);
        // 查找要初始化的對象
        if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn');
        // 直接調用方法, 如果沒有初始化, 內部會先進行初始化
        $btn.button('toggle');
        e.preventDefault();
    });
}(jQuery);

 

來看看還有什么問題沒有解決

代碼相對獨立
鏈式操作
插件可配置
有可操作的方法,插件的生命周期可控制
配置可被緩存
可擴展
無沖突處理
事件代理,動態初始化

補充

現在的插件都要求靈活性要高,比如希望插件可以同時適配jQuery和Zepto,又或者需要支持AMD或者CMD規范。

支持jQuery和Zepto

 

復制代碼代碼如下:

if (window.jQuery || window.Zepto) {
  (function ($) {
      // plugin code...
  })(window.jQuery || window.Zepto);
}

 

中間件支持,node

 

復制代碼代碼如下:

if (typeof(module) !== 'undefined')
{
  module.exports = pluginName;
}
requirejs(AMD) support
if (typeof define === 'function' && define.amd) {
  define([], function () {
      'use strict';
      return pluginName;
  });
}
seajs(CMD) support
if (typeof define === 'function') {
  define([], function () {
      'use strict';
      return pluginName;
  });
}

 

呼~,問題都解決了,代碼若有看不懂的地方可以多看看。后面的幾個看不懂也沒有關系,在實際的開發中,前面幾個夠用了。要強調下,并不是越高級的寫法越好,要看自己項目的需求合理的選擇。

好了,今天的總結就先到這里了,如果大家有更好的插件開發方式,還請告知一下。希望大家能夠喜歡本文。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产一区二区三区在线免费观看| 久久久亚洲国产天美传媒修理工| 中文字幕九色91在线| 久久香蕉国产线看观看av| 国产69久久精品成人看| 国产成人精品免费久久久久| 色悠久久久久综合先锋影音下载| 亚洲人成在线一二| 中文字幕av一区中文字幕天堂| 亚洲va国产va天堂va久久| 高清视频欧美一级| 国产日韩精品在线观看| 国产视频精品va久久久久久| 午夜精品美女自拍福到在线| 97久久精品在线| 国内精品久久久久影院优| 国产一区二区丝袜| 在线播放亚洲激情| 精品国产乱码久久久久久天美| 精品一区二区三区四区| 国产成人精品最新| 欧美巨乳美女视频| 日韩av在线网址| 久久久久www| 国产精品a久久久久久| 亚洲成人免费在线视频| 国产裸体写真av一区二区| 国产精品成人国产乱一区| 国产精品久久久久久久久久久久久久| 91高潮精品免费porn| 97精品一区二区视频在线观看| 在线观看欧美视频| 亚洲午夜精品久久久久久性色| 26uuu另类亚洲欧美日本一| 69视频在线播放| 97av视频在线| 国产精品久久久久久久app| 亚洲自拍偷拍区| 成人欧美在线视频| 欧美成aaa人片免费看| 免费91麻豆精品国产自产在线观看| 最近2019免费中文字幕视频三| 成人网欧美在线视频| 欧美午夜女人视频在线| 国产精品久久久久久久久久免费| 欧美巨猛xxxx猛交黑人97人| 国产狼人综合免费视频| 美乳少妇欧美精品| 国产精品美乳在线观看| 欧美一级大片在线免费观看| 午夜免费日韩视频| 午夜精品久久久久久久男人的天堂| 久久在线免费视频| 国产精品久久久久久亚洲调教| 91av免费观看91av精品在线| 欧美精品精品精品精品免费| 成人写真视频福利网| 欧美高清视频免费观看| 国产精品视频区| 精品国产91久久久| 川上优av一区二区线观看| 奇米一区二区三区四区久久| 亚洲国产精品专区久久| 亚洲精品福利资源站| 日韩中文字幕免费看| 欧美与黑人午夜性猛交久久久| 欧美在线视频在线播放完整版免费观看| 一区二区福利视频| 狠狠色香婷婷久久亚洲精品| 精品无人区太爽高潮在线播放| 欧美日韩国产成人在线观看| 亚洲福利视频网| 日韩av免费观影| 国产91色在线免费| 欧美男插女视频| 91在线视频九色| 日韩hd视频在线观看| 国产日韩精品综合网站| 国产精品久久久久国产a级| 色综合久久久久久中文网| 国产日韩欧美夫妻视频在线观看| 国产一区二中文字幕在线看| 久久夜色精品国产欧美乱| 俺去亚洲欧洲欧美日韩| 久久久av免费| 欧美精品手机在线| 日本高清不卡的在线| 国产精品福利在线观看网址| 正在播放欧美视频| 性色av一区二区三区在线观看| 欧美另类高清videos| 精品久久久久久久中文字幕| 欧美日韩免费在线| 国产精品99一区| 一本色道久久综合亚洲精品小说| 国模精品视频一区二区三区| 午夜精品久久久久久久99热| 欧美国产欧美亚洲国产日韩mv天天看完整| 26uuu日韩精品一区二区| 欧美日韩午夜视频在线观看| 国产欧美久久一区二区| 久久精品青青大伊人av| 久久精品电影一区二区| 日韩电影大片中文字幕| 精品日韩中文字幕| 91精品国产99久久久久久| 一区二区成人精品| 国产欧美在线看| 亚洲成色777777在线观看影院| 国产精品久久综合av爱欲tv| 青青草一区二区| 欧美猛少妇色xxxxx| 久久国产天堂福利天堂| 精品国产精品三级精品av网址| 不卡av日日日| 亚洲影影院av| 亚洲成人久久一区| 成人黄色av播放免费| 日韩av在线天堂网| 亚洲第一页中文字幕| 国内精品久久久久影院优| 91地址最新发布| 日韩视频中文字幕| 亚洲999一在线观看www| www.日韩视频| 成人免费网站在线观看| 国产成人精品日本亚洲| 最近2019中文字幕mv免费看| 日本一区二区在线播放| 久久躁狠狠躁夜夜爽| 超碰日本道色综合久久综合| 亚洲的天堂在线中文字幕| 日韩av电影在线网| 国内精品久久久久伊人av| 久久网福利资源网站| 疯狂蹂躏欧美一区二区精品| 久久精品中文字幕免费mv| 韩国欧美亚洲国产| 狠狠躁夜夜躁人人躁婷婷91| 精品视频在线观看日韩| 98精品在线视频| 国产精品揄拍一区二区| 亚洲区一区二区| 亚洲精品国产拍免费91在线| 国产成人拍精品视频午夜网站| 成人网在线视频| 日韩在线观看免费全| 97在线视频免费看| 国产精品久久久久免费a∨大胸| 欧美日韩综合视频| 久久精品成人一区二区三区| 国产精品普通话| 在线播放精品一区二区三区| 国产热re99久久6国产精品| 欧美激情女人20p| 亚洲偷欧美偷国内偷| 在线观看日韩欧美| 97在线看免费观看视频在线观看| 亚州精品天堂中文字幕| 亚洲网站在线播放| 日本乱人伦a精品| 97在线观看免费高清| 亚洲欧美国产一本综合首页| 国产日韩欧美91|