2012-04-06 6 views
0

キーコマンドの後に「mouseactive」を1秒未満に設定しようとしていますが、その時間内にそのキーが押された場合、そのアクションをキャンセルしたいと思います。しかし、私はこれを行う方法を把握していないようです。これは...私が持っているものsetTimeoutの問題をクリアする

$(window).keydown(function(e) { 
if (e.keyCode == 40) { 
     e.preventDefault(); 
     mouseactive = false; 
     clearTimeout(t); 
     var t = setTimeout("mouseActive()",800); 
} else if (e.keyCode == 38) { 
     e.preventDefault(); 
     mouseactive = false; 
     clearTimeout(t); 
     var t = setTimeout("mouseActive()",800); 
} 
}); 

function mouseActive() { 
mouseactive = true; 
} 

である。しかし、これは動作しません、それはmouseactive戻ってtrueに設定されていません...誰も私が間違ってここにやっているものを私に伝えることができますか?

答えて

2

編集:クリーンアップされた冗長コード。

その他の編集:var t$(document).readyを含む閉鎖の外側に定義されていることを確認してください。下記を参照してください。

var t = null; 

$(document).ready(function() { 
    //..below code except for var t = null 
}); 

ハンドラの外側にvar tを宣言してください。

var t = null; 
$(window).keydown(function(e) { 
    e.preventDefault(); 

    if (e.keyCode == 40) { 
     mouseactive = false; 
    } else if (e.keyCode == 38) { 
     mouseactive = false; 
    } 

    if (t != null) clearTimeout(t); 
    t = setTimeout(mouseActive, 800); 
}); 

function mouseActive() { 
    mouseactive = true; 
} 
+0

文字列を 'setTimeout'に渡すべきではありません。関数を渡すべきです。文字列が渡されたときに 'eval'を使います。 't = setTimeout(mouseActive、800);' –

+0

@Rocket mm ..私は自分のコードをクリーンアップしました。クリーンアップにも含まれています..ありがとう!私はクリーンアップ前の私の最初の投稿に文字列としてそれを持っていた。 –

+0

ありがとう、それはトリック、多くの感謝しました。 – Ian

1

あなたが「T」のすべての時間を再宣言され、これを試してみてください。

var t = null; 
$(window).keydown(function(e) { 
    if (e.keyCode == 40) { 
      e.preventDefault(); 
      mouseactive = false; 
      if(t != null) 
      { 
       clearTimeout(t); 
      } 
      t = setTimeout("mouseActive()",800); 
    } else if (e.keyCode == 38) { 
      e.preventDefault(); 
      mouseactive = false; 
      if(t != null) 
      { 
       clearTimeout(t); 
      } 
      t = setTimeout("mouseActive()",800); 
    } 
    }); 

    function mouseActive() { 
    mouseactive = true; 
    } 
+0

文字列を 'setTimeout'に渡すべきではありません。関数を渡すべきです。文字列が渡されたときに 'eval'を使います。 't = setTimeout(mouseActive、800);' –

2

あなたの問題はtがスコープ内に関数が実行される2回目ではないということです。 tをグローバル変数にする必要があります。

var t; 

$(window).keydown(function(e) { 
if (e.keyCode == 40) { 
     e.preventDefault(); 
     mouseactive = false; 
     clearTimeout(t); 
     t = setTimeout(mouseActive,800); 
} else if (e.keyCode == 38) { 
     e.preventDefault(); 
     mouseactive = false; 
     clearTimeout(t); 
     t = setTimeout(mouseActive,800); 
} 
}); 

function mouseActive() { 
mouseactive = true; 
} 

P.S.文字列をsetTimeoutに渡さず、関数を渡します。文字列を渡すときはevalを使用します。

+0

私が "var"を使わないときは、奇妙なことに、全体が壊れます... – Ian

+0

Nvm、それは前に "var t"で定義しなかったからです。 – Ian

+0

ありがとうございます。歓迎します:-) –

関連する問題