2010-11-05 16 views
1

J'ai un plugin JQuery 1.4.2, qui utilise un ensemble d'options. Il est un code pseudo est comme ceci:Pourquoi mon plugin JQuery ne possède-t-il pas sa propre instance?

(function($) { 
    // Shell for the plugin code 
    $.fn.myPlugIn = function(options) { 
    // Plugin code 
    return this.each(function() { 
     // for each item in selector 
     options = $.extend($.fn.myPlugIn.defaults, options); 
     ...do stuff 
    }); 
    $.fn.myPlugIn.defaults = { 
    header  : null, 
    position : 'absolute', 
    top   : null, 
    left  : null, 
    forinput : null, 
    forAnchor : null, 
    sAjaxSource : null, 
    onClick  : null 
    }; 
    })(jQuery); 

Lorsque vous appelez le plug-in pour plusieurs éléments sur une seule page, les options ne sont pas uniques - les options précédentes éléments sont encore dans les options.

$(document).ready(function() { 
    $("#div1").myPlugIn(
      {forinput: "input1", 
      onClick: function(data){ 
       ... do stuff 
      }, 
    }); 
    $("#div2").myPlugIn({ 
      forAnchor: "link1", 
      onClick: function(data){ 
       ... do stuff 
      }, 
     header: "Parts" 
    }); 

}); 

Qu'est-ce que je fais mal? Je m'attendais à ce que chaque fois que le plugin a été trouvé, il utiliserait les options qui lui sont passées. Au lieu de cela, il utilise toutes les options de la première instance et écrase toutes les propriétés ré-initialisées de la seconde instance.

Toutes les réponses sont appréciées. Merci d'avance pour lire mon message.

Répondre

4

Vous devez fusionner les options dans un nouvel objet pour cette instance, comme ceci:

options = $.extend({}, $.fn.myPlugIn.defaults, options); 

$.extend() se fond dans le premier argument tous les objets passés en tant que paramètres après que, si actuellement ils sont la fusion dans vos paramètres par défaut $.fn.myPlugIn.defaults, le laissant teinté pour la prochaine utilisation. Au lieu de cela, vous ne voulez jamais jouer avec les valeurs par défaut (à moins de les changer intentionnellement ailleurs) et fusionner les options et les valeurs par défaut dans un autre nouvel objet.

1

deuxième chose serait d'ajouter 'var options = ...', en omettant var rend variable globale, ces options de réglage pour durer les attributs appelés.

+0

Ce ne sera pas une variable globale ici, puisqu'il s'agit d'un paramètre de la fonction. –

+0

Merci pour les réponses! – Griff