2009-11-04 14 views
8

Próbuję użyć instrukcji jQuery wewnątrz funkcji setTimeout, ale Nie działa. Próbowałem wiele wariantów, jak ten (jestem używając „to” bo setTimeout jest wewnątrz każdej funkcji i selektor jest buforowane/przechowywane w obiekcie, tak więc selektora $):Zmienne w funkcji setTimeout (jQuery)

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

Jak muszę to napisać?

Dzięki!

+3

Łańcuchy w 'setTimeout()' i 'setInterval()' są przestarzałe. Zamiast tego należy użyć funkcji. –

Odpowiedz

1

Prawdopodobnie możesz zrobić coś takiego, jeśli zmienne, które próbujesz użyć, są zdefiniowane w każdym kroku pętli.

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

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

Marco, "myConfigObj. $ MyCachedSelector" wydaje się być problemem. Zwraca "niezdefiniowany". Zastąpiłem go prostym łańcuchem, który jest zwracany poprawnie ... – north

19

Kiedy trzeba zachować obecną pozycję this Dzwoniąc setTimeout używać tej struktury: -

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

To tworzy zamknięcie z zewnętrznego kontekstu wykonania funkcji. Funkcja zewnętrzna zwraca wewnętrzną funkcję, która będzie miała dostęp do parametru self. Jest to funkcja wewnętrzna wywoływana po przekroczeniu limitu czasu, ale wartość self zachowuje pierwotną wartość this.

+0

Elegancki, jeśli nieco tajemniczy dla osób nieznających zamknięć. Poczuj się głupio, to nie pierwsza rzecz, która przyszła mi do głowy, gdy zdałem sobie sprawę, że IE nie przekazuje parametrów. Błagam ". Developer Developer" jako moją wymówkę. To jest coś, prawda? –

0

dzięki za odpowiedzi.

Używam teraz funkcji wewnątrz setTimeout. Ale odkryłem, że prawdziwy problem leży gdzie indziej: w każdej funkcji próbuję uzyskać dostęp do właściwości obiektu, które wskazują właściwości w obiekcie konfiguracyjnym, ale wynik (na przykład dla tego. Selektora $) jest "niezdefiniowany" .

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

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

Nie jestem pewien, na czym polega problem. Oba obiekty mają tę samą funkcję/zakres.

7

AnthonyWJones stanowiło świetną odpowiedź, ale jest jeszcze jedna podobna, która jest nieco łatwiejsza do napisania i przeczytania. Po prostu przechowujesz wartość "this" w zmiennej lokalnej.

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