0

次のsetTimeoutsを機能させるのに問題があります。

$('a').click(function(){
    if( last ) {
        if( ($(this).attr('id') == last.attr('id')) ) {
            setTimeout( function(){ 
                $(this).parent().parent().css('visibility','hidden'); 
            },500); 
            setTimeout( function(){ 
                last.parent().parent().css('visibility','hidden'); 
            },500); 
            found++; 
        } 
        if (found == 3) { 
            alert('You won a sticker!'); 
            window.location.href = "#play2"; 
            location.reload(); //resets found to 0 
        } last = null; 
    } 
    else { 
        last = $(this) 
    } 
});

setTimeout内の関数は、問題がないように機能します。構文に何か問題があるのではないかと思います。しかし、私はそれについて何も悪いことを見つけることができません。

4

4 に答える 4

3

最初にsetTimeout this === window。おそらくクロージャを作成したいと思うでしょう

var that = this
setTimeout( function(){
    $(that).parent().parent().css('visibility','hidden');
 },500);
于 2012-07-09T00:34:41.137 に答える
1

setTimeout()構文に問題はありません。問題は、関数内がその関数の呼び出し方法に応じて設定され、それthisを介して関数を呼び出すと、クリックイベントのDOM要素ではなくなることです。渡した関数の外部でその参照を保持できます。これにより、2回選択する手間を省くことができます(保存した参照を関数とステートメントの両方で使用する場合)。2番目は関数の外部からの参照をすでに使用しているため、問題はありません。setTimeout()thissetTimeout()$(this)ifsetTimeout()

    var $this = $(this);
    if( ($this.attr('id') == last.attr('id')) ) {
        setTimeout( function(){ 
            $this.parent().parent().css('visibility','hidden'); 
        },500); 
        setTimeout( function(){ 
            last.parent().parent().css('visibility','hidden'); 
        },500); 
        found++; 
    }

.hide()または、を使用する場合は、jQueryのアニメーションキューを次の代わりに使用でき.delay()ますsetTimeout()

    $(this).parent().parent().delay(500).hide(1);

きちんとしたコードになりますが、ではなく.hide()設定します。それはあなたが望むものではないかもしれないことを認めます(アニメーションメソッドではないため、で使用することはできません)。display:nonevisibility:hidden.delay().css().css()

于 2012-07-09T00:55:23.690 に答える
1

thisハンドラー内の値はclick、クリックされた要素への参照です。thistoのコールバック内の値はsetTimeoutグローバルwindowオブジェクトです。重要な点は、関数内の値thisがコンテキストに依存していることです(つまり、関数がどのように呼び出されたかに依存します)。

this内側のスコープ内で使用できるように、外側のスコープからの値への参照を保存する必要があります。

if ($(this).attr('id') == last.attr('id')) {
    var that = $(this);
    setTimeout( function() { 
        that.parent().parent().css('visibility','hidden'); 
    },500); 
    // ...
}
于 2012-07-09T00:55:54.167 に答える
0

jQueryイディオムの使用:

setTimeout(jQuery.proxy(function(){
  $(this).parent().parent().css('visibility','hidden');
}, this), 500);

標準JavaScript:

setTimeout(function(){
  $(this).parent().parent().css('visibility','hidden');
}.bind(this), 500);
于 2012-09-14T19:00:43.817 に答える