il semble que d'appliquer à tous les autres image au lieu de tous
C'est un signe classique d'itération destructrice.
Considérons ce qui se passe si, comme je le devine, la fonction cvi_instant.add
remplace l'élément nommé pic
par d'autres éléments ou éléments.
getElementsByName
renvoie un NodeList 'live': il est mis à jour chaque fois que vous apportez une modification au DOM. Donc s'il avait cinq éléments avant, après votre appel à cvi_instant.add
il n'en contient plus que quatre: le premier nœud est parti et les nœuds 1-4 sont descendus aux positions 0-3.
Maintenant vous faites de nouveau le tour de la boucle.i++
, donc nous regardons l'élément 1. Mais l'élément 1 est maintenant ce qui était à l'origine l'élément 2! Nous avons sauté l'élément d'origine 1, et nous continuerons à sauter tous les autres éléments jusqu'à ce que nous atteignions la fin de la liste (maintenant deux fois moins longue).
Modifier une liste en même temps que l'itérer provoque ce type de problème. Si le processus à l'intérieur de l'itération ajoute éléments à la liste, vous pouvez même obtenir une boucle infinie!
La solution rapide consiste à répéter la boucle vers l'arrière. Maintenant, vous faites le dernier élément premier, laissant tous les autres éléments dans leur position d'origine et ne provoquant pas skipping:
var e= document.getElementsByName("pic");
for (var i= e.length; i-->0;) {
cvi_instant.add(e[i], { shadow: 75, shade: 10 });
}
Une autre solution simple si vous savez vous allez toujours à retirer l'élément de la liste sur chaque appel est:
var e= document.getElementsByName("pic");
while (e.length>0) {
cvi_instant.add(e[0], { shadow: 75, shade: 10 });
}
la solution la plus générale est nécessaire lorsque votre corps de la boucle peut faire quoi que ce soit à la liste, telles que l'insertion de nouveaux éléments nommés pic
au début du document ou de la suppression d'autres éléments de la milieu . Il est légèrement plus lent mais toujours sûr de faire une copie statique de la liste à partir de:
function Array_fromList(l) {
var a= [];
for (var i= 0; i<l.length; i++)
a.push(l[i]);
return a;
}
var e= Array_fromList(document.getElementsByName("pic"));
for (var i= 0; i<e.length; i++) {
cvi_instant.add(e[i], { shadow: 75, shade: 10 });
}
Je vais faire une réclamation extravagante (et peut-être follement inexacte). C'est parce que ce code (cvi_instant.add) utilise aussi une variable nommée 'i'. Essayez d'appeler votre variable 'k'. –
Cela devrait être inexact. "i" est déclaré avec "var" donc ce n'est pas global, et les nombres ne sont pas passés par référence. Cependant, s'il y avait un autre "i" déclaré globalement, il pourrait y avoir un problème. – Glenn
Essayez d'alerter "i" avant la boucle (par exemple, avec la longueur d'e.length) et dites-nous de quoi il s'agit. En outre, essayez l'extension firebug pour firefox afin que vous puissiez réellement déboguer et parcourir le code. Cela rendra les choses plus claires pour vous. – Glenn