2011-08-23 9 views
5

私は、「下へ」キーが押されたときに実行されるjavascript機能を持っています。私は、 'down'キーが押されていれば、その機能はまったく動かないだろうと思います。押されたキーと保持されたキーを区別する

私はキーダウンとキーアップの間のタイミングについて考えました。時間が1秒未満であれば、その機能はキーアップで実行されます。問題は、私がキーを押したままにしておくと、ブラウザはそれを連続して何度も押されているキーと見なします。

これを行うより良い方法はありますか?

おかげで

+1

は、コンテキストとは何ですか?テキストボックスに入っている場合は、最後のキーを押す前に入力の値を追跡し、次のキーアップイベントで複数の文字が追加されているかどうか確認してください。ちょうど周りに釣り... – Guttsy

+1

最初の '' keydown''イベントが発生したときにフラグ(例えばブール変数)を設定できますか?( ''既に設定されている場合はそうではありません) '' keyup''が起動したときに解除しますか? –

答えて

1

私は理解していれば、あなたの問題は、ブラウザが複数のKeyDownイベントとして開催されているキーを解釈するということです。 キーが押されている場合と単純に押されている場合とで、あなたはその違いを、鍵を「保持」すると考えるべき時間に基づいていることを望みます。 これで、holdupとpressを区別する必要があります。以下の擬似コードは、この問題を解決します:KeyDownイベントで

:keyUpイベントに

if !yourBool 
    start timer 

yourBool = true 


if timer < yourTime 
    do something 

yourBool = false 

からkeyupイベントが発生していない限り、タイマーが再起動しませんので、これは動作します。

お使いのブラウザのように鍵保持を解釈する場合は今...:
のKeyDown、keyUpイベント、KeyDownイベント、keyUpイベント.......
、あなたは、このアプローチの問題点を持っています。

0

おそらくあなたは、keydownイベントにカウンタをトリガし、次からkeyupのために聞くことができました。カウンターが5秒以上経過するか、または多くの時間がかかるとすぐに、機能を開始することができます。理にかなっている?

0

連続するキーダウンではキーアップが発生しないため、キーアップを区別することができます。

http://jsfiddle.net/pimvdb/xMFGQ/

$('body').keydown(function() { 
    if(!$(this).data('timeDown')) { // if not pressed yet, save time 
     $(this).data('timeDown', +new Date); 
    } 
}).keyup(function() { 
    var diff = new Date - $(this).data('timeDown'); // time difference 
    if(diff < 1000) { // less than one second 
     alert(123); 
    } 
    $(this).data('timeDown', null); // reset time 
}); 
0

ブラウザではキーが何度も押されているのが見えますが、​​イベントは最初のプレスでのみ発生します。

ではなく、​​イベントから時刻を変更することです。

2

私はちょうど押されたキーと200ミリ秒のキーフィールドとを区別するこの小さなスクリプトを書きました。

document.onkeydown = function(e){ 
    var keycode = window.event ? window.event.keyCode : e.which; 
    if(keycode == 40){ 
     var timer = setTimeout(function(){ 
      alert('Down key held'); 
      document.onkeyup = function(){}; 
     }, 200); 
     document.onkeyup = function(){ 
      clearTimeout(timer); 
      alert('Down key pressed'); 
     } 
    } 
}; 

JSFiddle

0

私は同様の問題があった:おそらく、あなたはそれを使用することができます。私はすべての「最初の」キーダウンイベントを捕捉したいが、キーが押された結果であれば、連続するイベントは無視する。それはあなたが何をしたいかどうかわからないが、ここでは一つのアプローチです:

var repeat = false; 
el.addEventListener("keyup", function() { repeat = false; }); 
el.addEventListener("keydown", function() { 
    if (!repeat) { 
    // Run your code. 
    repeat = true; 
    } 
}); 
関連する問題