2010-01-12 26 views
2

工作的代碼片段是here按鍵事件沒有正確Safari和Firefox中使用jQuery 1.3

如果我更換KEYUP或按鍵的keydown,它工作正常。根據jQuery documentation event.which應該很好。

更新:

this page says最底部:

如果需要檢測這些鍵,請你幫個忙,並搜尋他們的keyCode的onkeydown /上,而忽略兩者onkeypress事件和則charCode。

看起來像按鍵是不是很可靠。

UPDATE2:

按鍵事件不會在Firefox和Safari中工作。但是它沒有檢測到左右箭頭按鍵。 http://docs.jquery.com/Events/keypress

+0

我聽說在此之前,'keypress'是這樣的,使用像'keydown'或'keyup'較好,產生較少的問題,更明確的事件。 – 2010-01-12 20:18:45

+0

爲什麼很多人用的keydown,不KEYUP更有意義? – 2010-01-12 20:19:25

回答

7

按鍵是一個令人困惑的事件。雖然KeyDown和KEYUP會告訴你哪個特定鍵鍵盤上關閉或剛回來時,鍵擊事件應該告訴你會出現什麼字符在屏幕上,這就是爲什麼你引用的jQuery的文件說:

例如,小寫字母「a」將被報告爲65由KeyDown和KEYUP,但作爲由97按鍵。

讓事情變得更糟Safari不會觸發鍵盤事件不會在屏幕上寫東西 - 這就是爲什麼箭頭鍵不起作用。但是,Firefox確實會觸發箭頭鍵的按鍵事件。兩者都是規範的合理實現,所以不要指望要麼改變。這就是爲什麼有人建議堅持使用keydown或keyup。

但是,它看起來像你想利用的優勢,當一個鍵被按下,你想有一個箭頭鍵來做到這一點按鍵事件重複(在Firefox)如何。如果是這樣的話,你需要編寫一個處理器來查看keydown和keypress。這裏有兩種不同的方式瀏覽器反應到方向鍵被按下:

  • 火狐註冊一個keydown事件也重複按鍵事件(注:只是擊中一次鍵,將註冊既有的keydown和按鍵事件)
  • Safari瀏覽器註冊了keydown事件和重複keydown事件

一個快速的黑客攻擊,使這項工作相當不錯的方向鍵和拿到鑰匙的重複工作是:

function moveItem(evt) { 
    // do something with `this` and evt.keyCode here... 
} 

$(document.documentElement) 
    .keypress(function(evt) { 
     if ($.data(this, '_lastKeyEvent') != 'keydown') { 
      // since firefox will do both a keydown and a keypress for the first 
      // keydown, we ignore the very first keypress 
      moveItem.call(this, evt); 
     } 
     $.data(this, '_lastKeyEvent', 'keypress'); 
    }) 
    .keydown(function(evt) { 
     moveItem.call(this, evt); 
     $.data(this, '_lastKeyEvent', 'keydown'); 
    }); 
+0

+1 - 關鍵*活動的絕佳解釋。 – JasCav 2011-02-03 18:28:54

相關問題