2009-11-04 14 views
8

私はsetTimeout関数内でjQueryステートメントを使用しようとしていますが、 私はそれを動作させません。setTimeout関数(jQuery)の変数

setTimeout("" + this.$selector + ".val('" + this.savVal + "')", 1); 
:私はこの1つ(setTimeoutを、各関数内で、かつ セレクタがオブジェクトに格納/キャッシュされている、ように$セレクタので、私は 「この」を使用しています)のように、変異体の多くを試してみました

どうすればいいですか?

ありがとうございます!

+3

'setTimeout()'と 'setInterval()'の文字列は廃止されています。代わりに関数を使用する必要があります。 –

答えて

1

使用しようとしている変数がループの各ステップで定義されている場合は、おそらくこのようなことが起こる可能性があります。

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

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

Marco、 "myConfigObj。$ myCachedSelector"が問題のようです。それは "undefined"を返します。私はそれを正確に返される単純な文字列に置き換えました... – north

19

あなたはsetTimeoutをこの構造体を使用呼び出すときに現在のthisのアイテムを保存する必要があります -

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

これは、外側の関数の実行コンテキストからクロージャを作成します。外部関数は、selfパラメータにアクセスする内部関数を返します。タイムアウトが発生したときに呼び出される内部関数ですが、selfの値は元のthisの値に保持されます。

+0

エレガントで、クロージャに精通していない人には少しわかりにくいです。 IEがパラメータを渡していないことがわかったとき、これが最初に気になることではなかったことを馬鹿に感じる。私の言い訳によると、 ".NET Developer"と申します。それは事ですよね? –

0

あなたの答えに感謝します。

私は現在、setTimeoutの内部で関数を使用しています。しかし、実際の問題はどこかにあることがわかりました。各関数では、設定オブジェクト内のプロパティを指すオブジェクトプロパティにアクセスしようとしていますが、結果(たとえば$セレクタの場合)は "未定義" 。

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

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

問題の内容が不明です。両方のオブジェクトは同じ機能/スコープにあります。

7

AnthonyWJonesは素晴らしい答えを出しましたが、もう1つ同様のものがありますが、これはやや読みやすく、読みやすいです。 "this"の値をローカル変数に格納するだけです。

var storedThis = this; 
setTimeout(function() { $selector.val(storedThis.savVal); }, 1); 
関連する問題