2011-06-24 7 views
4

だから、このコードを想像:どのキーが押されたかに関する情報を取得する方法

それは何
if (navigator.appName == "Opera") 
    document.onkeypress = function (e) { console.log(e.keyCode); }; 
else 
    document.onkeydown = function (e) { console.log(e.keyCode); }; 

はかなり明白ですが、私は推測します。問題は、あなたが長い間鍵を持っていると、それが何度も登録されることです。私のアプリでは、これは問題です。なぜなら、私のアプリが不必要な計算をたくさんするからです。何とかキーを押すだけで、キーが押された時間についての情報が得られますか?

ありがとうございました。

+0

私は論理の専門家ではありませんが、ifステートメントのブランチが異なるはずはありません。 ':)' –

+0

jQueryのようなライブラリを使いますか? –

+0

いいえ、私はjQueryやその他のフレームワークを使用していません。 –

答えて

7

あなたが行く:

var pressed = {}; 

window.onkeydown = function(e) { 
    if (pressed[e.which]) return; 
    pressed[e.which] = e.timeStamp; 
}; 

window.onkeyup = function(e) { 
    if (!pressed[e.which]) return; 
    var duration = (e.timeStamp - pressed[e.which])/1000; 
    // Key "e.which" was pressed for "duration" seconds 
    pressed[e.which] = 0; 
}; 

ライブデモ:http://jsfiddle.net/EeXVX/1/show/

(デモ用コードを表示するURLの "ショー/" の部分を削除)

したがって、どのキーが現在押されているのか、どのキーが押されたのかを監視するオブジェクトがpressedです。

キーアップハンドラの中で、キーが押されているかどうかを判断し、キーが押されている場合は、キーアップ/キーダウンイベントのタイムスタンプを減算して期間を計算します。

+0

それは動作します。ありがとう:) –

+0

@popoffkaこのコードは、OperaとIEの古いバージョン(IE8以下)で動作しないことに注意してください... –

2

は、あなたがsomethignなどをやってみました

  1. onkeydownを、KeyDownイベントリスナーを削除します。
  2. onkeyup、keydownリスナーをもう一度付けてコンピュータに時刻を付けますか?ここで
+0

もちろん、他の可能性も考慮に入れる必要があります。 onkeyupがまったくトリガーされなかった場合のように。 –

+0

これは、パラレルキープレス(複数のキーが同時に押される)では機能しません。 –

関連する問題