我个人更喜欢多键方法。这样可以检测到多个按键,但也同样适用于单个按键,并且在我测试过的每个浏览器中都可以正常工作。
map={}
onkeydown=onkeyup=function(e){
e=e||event
map[e.keyCode]=e.type=='keydown'?true:false
}
一个替代方法是分离 onkeydown 和 onkeyup 事件,并在每个事件中显式定义 map 子项:
map={}
onkeydown=function(e){
e=e||event
map[e.keyCode]=true
}
onkeyup=function(e){
e=e||event
map[e.keyCode]=false
}
两种方式都可以。现在,要实际检测按键,方法(包括错误修复)如下:
if(map[keycode]){
map={}
return false
}
map[keycode]
包含一个特定的键码,例如 13
表示 Enter
,或者 17
表示 CTRL
。
map={}
这一行清除了 map 对象,以防止在失去焦点的情况下“保留”键,而 return false
则可以防止例如检查 CTRL+D
时弹出书签对话框。在某些情况下,您可能需要将其替换为 e.preventDefault()
,但我发现在大多数情况下,return false
更有效率。只需尝试使用 CTRL+D
来获得清晰的视角。 Ctrl
是 17
,而 D
是 68
。请注意,如果没有 return false
行,书签对话框将弹出。
以下是一些示例:
if(map[17]&&map[13]){
alert('CTRL+ENTER was pressed')
map={}
return false
}else if(map[13]){
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]){
alert('1) Type your username and password\n\n2) Hit Enter to log in')
map={}
return false
}else if(map[13]){
alert('Logging in...')
map={}
return false
}
}
keyup=function(e){
e=e||event
map[e.keyCode]=false
}
onkeydown=keydown
onkeyup=keyup
try{
document.attachEvent('onkeydown',keydown)
document.attachEvent('onkeyup',keyup)
}catch(e){
}
请注意,某些特殊键在不同的引擎中具有不同的代码。但是经过我的测试,它可以在我电脑上所有浏览器中正常工作,包括Maxthon 3,Google Chrome,Internet Explorer(9和8)和Firefox。
希望这对您有所帮助。