我個人比較喜歡多鍵方法。這樣就可以檢測到多個按鍵,但同一個按鍵也是一樣的,它適用於我測試過的每個瀏覽器。
map={}//declare object to hold data
onkeydown=onkeyup=function(e){
e=e||event//if e doesn't exist (like in IE), replace it with window.event
map[e.keyCode]=e.type=='keydown'?true:false
//Check for keycodes
}
的另一種方法是在每個事件分開onkeydown
和onkeyup
事件,並明確定義地圖子項:
map={}
onkeydown=function(e){
e=e||event
map[e.keyCode]=true
}
onkeyup=function(e){
e=e||event
map[e.keyCode]=false
}
無論哪種方式工作得很好。現在,實際檢測的鍵擊,該方法,包括錯誤修正,方法是:
//[in onkeydown or onkeyup function, after map[e.keyCode] has been decided...]
if(map[keycode]){
//do something
map={}
return false
}
map[keycode]
構成特定鍵碼,如用於13
Enter
,或者17
爲CTRL
。
的map={}
線從unfocusing的情況下,「持有」上鍵,而return false
預防,例如,從彈出的書籤對話框時您檢查CTRL+D
清除地圖對象保留它。在某些情況下,您可能想用e.preventDefault()
替換它,但在大多數情況下我發現return false
更有效。爲了獲得清晰的視角,請使用CTRL+D
來嘗試。 Ctrl
是17
,並且D
是68
。請注意,如果沒有return false
行,將會彈出「書籤」對話框。
以下是一些例子:
if(map[17]&&map[13]){//CTRL+ENTER
alert('CTRL+ENTER was pressed')
map={}
return false
}else if(map[13]){//ENTER
alert('Enter was pressed')
map={}
return false
}
有一點要記住的是,較小的組合應該最後來了。首先在if..else鏈中首先放置較大的組合,因此您同時不會收到Enter
和CTRL+ENTER
的提醒。
現在,一個完整的例子「把它放在一起」。假設您想提醒一條消息,其中包含用戶按SHIFT+?
時登錄的說明,並在用戶按ENTER
時登錄。這個例子也是跨瀏覽器兼容,這意味着它在IE,太:
map={}
keydown=function(e){
e=e||event
map[e.keyCode]=true
if(map[16]&&map[191]){//SHIFT+?
alert('1) Type your username and password\n\n2) Hit Enter to log in')
map={}
return false
}else if(map[13]){//Enter
alert('Logging in...')
map={}
return false
}
}
keyup=function(e){
e=e||event
map[e.keyCode]=false
}
onkeydown=keydown
onkeyup=keyup//For Regular browsers
try{//for IE
document.attachEvent('onkeydown',keydown)
document.attachEvent('onkeyup',keyup)
}catch(e){
//do nothing
}
注意一些特殊的按鍵有不同的引擎不同的代碼。但正如我測試過的,這適用於我目前在我的電腦上使用的所有瀏覽器,包括Maxthon 3,Google Chrome,Internet Explorer(9和8)和Firefox。
我希望這是有幫助的。
有意思, 「的onkeyup」 事件甚至不執行在這種情況下在Internet Explorer 8 –