2009-07-20 12 views
1

Tout d'abord, je sais que c'est un problème de base de JS, pas de jQuery. Je suis à ce point d'apprentissage où je n'arrive pas à me concentrer complètement sur certaines questions de portée. J'ai donc besoin d'explications.Options du plugin jQuery

J'ai lu tous les articles/tutoriels que je peux trouver, mais j'ai juste besoin de quelques réponses. J'ai mis en place ce code de base pour expérimenter (comme le code actuel est beaucoup trop gros pour être publié ici). Dans l'expérience suivante, lorsque le bouton selector1-change est cliqué, la variable 'cmd' s'affiche correctement, mais la référence à this.options est 'non définie', car il s'agit d'une instance différente de MySelector(), sauf si Je suis loin.

Alors, comment peut-on appeler une instance d'un objet comme celui-ci.

Exemple:.

Vous pouvez utiliser la boîte de dialogue de jQueryUI en créant, puis plus tard, vous pouvez passer des commandes comme à $ (« # mydiv ») de dialogue (« fermer »); et qui accèdera à l'instance attachée à cet élément. Comment cela est-il accompli?

JQUERY_MYSELECTOR.JS

(function($){ 
    $.fn.MySelector = function(incoming) { 

     if (typeof(incoming) != 'object') { 
      return runCommand(incoming); 
     } 

     var options = $.extend({},{ 
      id: false, 
      backgroundColor: false 
     },incoming); 

     function runCommand(cmd) { 
      alert('blah:'+this.options.backgroundColor+"\n"+'cmd:'+cmd); 
     } 
    } 
})(jQuery); 

SCRIPT

<script type="text/javascript" src="jquery_myselector.js"></script> 
<script type="text/javascript"> 
    $j(document).ready(function() { 
     $j('#selector1).MySelector({ backgroundColor: '#000000' }); 
     $j('#selector1-change').click(function() { 
      $j('#selector1').MySelector('mooocow'); 
     }); 
    }); 
</script> 

STYLE

<input type="button" value="selector1" id="selector1" /> 
<br/> 
<input type="button" value="selector1-change" id="selector1-change" /> 

MISE À JOUR oublié d'utiliser le plugin sur sélecteur1 (duh)

Répondre

2

Vous appelez runCommand avant d'attribuer une valeur à options - options a la valeur undefined dans le corps de runCommand. Ne me demandez pas comment JS est capable de voir le corps de runCommand avant de le déclarer, mais il le peut.

De même, au premier niveau de MySelector, this est lié aux résultats de l'exécution $j('#selector1-change'), qui est un tableau. Vous aurez besoin d'itérer ce tableau.

Essayez quelque chose comme ceci:

 
(function($){ 
    function runCommand(e, cmd) { 
     alert('blah:'+ e.options.backgroundColor+"\n"+'cmd:'+cmd); 
    } 

    $.fn.MySelector = function(incoming) { 
     this.each(function() { 
      if (typeof(incoming) != 'object') { 
       return runCommand(this, incoming); 
      } else { 
       this.options = $.extend(this.options || { 
        id: false, 
        backgroundColor: false 
       },incoming);  
      } 
     }); 
    } 
})(jQuery); 
+0

Ok, je comprends ce que vous dites itérer le tableau. Je vais réparer ça. Mais l'appel de runCommand est supposé être _after_ le plugin a été exécuté la première fois. Doit être apprécié lorsque vous exécutez $ ('# myDiv'). Dialog(); (à partir de jQueryUI) .. et plus tard, vous pouvez exécuter $ ('# myDiv'). dialog ('close'); Une fois le plugin "attaché" à un élément DOM, vous pouvez lui envoyer des commandes. Beaucoup de plugins accomplissent ceci, mais je ne peux pas comprendre comment. – Spot

+0

J'ai changé mon code pour qu'il se comporte de manière plus dynamique. Maintenant, je comprends pourquoi vous vouliez utiliser 'this.options'. En itérant avec 'each', la fonction callback peut accéder à l'item en cours avec' this'. Vous pouvez l'utiliser avec 'runCommand', mais vous devez également stocker les options sur l'élément DOM, comme le fait ce code. –

+0

Merci beaucoup. – Spot

0

options a été déclaré à la déclaration var dans le votre champ principal, vous n'avez pas besoin d'utiliser le mot-clé this dans votre fonction ExécuterCommande, puisque dans cette fonction vous avez accès à la fermeture extérieure:

function runCommand(cmd) { 
     alert('blah:'+options.backgroundColor+"\n"+'cmd:'+cmd); 
    } 
+0

a essayé déjà. Si vous n'utilisez pas 'ceci', Firebug lance une erreur 'impossible d'accéder à la fermeture optimisée'. – Spot

1

vous pouvez essayer quelque chose comme ceci:

(function($){ 
    $.myPlugin = { 
     foo: function() {...}, 
     bar: function() {...}, 
     foobar: function() {...} 
    }; 

    $.fn.MySelector = function (operation) { 
     if (typeof operation === 'string') { 
      switch(operation) { 
       'open': 
        $.myPlugin.foo(); 
        break; 
       'destroy': 
        $.myPlugin.bar(); 
        break; 
       default: 
        $.myPlugin.foobar(); 
        break; 
      } 
     } 
    } 
}(jQuery)); 
+0

Je ne cherche pas ça. Je veux être capable de l'utiliser plusieurs fois sur la même page avec différentes piles d'options, mais je veux aussi pouvoir passer des commandes. À ce stade, lorsque j'essaie de passer des commandes, il crée une nouvelle instance de la fonction. – Spot

+0

Vous aurez différentes options pile pour chaque appel car vous étendez 'options' avec l'objet' incoming' passé. Quel genre de commandes essayez-vous de transmettre qui ne fonctionne pas comme prévu? – RaYell

+0

L'appel de runCommand est supposé être après l'exécution du plugin la première fois. Un peu comme quand vous lancez $ ('# myDiv'). Dialog(); (à partir de jQueryUI) .. et plus tard, vous pouvez exécuter $ ('# myDiv'). dialog ('close'); Une fois le plugin "attaché" à un élément DOM, vous pouvez lui envoyer des commandes. Beaucoup de plugins accomplissent ceci, mais je ne peux pas comprendre comment. – Spot