2009-11-04 4 views
8

J'essaie d'utiliser une instruction jQuery dans une fonction setTimeout, mais Je n'arrive pas à faire fonctionner. J'ai essayé beaucoup de variantes, comme celui-ci (je suis en utilisant « ceci » parce que le setTimeout est à l'intérieur d'une chaque fonction, et le sélecteur est mis en mémoire cache/stocké dans un objet, donc le sélecteur de $):Variables dans une fonction setTimeout (jQuery)

setTimeout("" + this.$selector + ".val('" + this.savVal + "')", 1); 

Comment dois-je écrire cela?

Merci!

+3

Les chaînes de 'setTimeout()' et 'setInterval()' sont obsolètes. Les fonctions devraient être utilisées à la place. –

Répondre

1

Vous pourriez probablement faire quelque chose comme ceci, si les variables que vous essayez d'utiliser sont définies à chaque étape de la boucle.

var myObj = { 
    $selector: myConfigObj.$myCachedSelector 
} 

$.each([ myObj, mySecondObj, myThirdObj ], function(n, $selector) { 
    setTimeout(function() { 
     $selector.val(saveVal); 
    }, 1); 
}); 
+0

Marco, "myConfigObj. $ MyCachedSelector" semble être le problème. Il renvoie "indéfini". Je l'ai remplacé par une simple ficelle qui est retournée correctement ... – north

19

Lorsque vous avez besoin de préserver l'élément this actuel lorsque vous appelez setTimeout utiliser cette structure: -

setTimeout((function(self) { 
    return function() { $selector.val(self.savVal) }; 
})(this), 1); 

Cela crée une fermeture du contexte d'exécution des fonctions extérieur. La fonction externe renvoie une fonction interne qui aura accès au paramètre self. C'est la fonction interne qui est appelée lorsque le délai d'attente se produit mais la valeur de self conserve la valeur this d'origine.

+0

Élégant si un peu énigmatique aux gens pas familiers avec les fermetures. Sentez-vous bête ce n'était pas la première chose qui me vint à l'esprit quand j'ai réalisé que IE ne passait pas les paramètres. Je plaide ".NET Developer" comme mon excuse. C'est une chose, non? –

0

merci pour vos réponses. J'utilise une fonction dans setTimeout maintenant. Mais j'ai découvert que le vrai problème réside ailleurs: dans chaque fonction j'essaie d'accéder aux propriétés d'objet qui pointent vers des propriétés dans un objet de configuration, mais le résultat (par exemple pour ce $ sélecteur) est "indéfini" .

var myObj = { 
    $selector: myConfigObj.$myCachedSelector 
} 

$.each([ myObj, mySecondObj, myThirdObj ], function() { 
    //code 
});     

Vous ne savez pas quel est le problème. Les deux objets sont dans la même fonction/étendue.

7

AnthonyWJones fournit une bonne réponse, mais il en existe une autre similaire, qui est légèrement plus facile à écrire et à lire. Vous stockez simplement la valeur de "this" dans une variable locale.

var storedThis = this; 
setTimeout(function() { $selector.val(storedThis.savVal); }, 1); 
Questions connexes