2010-12-06 3 views
1

J'ai environ 12 éléments div dans une classe appelée « article »Comment transmettre un paramètre à une fonction lorsque cette fonction est assignée en utilisant observer?

i ont utilisé pour la boucle pour fixer une onClick fonction javascript pour chacun d'eux:

for(var i = 0; i < $$(".item").length; i++){ 
    $$(".item")[i].observe("click", detailPopup); 
} 

donc si je clique sur l'une des les éléments qui sont de classe "item", exécuteront la fonction "detailPopup". Mais je veux passer un paramètre à cette fonction. Plus spécifiquement, je veux que "this"() soit passé.

Comment est-ce que je fais ça ??

Je pense que j'ai fait ma question aussi précise que possible, mais au cas où je ne le ferais pas, faites le moi savoir, et je clarifierai ma question.

MERCI!

+0

Vous voulez passer le courant 'this', comme dans le contexte où cette boucle' for' a fonctionné? .... ou l'élément cliqué lui-même? 'this' devrait déjà se référer à ce que vous voulez dans ce cas, utilisez simplement le mot-clé' this' dans votre fonction 'detailPopup'. –

Répondre

2

Bien que je n'ai pas essayé explicitement moi-même, je crois que vous devriez être en mesure de burn in vos paramètres.

$$('.item').invoke('observe', 'click', detailPopup.curry(this)); 

Une référence à this sera ensuite transmis avant tous les autres paramètres. Votre fonction pourrait ressembler à ce qui suit ...

function detailPopup(parent, event) 
{ 
    ... 

Le sens original de this est conservée pour la portée du gestionnaire, celle de l'élément déclenché. J'ai également utilisé invoke pour éviter tout ce qui déconner avec des valeurs d'index et des fonctions anonymes et d'autres choses.

0

Vous pouvez le faire comme ceci:

for(var i = 0; i < $$(".item").length; i++){ 
    (function(t){ 
     $$(".item")[i].observe("click", function { detailPopup(t); }); 
    })(this); 
} 

la (function(t){ ... })(this); est une fermeture qui garantit que this est le correct ce sinon vous aurez des problèmes de la portée. Ceci est important dans quelques situations, car les boucles en font partie. Si vous n'aviez pas de boucle for, vous auriez pu faire ceci:

$$(".item")[i].observe("click", function { detailPopup(someParameter); }); 
+0

Qu'est-ce que le formulaire '(fonction ...) (paramètre)' appelé? – clockworkgeek

+0

est une fonction auto-exécutable anonyme. Jetez un oeil à http://stackoverflow.com/questions/186024/how-do-you-explain-this-structure-in-javascript la première réponse est correcte. –

1

Vous voudrez créer une fonction anonyme. Au lieu de detailPopup, vous devriez mettre quelque chose comme: function() { detailPopup(that); }

Qu'est-ce que that? Étant donné que la valeur this n'est pas transférée à des fonctions imbriquées, vous devez l'affecter à une variable avant de pouvoir l'utiliser. Exemple: var that = this;

var that = this; 

for(var i = 0; i < $$(".item").length; i++){ 
    $$(".item")[i].observe("click", function() { detailPopup(that); }); 
} 
2

Vous pouvez lier this à la fonction:

for(var i = 0; i < $$(".item").length; i++){ 
    $$(".item")[i].observe("click", detailPopup.bind(this)); 
} 

JSFiddle Example

+0

C'est intelligent. La valeur 'detailPopup' de' this' sera alors son appelant, au lieu de l'élément qui l'a déclenché comme avec les événements normaux. – clockworkgeek

+0

@clockworkgeek: Précisément, les frameworks JavaScript sont capables de le faire via les méthodes Function.apply() et Function.call(). Ces deux fonctions sont plutôt géniales. https://developer.mozilla.org/fr/JavaScript/Reference/Global_Objects/Function – subhaze

Questions connexes