2010-05-21 10 views
45

Cómo capturar la pulsación de tecla, por ejemplo, Ctrl + Z, sin colocar un elemento de entrada en la página en JavaScript? Parece que en IE, los eventos de keypress y keyup solo pueden vincularse a los elementos de entrada (cuadros de entrada, áreas de texto, etc.)Capturar presionar la tecla sin colocar un elemento de entrada en la página?

+0

que no es necesario hacerlo. – muhmuhten

+6

¿Por qué no ......? –

+4

@Tim: Porque no sería convencional realizar acciones cuando se presionan esos teclacomandos cuando un elemento de la GUI no está enfocado, lo que infringe el Principio de la menor sorpresa. –

Respuesta

31

jQuery también tiene una excelente aplicación que es increíblemente fácil de usar. He aquí cómo se podría implementar esta funcionalidad en todos los navegadores:

$(document).keypress(function(e){ 
    var checkWebkitandIE=(e.which==26 ? 1 : 0); 
    var checkMoz=(e.which==122 && e.ctrlKey ? 1 : 0); 

    if (checkWebkitandIE || checkMoz) $("body").append("<p>ctrl+z detected!</p>"); 
}); 

Probado en IE7, Firefox 3.6.3 & Chrome 4.1.249.1064

Otra forma de hacer esto es usar el evento KeyDown y realizar un seguimiento del evento. clave. Sin embargo, puesto jQuery normaliza keyCode y charCode usando event.which, su spec recomienda el uso de event.which en una variedad de situaciones:

$(document).keydown(function(e){ 
if (e.keyCode==90 && e.ctrlKey) 
    $("body").append("<p>ctrl+z detected!</p>"); 
}); 
+0

no sabía e.which puede capturar la pulsación de teclas, así como el clic del ratón! ¿Y podría decirme cómo obtener el código clave 26? – powerboy

+2

keycode 26 es una identificación específica para "que" configurada por un evento de pulsación de tecla (indica CTRL + z). Para ver más asignaciones de caracteres para el evento de pulsación de teclas, consulte [los documentos de jQuery] (http://api.jquery.com/keypress/) o [probador de eventos clave de unixpapa] (http://unixpapa.com/js /testkey.html) – Trafalmadorian

+0

Thx. Sé cuál es el significado de keycode. Quiero decir, 17 es para Ctrl, 90 es para Z, ¿cómo obtuviste el número 26? Solo busqué en Google pero no pude encontrar la respuesta. – powerboy

-3

document.onkeydown = keyDown;

document.onkeypress = keyPress;

etc.

funciona para mí en IE

+0

¿Has probado IE6 y probado las teclas de flecha? – powerboy

+0

No explica qué son 'keyDown' y' keyPress'. Esto arrojará un error. –

7

Código & detecta ctrl + z

document.onkeyup = function(e) { 
    if(e.ctrlKey && e.keyCode == 90) { 
    // ctrl+z pressed 
    } 
} 
47

Para las claves no imprimibles, tales como teclas de flecha y teclas de acceso directo, tales como Ctrl-z , Ctrl-x, Ctrl-c que pueden desencadenar alguna acción en el navegador (por ejemplo, dentro de documentos o elementos editables), es posible que no obtenga un evento de pulsación de tecla en todos los navegadores. Por este motivo, debe utilizar keydown en su lugar, si le interesa suprimir la acción predeterminada del navegador. De lo contrario, keyup funcionará igual de bien.

Colocación de un evento keydown a document obras en todos los principales navegadores:

document.onkeydown = function(evt) { 
    evt = evt || window.event; 
    if (evt.ctrlKey && evt.keyCode == 90) { 
     alert("Ctrl-Z"); 
    } 
}; 

Para una referencia completa, recomiendo fuertemente Jan Wolter's article on JavaScript key handling.

+0

¿Esto también funciona en Chrome para Android? – hendrik

+0

@hendrik: No veo por qué no debería hacerlo, pero actualmente no puedo probarlo. –

+0

Probado. Funciona. – hendrik

6

Detectar pulsación de tecla, incluyendo combinaciones de teclas:

window.addEventListener('keydown', function (e) { 
    if (e.ctrlKey && e.keyCode == 90) { 
    // Ctrl + z pressed 
    } 
}); 

ventaja aquí es que son no sobrescribir propiedades globales, sino que simplemente introduciendo un efecto secundario. No es bueno, pero definitivamente es mucho menos nefasto que otras sugerencias aquí.

0

Para JS moderno, use event.key!

document.addEventListener("keypress", function onPress(event) { 
    if (event.key === "z" && event.ctrlKey) { 
     // Do something awesome 
    } 
}); 

Mozilla Docs

Supported Browsers

Cuestiones relacionadas