8

テーブルのセルを反復処理しているときに、jquery .removeClass 呼び出しの間に遅延を追加しようとしています。セルは setTimeout なしで適切に表示されますが、setTimeout を使用するとコードが壊れます。私は何を間違っていますか?

function reveal_board() {
$("td").each(function() {
    var t=setTimeout('$(this).removeClass("invisible")', 500);
});
}
4

4 に答える 4

26

これを試して:

function reveal_board() {
    $("div").each(function(index) {        
        (function(that, i) { 
            var t = setTimeout(function() { 
                $(that).removeClass("invisible"); 
            }, 500 * i);
        })(this, index);
    });
}

一般に、文字列を渡すのは悪い習慣setTimeout()です。また、そのように使用する場合、変数を渡すことはできないと思います。

thatまた、常に適切な要素に適用され、置き換えられないようにするために、クロージャーでラップしました。

ただし、NiftyDude が言うように、インデックスを渡し、それを使用して各要素を順番に表示したい場合があります。

実例 - http://jsfiddle.net/Cc5sG/

編集

閉鎖は必要ないようです:

function reveal_board() {
    $("div").each(function(index) {        
        var that = this;
        var t = setTimeout(function() { 
            $(that).removeClass("invisible"); 
        }, 500 * index);        
    });
}

http://jsfiddle.net/Cc5sG/1/

于 2012-05-16T08:20:39.847 に答える
2

あなたthisはグローバルを指していwindowます。

function reveal_board() {
  $("td").each(function() {
    $this = $(this);
    var t=setTimeout(function(){$this.removeClass("invisible");}, 500);
  });
}
于 2012-05-16T08:20:25.177 に答える
1

まあ、私は同じ問題を抱えていて、そのように解決しました...しかし、パフォーマンスなどについてはわかりません。非常に短いループ(最大10要素)で使用しましたが、完全に機能しました...クラスを追加するために使用した方法なので、クラスを削除するために何が得られるかを理解させます;)。

var elements = $(".elements");
var timeout;

elements.each(function(e){
    timeout = setTimeout(function(index) {
       elements[elements.length-e-1].setAttribute('class', elements[elements.length-e-1].getAttribute('class')+' MY-NEW-CLASS');
    }, 500 * e);
});
于 2016-04-08T12:22:17.270 に答える
1

まず最初に、 の最初の引数に文字列を使用しないようにします。setTimeout代わりに anon 関数を使用すると、デバッグと保守が容易になります。

$("td").each(function() {
    var $this = $(this);
    var t=setTimeout(function() {
       $this.removeClass("invisible")
    }, 500);
});

また、ここで何を達成しようとしているのかはよくわかりませんが(後で質問を更新して、回答を調整します)、 500ミリ秒invisibleごとにクラスをtd次々に削除したい場合は、次を使用できますindex

$("td").each(function() {
    var $this = $(this);
    var t=setTimeout(function(index) {
       $this.removeClass("invisible")
    }, 500 * (index+1));
});
于 2012-05-16T08:20:24.660 に答える