jQuery plugin boilerplate
Bonjour à tous, je vous présente ici le modèle que j'utilise pour concevoir mes plugins jQuery.
Je me suis inspiré de plusieurs modèles différents mais notamment de http://stefangabos.ro/jquery/jquery-...ate-revisited/ que j'ai tout de même bien modifié, principalement sur la façon d'appeller les méthodes publiques.
Boilerplate
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| (function($) {
// Static private vars
var pluginName = 'boilerplate',
pStatic = {
// Static public vars
foo: 'bar'
};
$[pluginName] = function(element, options) {
// Private vars
var
plugin = this,
$element = $(element),
element = element,
defaults = {
foo: 'bar',
onFoo: function() {}
},
// Private methods
privateMethod = function() {
// code goes here
};
// Public methods
plugin.methods = {
init: function() {
plugin.settings = $.extend({}, defaults, options);
// code goes here
},
publicMethod: function() {
// code goes here
}
};
// Public vars
plugin.settings = {};
plugin.static = pStatic;
plugin.methods.init();
}
$.fn[pluginName] = function(options) {
var args = arguments;
return this.each(function() {
var i = $(this);
if (undefined == (plugin = i.data(pluginName))) {
var plugin = new $[pluginName](this, options);
i.data(pluginName, plugin);
} else if (plugin.methods[options]) {
plugin.methods[options].apply( plugin, Array.prototype.slice.call( args, 1 ));
}
});
}
})(jQuery); |
Usage
Code:
1 2 3 4 5
| // init
$(element).boilerplate({foo:'bar'});
// call publicMethod
$(element).boilerplate('publicMethod', param1, param2); |
Ce modèle a été aussi conçu comme un "pense bête", regroupant quelques idées dans le but de m'en rappeler au besoin mais que je commence en général par supprimer. Je pense par exemple à l'objet pStatic dont je ne me sert jamais ou la private var element.
On peut aussi vouloir passer la méthode init en private, rien de compliquer à ça mais par défaut je l'ai laissé en public.
Si vous avez des remarques, questions ou autre je suis à l'écoute ;)