2009-12-14 37 views

回答

0

您可以使用按鍵,並檢查e.keyCode == 38,40,而不是e.which或e.charCode 這在Mac和Win中是一致的。

$('#test').bind($.browser.mozilla ? 'keypress' : 'keyup', function(e) { 
    if ((e.which || e.keyCode) == 40) { /* doSometing() */ } 
}); 

參見JavaScript Madness: Keyboard Events(3.2。返回的值上字符事件) 和event.keyCode上MDC。

+0

在同一頁面(這也是我的股票的關鍵活動頁面我所指的人)也有「2.2事件觸發的自動重複」,這表明用於自動重複'特殊鍵keypress'事件瀏覽器支持例如光標鍵不比'keydown'事件更好。 – 2009-12-14 22:13:04

+0

'keydown'適用於所有瀏覽器,除了firefox(在我的情況下safari)而不是'keyup'對我來說工作的很好。謝謝! – pex 2009-12-15 15:06:41

+0

'$ .browser'現在已折舊。 – Cullub 2016-02-05 21:32:24

1

是的,你有點卡住了。您可以使用計時器模擬您想要的行爲,直到您收到相應的keyup,但顯然這不會使用用戶的計算機的鍵盤重複設置。

以下代碼使用上述方法。要處理的keydown事件(包括真實和模擬)的代碼應該在handleKeyDown

var keyDownTimers = {}; 
var keyIsDown = {}; 
var firstKeyRepeatDelay = 1000; 
var keyRepeatInterval = 100; 

function handleKeyDown(keyCode) { 
    if (keyCode == 38) { 
     alert("Up"); 
    } 
} 

function simpleKeyDown(evt) { 
    evt = evt || window.event; 
    var keyCode = evt.keyCode; 
    handleKeyDown(keyCode); 
} 

document.onkeydown = function(evt) { 
    var timer, fireKeyDown; 
    evt = evt || window.event; 
    var keyCode = evt.keyCode; 

    if (keyIsDown[keyCode]) { 
     // Key is already down, so repeating key events are supported by the browser 
     timer = keyDownTimers[keyCode]; 
     if (timer) { 
      window.clearTimeout(timer); 
     } 

     keyIsDown[keyCode] = true; 
     handleKeyDown(keyCode); 

     // No need for the complicated stuff, so remove it 
     document.onkeydown = simpleKeyDown; 
     document.onkeyup = null; 
    } else { 
     // Key is not down, so set up timer 
     fireKeyDown = function() { 
      // Set up next keydown timer 
      keyDownTimers[keyCode] = window.setTimeout(fireKeyDown, keyRepeatInterval); 
      handleKeyDown(keyCode); 
     }; 

     keyDownTimers[keyCode] = window.setTimeout(fireKeyDown, firstKeyRepeatDelay); 
     keyIsDown[keyCode] = true; 
    } 
}; 

document.onkeyup = function(evt) { 
    evt = evt || window.event; 
    var keyCode = evt.keyCode; 
    var timer = keyDownTimers[keyCode]; 
    if (timer) { 
     window.clearTimeout(timer); 
    } 
    keyIsDown[keyCode] = false; 
}; 
相關問題