Le problème actuellement sélectionnée réponse est que vous n'êtes pas en train de créer une nouvelle instance du plugin personnalisé pour chaque élément dans le sélecteur, comme vous pensez que vous êtes en train de faire... vous êtes seulement à la création d'une instance unique et passent dans le sélecteur de lui-même que le champ d'application.
La vue de ce violon pour une explication plus approfondie.
Au lieu de cela, vous aurez besoin d'une boucle sur le sélecteur à l'aide de jQuery.chaque et instancier une nouvelle instance du plugin personnalisé pour chaque élément dans le sélecteur.
Voici comment:
(function($) {
var CustomPlugin = function($el, options) {
this._defaults = {
randomizer: Math.random()
};
this._options = $.extend(true, {}, this._defaults, options);
this.options = function(options) {
return (options) ?
$.extend(true, this._options, options) :
this._options;
};
this.move = function() {
$el.css('margin-left', this._options.randomizer * 100);
};
};
$.fn.customPlugin = function(methodOrOptions) {
var method = (typeof methodOrOptions === 'string') ? methodOrOptions : undefined;
if (method) {
var customPlugins = [];
function getCustomPlugin() {
var $el = $(this);
var customPlugin = $el.data('customPlugin');
customPlugins.push(customPlugin);
}
this.each(getCustomPlugin);
var args = (arguments.length > 1) ? Array.prototype.slice.call(arguments, 1) : undefined;
var results = [];
function applyMethod(index) {
var customPlugin = customPlugins[index];
if (!customPlugin) {
console.warn('$.customPlugin not instantiated yet');
console.info(this);
results.push(undefined);
return;
}
if (typeof customPlugin[method] === 'function') {
var result = customPlugin[method].apply(customPlugin, args);
results.push(result);
} else {
console.warn('Method \'' + method + '\' not defined in $.customPlugin');
}
}
this.each(applyMethod);
return (results.length > 1) ? results : results[0];
} else {
var options = (typeof methodOrOptions === 'object') ? methodOrOptions : undefined;
function init() {
var $el = $(this);
var customPlugin = new CustomPlugin($el, options);
$el.data('customPlugin', customPlugin);
}
return this.each(init);
}
};
})(jQuery);
Et un travail de violon.
Vous noterez que dans le premier violon, tous les divs sont toujours déplacé vers la droite le même nombre de pixels. C'est parce que seulement un objet d'options existe pour tous les éléments dans le sélecteur.
À l'aide de la technique de l'écrit ci-dessus, vous remarquerez que dans le second fiddle, chaque div n'est pas aligné et se déplace aléatoirement (à l'exclusion de la première div comme c'est aléatoire est toujours la valeur 1 sur la ligne 89). C'est parce que nous sommes désormais correctement l'instanciation d'un nouveau plugin personnalisé instance pour chaque élément dans le sélecteur. Chaque élément a ses propres options de l'objet et n'est pas enregistré dans le sélecteur, mais dans l'instance du plugin personnalisé lui-même.
Cela signifie que vous serez en mesure d'accéder aux méthodes de l'plugin personnalisé instancié sur un élément spécifique dans les DOM à partir de nouveaux sélecteurs jQuery et ne sont pas obligés de les mettre en cache, que vous seriez dans le premier violon.
Par exemple, ce serait de retourner un tableau de toutes les options des objets à l'aide de la technique dans le second violon. Il serait de retour indéfini dans la première.
$('div').customPlugin();
$('div').customPlugin('options'); // would return an array of all options objects
C'est de cette façon que vous auriez pour accéder aux options de l'objet dans le premier violon, et ne renvoie qu'un seul objet, pas un tableau d'entre eux:
var divs = $('div').customPlugin();
divs.customPlugin('options'); // would return a single options object
$('div').customPlugin('options');
// would return undefined, since it's not a cached selector
Je vous suggère en utilisant la technique ci-dessus, et non pas celui de la réponse choisie.