2009-11-04 25 views
8

Ich versuche, eine jQuery-Anweisung innerhalb einer setTimeout-Funktion zu verwenden, aber Ich bekomme es nicht zum Funktionieren. Ich habe versucht, viele Varianten, wie dieser (ich bin mit ‚this‘, weil die setTimeout ist innerhalb einer jeweiligen Funktion und der Wähler wird zwischengespeichert/in einem Objekt gespeichert, so dass die $ Selektor):Variablen in einer setTimeout-Funktion (jQuery)

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

Wie muss ich das schreiben?

Danke!

+3

Strings in 'setTimeout()' und 'setInterval()' sind veraltet. Funktionen sollten stattdessen verwendet werden. –

Antwort

1

Sie könnten wahrscheinlich so etwas tun, wenn die Variablen, die Sie verwenden möchten, in jedem Schritt der Schleife definiert sind.

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

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

Marco, "myConfigObj. $ MyCachedSelector" scheint das Problem zu sein. Es gibt "undefined" zurück. Ich ersetzte es durch eine einfache Zeichenfolge, die korrekt zurückgegeben wird ... – north

19

Wenn Sie benötigen die aktuellen this Artikel zu erhalten, wenn SetTimeout diese Struktur verwendet Aufruf: - So entsteht einen Verschluss von dem äußeren Funktionen Ausführungskontext

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

. Die äußere Funktion gibt eine innere Funktion zurück, die auf den Parameter self zugreifen kann. Es ist die innere Funktion, die aufgerufen wird, wenn die Zeitüberschreitung auftritt, aber der Wert von self behält den ursprünglichen Wert this bei.

+0

Elegant, wenn ein bisschen kryptisch zu Menschen, die nicht mit Schließungen vertraut sind. Fühle mich albern, das war nicht das erste, was mir in den Sinn kam, als ich realisierte, dass IE Parameter nicht weitergab. Ich plädiere ".NET-Entwickler" als meine Entschuldigung. Das ist eine Sache, oder? –

0

danke für Ihre Antworten.

Ich verwende jetzt eine Funktion innerhalb der SetTimeout. Aber ich fand heraus, dass das eigentliche Problem an anderer Stelle liegt: In der each-Funktion versuche ich auf Objekteigenschaften zuzugreifen, die auf Eigenschaften innerhalb eines Konfigurationsobjekts verweisen, aber das Ergebnis (zB für dieses. $ Selector) ist "undefiniert" .

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

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

Nicht sicher, was das Problem ist. Beide Objekte haben dieselbe Funktion/denselben Umfang.

7

AnthonyWJones lieferte eine gute Antwort, aber es gibt noch eine ähnliche, die etwas leichter zu schreiben und zu lesen ist. Sie speichern einfach den Wert von "this" in einer lokalen Variablen.

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