Personalmente prefiero el enfoque de varias teclas. Esto permite que se detecten varias claves, pero también una única clave, y funciona en todos los exploradores que he probado.
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
}
Un método alternativo sería separar las onkeydown
y onkeyup
eventos y definir explícitamente los subelementos mapa en cada caso:
map={}
onkeydown=function(e){
e=e||event
map[e.keyCode]=true
}
onkeyup=function(e){
e=e||event
map[e.keyCode]=false
}
cualquier manera funciona bien. Ahora, para detectar las pulsaciones de teclado en realidad, el método, incluyendo correcciones de errores, es:
//[in onkeydown or onkeyup function, after map[e.keyCode] has been decided...]
if(map[keycode]){
//do something
map={}
return false
}
map[keycode]
constituye un código clave específica, como 13
para Enter
, o 17
para CTRL
.
La línea map={}
se borra el objeto de mapa para evitar que se "espera" en las teclas en los casos de unfocusing, mientras return false
impide, por ejemplo, el diálogo Marcadores de aparecer cuando usted comprobar si hay CTRL+D
. En algunos casos, es posible que desee reemplazarlo por e.preventDefault()
, pero he encontrado que return false
es más eficiente en la mayoría de los casos. Solo para obtener una perspectiva clara, pruébalo con CTRL+D
. Ctrl
es 17
, y D
es 68
. Tenga en cuenta que sin la línea return false
, aparecerá el cuadro de diálogo Marcadores.
Algunos ejemplos son los siguientes:
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
}
Una cosa a tener en cuenta es que las combinaciones más pequeños deben ir en último lugar. Siempre ponga combinaciones más grandes primero en la cadena if..else, para que no reciba una alerta para Enter
y CTRL+ENTER
al mismo tiempo.
Ahora, un ejemplo completo para "poner todo junto". Supongamos que desea alertar a un mensaje que contiene instrucciones para iniciar sesión cuando el usuario presiona SHIFT+?
e inicie sesión cuando el usuario presione ENTER
. Este ejemplo también es compatible con varios navegadores, lo que significa que funciona en IE, también:
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
}
Tenga en cuenta que algunas teclas especiales tienen diferentes códigos para diferentes motores. Pero como lo he probado, esto funciona en todos los navegadores que tengo actualmente en mi computadora, incluidos Maxthon 3, Google Chrome, Internet Explorer (9 y 8) y Firefox.
Espero que haya sido útil.
Interesante, el "onkeyup" evento no incluso ejecutar en este caso en Internet Explorer 8. –