2012-01-10 17 views
3

次のコードは正しく動作しません。私はさまざまなバリエーションを試しました&どこでも幸運を検索します。jQuery内のsetTimeout()に関する問題。

i = 1; 
var timer = new Array(); 
jQuery('a').each(function($) { 
    i++; 
    timer[i] = setTimeout(jQuery(this).remove(), i * 5000) 
}) 
+6

を持つ要素を削除し、次のコードは正しく動作しません。*あなたはそれが何をしたいですか?あなたの問題は 'jQuery(this).remove()'をすぐに呼び出すことだと思います。 –

+1

また、 'each'に渡される最初の引数は、実際には選択された要素のセット内のDOM要素のインデックスです。つまり、別のカウンタを維持する必要はありません。 [ドキュメントの詳細情報](http://api.jquery.com/each/) –

答えて

8

ラップ*機能

i = 1; 
var timer = new Array(); 
jQuery('a').each(function($) { 
    i++; 
    var thiz = jQuery(this); 
    timer[i] = setTimeout(function() { thiz.remove(); }, i * 5000); 
}) 
+0

完璧、ありがとう。 –

-1

setTimeout javascriptのステートメントではないjQuery(this).remove()の戻り値を受け入れる:P はthis link

あなたができるだけfunction(){stuff}ではなく、あなたはそれがしたいときjQuery(this)が処理されるかどうかわからを参照してください。

0

試してみてください。

<html> 
<body> 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script> 
<a href="#">a</a> 
<a href="#">a</a> 
<a href="#">a</a> 
<a href="#">a</a> 
<a href="#">a</a> 
<a href="#">a</a> 
<script> 
i = 1; 
var timer = new Array(); 
    jQuery('a').each(function($) { 
    i++; 
    timer[i] = setTimeout(jQuery.proxy(function(){jQuery(this).remove();},this), i * 500); 
}) 
</script> 
</body> 
</html> 
3

はフェリックスは、すでにコメントで問題を示唆しているが、私は拡大していきます。

timer[i] = setTimeout(jQuery(this).remove(), i * 5000) 

あなたの問題は、jQuery(this).remove()を起動し、あなたのsetTimeoutに本の戻り値を渡しているという事実にあります。時間切れが切れると、これが実行されることを前提としています。そのような場合は、これを関数にラップする必要があります。この関数はsetTimeoutに渡され、タイマーの期限が切れると実行されます。

var $el = jQuery(this); 

timer[i] = setTimeout(function(){ 
    $el.remove() 
}, i * 5000) 
4

setTimeout(またはsetInterval)への最初のパラメータは、関数への参照にする必要がある(または文字列がありますが、文字列の構文を使用する必要はありません)。

関数をパラメータとして渡す代わりに、関数を呼び出してその結果を渡します。あなたは括弧を削除する場合は、関数への参照を渡します:

timer[i] = setTimeout(jQuery(this).remove, i * 5000) 

しかし、その後、あなたはthis関数が実際に実行される時には間違ったことであることに問題が起動します。このような何かを試してみてください:

var i = 1, 
    timer = []; 
jQuery('a').each(function($) { 
    i++; 
    var $this = jQuery(this); 
    timer[i] = setTimeout(function() {$this.remove();}, i * 5000) 
}) 

これはクロージャsetTimeoutに渡された匿名関数がで$this関数が宣言されていても、それが実行された時点で$this変数へのアクセス権を持っているということで仕事のやり方を利用していますそれまでに実行を終了します。

[]で配列を宣言する方が、new Array()よりも良いことに注意してください。

iを1に初期化してから、使用する前にインクリメントして、配列に追加する最初の要素がtimer[2]になるように注意してください。おそらく、0に初期化してから、各タイマーを設定した後に増分する必要があります。