2010-08-19 5 views
0

J'insère dynamiquement du code html dans le document (en utilisant obj.innerHTML + = 'some html'). Dans ce html, il y a des images avec des identifiants 'imageId_X' (ie imageId_1, imageId_2 ...). Cela fonctionne très bien, mais il y a quelque chose de mal avec le code suivant:bizarre problème javascript

for (var n = 0; n < pConfig.images.length; n++) 
    { 
     document.getElementById('imageId_' + n).onclick = function() 
     { 
      alert(n); 
     } 
    } 

Il y a 4 éléments dans les pConfig.images et d'alerte (n) avertit toujours 4. Pourquoi est-ce qui se passe, ce que je fais mal?

+0

À part le problème de boucle de fermeture: ** n'utilisez pas ** innerHTML + = '. Cela implique de sérialiser le contenu DOM existant de l'élément dans une chaîne HTML, de l'ajouter à la chaîne, puis de tout réécrire dans de nouveaux objets DOM. Cette opération est lente et perd toute information non sérialisable dans le processus, y compris les valeurs de champ de formulaire, les références JavaScript ou les gestionnaires d'événements. – bobince

Répondre

0

Le problème est que chaque fonction que vous créez a une référence à la même variable n - celle qui est incrémentée. À la fin de la boucle, il est à 4 - et toutes les fonctions que vous avez faites se réfèrent à cette variable avec cette valeur.

Vous pouvez travailler autour d'elle avec une fermeture, .: par exemple

function closure(n) { 
    return function() {alert(n);} 
} 

for (var n = 0; n < pConfig.images.length; n++) 
{ 
    document.getElementById('imageId_' + n).onclick = closure(n); 
} 
+0

Merci, cela fonctionne –

3

La cause de votre problème est l'expression de lamba dans votre code. Lorsque vous définissez votre fonction anonyme en tant que gestionnaire onclick, vous la liez pour la variable externe n, qui à la fin de la boucle est toujours 4 pour la raison pour laquelle vous l'obtenez toujours 4. Pour le faire comme vous l'avez prévu pour effectuer les opérations suivantes:

for (var n = 0; n < pConfig.images.length; n++) 
{ 
    function(n) { 
     document.getElementById('imageId_' + n).onclick = function() 
     { 
     alert(n); 
     } 
    }(n); 
} 

Par conséquent, vous définissez une étendue distincte pour la variable.

+0

Merci pour votre aide –