SetTimeout et problème de fonction anonyme
C'est mon code, SetOpacity se invoquée par les fausses valeurs, pourquoi?
function SetOpacity(eID, opacity){
eID.style.opacity = opacity / 100;
eID.style.filter = 'alpha(opacity=' + opacity + ')';
}
function fade(eID, startOpacity, endOpacity){
var timer = 0;
if (startOpacity < endOpacity) {
for (var i = startOpacity; i <= endOpacity; i++) {
setTimeout(function() {SetOpacity(eID, i);}, timer * 30);
timer++;
}
}
}
source d'informationauteur ronik
Vous devez vous connecter pour publier un commentaire.
Cela devrait fonctionner:
Cela fonctionne comme suit:
function(...){...}
) et appeler immédiatement avec paramètre (c'est pourquoi il y a des parenthèses autour defunction(){}
de sorte que vous pouvez l'appeler l'ajout de()
à la fin et de passer des paramètres)i
valeur, qui estopacity
à l'intérieur de la fonction) sont locales à cette fonction anonyme, de sorte qu'ils ne changent pas lors des prochaines étapes de la boucle, et vous pouvez safelly passer à une autre fonction anonyme (ce àsetTimeout
)Votre version d'origine n'a pas fonctionné, parce qu':
setTimeout
contient la référence à la variablei
(pas la valeur de celui-ci), et il obtient la valeur lorsque cette fonction est appelée, ce qui n'est pas au moment de l'ajouter àsetTimeout
setTimeout
il obtientendOpacity
valeur (dernière valeur defor
boucle)Malheureusement JavaScript a seulement la fonction de la portée, de sorte qu'il ne fonctionnera pas si vous créer une variable à l'intérieur de la boucle et de leur attribuer de nouvelles valeur réelle, parce que chaque fois qu'il y a quelques
var
à l'intérieur de la fonction, ces variables sont créées au moment de l'exécution de la fonction (et obtenirundefined
valeur par défaut). Le seul moyen (facile) pour créer un nouveau champ d'application est de créer de la fonction (peut être anonyme) et de créer de nouvelles variables à l'intérieur d'eux (les paramètres sont des variables trop)C'est une clôture question. Par le temps d'exécution de la fonction,
i
est déjà àendOpacity
. Ce sera le travail, par la création d'une autre fermeture:Kobi a la bonne idée sur le problème. Je vous suggère d'utiliser un intervalle au lieu de cela, cependant.
Voici un exemple: (Votre SetOpacity fonction reste la même, je l'ai laissée ici.)
C'est suis l'exemple que j'ai utilisé avec jquery. "menuitem" est le itemclass et jquery vérifie la "recentlyOut" classe pour voir si elle a besoin de faire glisser.
Le code parle de lui-même.