這篇文章記錄一下自已喜歡用的jquery plugin寫作方式。
初學者建議讀一下這篇: http://learn.jquery.com/plugins/
外掛功能
- 保持jQuery物件鏈結 (非常重要)
- 提供公有方法(有時候在init plugin之後,可能會需要公有方法能變更plugin的行為或屬性)
- 提供預設的參數設定
- 儲存產生plugin 物件的參考 (基於第二個方法)
方法一: 類似bootstrap的解法
最後參考這篇 Things I learnt creating a jQuery Plugin (Part I),作者也基於這個寫作方式,寫了一個bootstrap的tagger外掛: https://github.com/acanimal/tagger.js
;(function($) { //define plugin name var pluginName = 'jqueryPlugin'; //create plugin class function Plugin (element,options){ this.el = element; this.$el = $(element); this.options = $.extend({}, $.fn[pluginName].defaults, options); //constrctor this.init(); return this; }; Plugin.prototype.name = pluginName; Plugin.prototype.version = '0.0.1'; Plugin.prototype = { init : function(){ var plugin = this; }, /** * The 'destroy' method is were you free the resources used by your plugin: * references, unregister listeners, etc. * * Remember to unbind for your event: * * @example * this.$someSubElement.off('.' + pluginName); * * Above example will remove any listener from your plugin for on the given * element. */ destroy: function() { // Remove any attached data from your plugin this.$el.removeData(); }, /** * Write public methods within the plugin's prototype. They can * be called with: * * @example * $('#element').jqueryPlugin('somePublicMethod','Arguments', 'Here', 1001); * * @param {[type]} foo [some parameter] * @param {[type]} bar [some other parameter] * @return {[type]} */ pubMethod : function(){ } } /** * This is a real private method. A plugin instance has access to it * @return {[type]} */ var privateMethod = function() { console.log("privateMethod"); console.log(this); }; // Plugin wrapper around the constructor, $.fn[pluginName] = function(options) { var args = arguments; if (options === undefined || typeof options === 'object') { // Create a plugin instance for each selected element. return this.each(function() { if (!$.data(this, 'plugin_' + pluginName)) { $.data(this, 'plugin_' + pluginName, new Plugin(this, options)); } }); } else if (typeof options === 'string' && options[0] !== '_' && options !== 'init') { // Call a pluguin method for each selected element. if (Array.prototype.slice.call(args, 1).length == 0 && $.inArray(options, $.fn[pluginName].getters) != -1) { // If the user does not pass any arguments and the method allows to // work as a getter then break the chainability var instance = $.data(this[0], 'plugin_' + pluginName); return instance[options].apply(instance, Array.prototype.slice.call(args, 1)); } else { // Invoke the speficied method on each selected element return this.each(function() { var instance = $.data(this, 'plugin_' + pluginName); if (instance instanceof Plugin && typeof instance[options] === 'function') { instance[options].apply(instance, Array.prototype.slice.call(args, 1)); } }); } } } /** * Names of the pluguin methods that can act as a getter method. * @type {Array} */ $.fn[pluginName].getters = ['pubMethod']; /** * Default options */ $.fn[pluginName].defaults = { defaultOption: "I'm a default option" }; })(jQuery);
方法二: jQuery Widget
使用jQuery UI 提供的widget factory,如果有引用jquery UI lib的話,直接套用這個是蠻快速的
Reference:
The Ultimate Guide to Writing jQuery PluginsAn Improved Version of the jQuery Plugin Template
Things I learnt creating a jQuery Plugin (Part I)
沒有留言:
張貼留言
留個話吧:)