2011-09-02 4 views
1

Je suis en train d'attacher une fonction .change() dynamique à une liste d'éléments:Ajouter une fonction dynamique à un élément en utilisant jQuery

els = new Array('#element1','#element2'); 

for (i=1; i < 3; i++){ 
    $(els[i]).change(function(){ 
     alert(i); 
    }); 
} 

Cela ne fonctionne pas comme on le souhaite, car i n'est pas passé dans la fonction, mais est toujours égal à la dernière itération, c'est à dire, 2. Comment puis-je passer une valeur dans le change(function{})?

+1

Jetez un oeil à http://blog.morrisjohns.com/javascript_closures_for_dummies.html –

Répondre

1

Deux façons de le faire.

Utilisez $.each

var element_array = new Array('#element1','#element2'); 

$.each(element_array, function(index, value){ 
    $(value).change(function(){ 
     alert(index); 
    }); 
}); 

Créer une fermeture.

var element_array = new Array('#element1','#element2'); 

for (i = 0; i < element_array.length; i++){ 
    (function(i){ 
     $(element_array[i]).change(function(){ 
      alert(i); 
     }); 
    })(i); 
} 
+0

+1 pour 'each' ... –

+0

En regardant ces réponses, il y a quelques bonnes informations. J'aime la solution eventData de RamenRecon mais pour une raison quelconque, je préfère la méthode .each(). À votre santé. – Owen

2

Toutes vos fonctions générées se réfèrent à la même variable: i. Cette variable change par la suite lorsque la boucle continue, de sorte qu'au moment où l'événement de changement se déclenche, i est défini sur 2.

Vous devez créer une portée locale qui stocke la valeur de i au moment de votre fonction est en cours de création:

els = new Array('#element1','#element2'); 

for (i=1; i < 3; i++){ 
    (function(i){ 
     $(els[i]).change(function(){ 
      alert(i); 
     }); 
    })(i); 
} 
2

événements jQuery peuvent prendre EventData dans le signiture et passer comme arguments à votre fonction de rappel . A partir de docs jQuery:

.change([eventData], handler(eventObject)) 

Ce que vous voulez est ce (j'ai changé le nom de arg pour le garder évident):

for (i=1; i < 3; i++){ 
    $(els[i]).change({index: i}, function(event){ 
     alert(event.data.index); 
    }); 
} 
+2

Je pense qu'il doit être 'alert (event.data.index);'. –

+0

Merci, Félix. J'ai oublié ça. –

0

Avez-vous essayé quelque chose comme ça:

els = new Array ('# element1', '# element2');

for (i=1; i < 3; i++){ $(els[i]).bind('change', function(){ alert(i); }); }

Lorsque vous chargez la page, jQuery ne connaît pas les valeurs du tableau et il est comme une chaîne.

+0

.change est un raccourci pour .bind ('change', ... Ils sont essentiellement les mêmes, ce n'est pas le problème. –

Questions connexes