2010-10-10 10 views
56

Estoy intentando implementar la funcionalidad de pulsación de teclas que eliminará un div cuando el usuario llegue al Esc. Esto funciona para Firefox & IE con el siguiente código:La 'pulsación de tecla' de jQuery no funciona para algunas teclas en Chrome. ¿Cómo trabajar?

$("body").keypress(function(e) { 
    alert("any key pressed"); 
    if (e.keyCode == 27) { 
     alert("escape pressed"); 
    } 
}); 

Si lo golpeo cualquier tecla, aparece la primera alert, y si golpeo de escape, también se muestra la segunda alert.

Aunque esto no funciona con Chrome. El primer alert siempre se muestra si presiono cualquiera de las teclas de letras, pero no cuando presiono Escape, Tab, Space o cualquiera de los números.

¿Por qué sería esto? ¿Hay alguna manera de hacer que Chrome responda a estas pulsaciones de teclas?

+0

Este es un [error conocido] (https://bugs.chromium.org/p/chromium/issues/detail?id=9061) de Chrome. En mayo de 2016, un desarrollador declaró que cree que su comportamiento se ajusta mejor a la especificación y que [no lo arreglará] (https://bugs.chromium.org/p/chromium/issues/detail?id=9061#c15). – Sheepy

Respuesta

108

Intente manejar keydown en su lugar.

+4

me salvaste mucho tiempo ...gracias SLaks – bragboy

+17

El truco de esta respuesta, que creo que es muy importante tener en cuenta, es que "intentar manejar' keydown' "no es una solución de propósito general, sino específica para" algunas claves ". Aún necesita 'keypress' para manejar los caracteres ascii correctamente. Entonces es realmente un proceso (complicado) de varios pasos. – Kato

+0

Gran respuesta. Tuve exactamente este mismo problema y esto se encargó. –

16

use keydown. la pulsación de tecla no funciona con ESC en Chrome (no estoy seguro acerca de otros navegadores).

$(newTag).keydown(function(e) { //keypress did not work with ESC; 
    if (event.which == '13') { 
     ProfilePage.saveNewTag(search_id, $(newTag).val()); 
    } 
    else if (window.event.which){ 
     $(newTag).remove(); 
    } 
}); 
+1

Gracias por mencionar el error de Chrome. Será útil para aquellos que se preguntan por qué keypress realmente está trabajando para ellos en otros navegadores. – Gustus

1

Después de la segunda alerta agregar también

e.preventDefault(); 

Esto evitará que la acción predeterminada del evento, que se activará.

Más información sobre este método here

El código debería ser similar

$("body").keypress(function(e) { 
    alert("any key pressed"); 
    if (e.keyCode == 27) { 
     alert("escape pressed"); 
     e.preventDefault(); 
}}); 
2

Para tecla ESC:

$(document).keydown(function(e) { 
    if(e.keyCode == 27) { /* Run code */ } 
} 

Para teclas de letras, como 'L':

$(document).keypress(function(e) { 
    if(e.which == 108) { } 
}); 

Obras en tanto Chrome y Firefox

0

Uso de archivo Jquery.hotkey js Usted puede hacer que Sortcut clave

$(document).bind('keydown', 'esc', function(){ }); 
+0

Si bien este fragmento de código puede resolver la pregunta, [incluyendo una explicación] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) realmente ayuda a mejorar la calidad de su publicación. Recuerde que usted está respondiendo la pregunta a los lectores en el futuro, y es posible que esas personas no sepan los motivos de su sugerencia de código. – DimaSan

0

pulsación de tecla 'ESC'

e.which: 0 
e.keyCode: 27 

keyup 'ESC'

e.which: 27 
e.keyCode: 27 

Para caracteres no imprimibles, mejor uso keyup.

Cuestiones relacionadas