2011-08-23 190 views
5

我有一個javascript功能,當按下'down'鍵時運行。我想,如果'下'鍵被按下,該功能根本不會運行。區分按下按鍵和按鍵

我想過keydown和keyup之間的時間間隔,如果時間少於1秒,那麼函數將在keyup上運行。問題是,如果我按住鍵,瀏覽器會將它視爲連續按下多次的鍵。

有沒有更好的方法來做到這一點?

感謝

+1

什麼是上下文?如果您在文本框中,在最後一次按鍵之前跟蹤輸入值是否有意義,然後檢查是否在下一個按鍵事件中添加了多個字符?只要在周圍釣魚...... – Guttsy

+1

當第一個''keydown''事件觸發時(但不是如果它已經設置),你可以設置一個標誌(例如布爾變量),並且在''keyup''觸發時取消設置嗎? –

回答

1

如果我理解你的問題是,您的瀏覽器解釋的關鍵正在舉行多重的keydown事件。 你想要一個不同的事情發生,如果一個關鍵是舉行,而不是簡單地按下;你希望這種差異是基於你認爲應該構成「持有」關鍵的某個時間。 所以你需要通過跟蹤keyup事件來區分hold和press。下面的僞代碼將解決此問題:

在KEYDOWN:

if !yourBool 
    start timer 

yourBool = true 

上KEYUP:

if timer < yourTime 
    do something 

yourBool = false 

這工作,因爲計時器不會重新啓動,除非發生keyup事件。

現在...如果你的瀏覽器解釋密鑰保存爲:
的keydown,KEYUP,KEYDOWN,KEYUP .......
那麼你必須用這種方法的一個問題。

0

也許你可以觸發的keydown一個櫃檯上,然後收聽下一KEYUP。只要計數器超過5秒鐘,或無論您認爲多長時間,都可以啓動該功能。合理?

0

連續keydowns不會觸發一個keyup,因此可以區分它們。

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

瀏覽器看到按鍵被按下很多次,但​​事件只發生在第一次按下時。

你想要的是從​​事件中,而不是keypressed

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

我也有類似的問題。我想捕捉所有的「第一」keydown事件,但如果它們是一個關鍵被阻止的結果,則忽略連續的事件。不知道這是你想要的,但這裏有一種方法:

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