jQuery: keyPress Retroceso no se disparará?

186

Me pregunto qué estoy haciendo mal:

$(".s").keypress(function(e) {
   switch (e.keyCode) {
      case 8: // Backspace
      //console.log('backspace');
      case 9: // Tab
      case 13: // Enter
      case 37: // Left
      case 38: // Up
      case 39: // Right
      case 40: // Down
         break;

      default:
         doSearch();
   }
});

Quiero que mi doSearch()función también se active cuando presiono la Backspacetecla. Por el momento no pasa absolutamente nada cuando presiono BackspaceChrome y Safari.

¿algunas ideas?

mate
fuente
Puede probar este plugin jQuery code.google.com/p/js-hotkeys y usar el alias de la tecla "retroceso"
José Manuel Lucas
3
no se dispara en Chrome pero sí en Firefox.
vsync
Perdón por la necroposición, pero vale la pena señalar que e.lo que se prefiere sobre e.keyCode
Henry Howeson

Respuestas:

324

Usar en keyuplugar de keypress. Esto obtiene todos los códigos clave cuando el usuario presiona algo

Jonathon Bolster
fuente
37
¿Por qué keyupdispararía para Retroceso cuando keypressno lo hará?
Aaron Digulla
Es el caso. Keyup dispara retroceso, la pulsación de teclas no -> raro. ¿existe la posibilidad de verificar también si se presionan dos teclas como cmd-c, o cmd-v, o cmd-a
mate
17
De hecho depende de la clave. Desea usar keypresspara Enterclave, keydownpara Backspacey así sucesivamente; de lo contrario, encontrará que sus eventos en algunos navegadores no funcionan realmente como espera, especialmente cuando desea evitar el comportamiento predeterminado de la clave. Cuando usa el incorrecto, lo que sucederá es que su evento no se captura en absoluto (como es el caso de Retroceso) o no puede evitarlo; ya que sucede antes de que llegue el código de manejo de eventos.
srcspider
55
El problema con esta respuesta es que el uso keyupva a romper el teclado numérico . ¿Conoces una respuesta que permita detectar correctamente cualquier tecla en un teclado completo?
Hughes
66
keydownes la mejor opción para todas las claves
artfuldev
32

Me encontré con esto yo mismo. Lo usé .onpara que se vea un poco diferente, pero hice esto:

 $('#element').on('keypress', function() {
   //code to be executed
 }).on('keydown', function(e) {
   if (e.keyCode==8)
     $('element').trigger('keypress');
 });

Agregando mi trabajo por aquí. Necesitaba eliminar ssn escrito por el usuario, así que hice esto en jQuery

  $(this).bind("keydown", function (event) {
        // Allow: backspace, delete
        if (event.keyCode == 46 || event.keyCode == 8) 
        {
            var tempField = $(this).attr('name');
            var hiddenID = tempField.substr(tempField.indexOf('_') + 1);
            $('#' + hiddenID).val('');
            $(this).val('')
            return;
        }  // Allow: tab, escape, and enter
        else if (event.keyCode == 9 || event.keyCode == 27 || event.keyCode == 13 ||
        // Allow: Ctrl+A
        (event.keyCode == 65 && event.ctrlKey === true) ||
        // Allow: home, end, left, right
        (event.keyCode >= 35 && event.keyCode <= 39)) {
            // let it happen, don't do anything
            return;
        }
        else 
        {
            // Ensure that it is a number and stop the keypress
            if (event.shiftKey || (event.keyCode < 48 || event.keyCode > 57) &&       (event.keyCode < 96 || event.keyCode > 105)) 
            {
                event.preventDefault();
            }
        }
    });
Robar
fuente
1
esto funciona con firefox si usa event.which en lugar de event.keyCode api.jquery.com/event.which
BishopZ
11

Si desea activar el evento solo en los cambios de su uso de entrada:

$('.s').bind('input', function(){
  console.log("search!");
  doSearch();
});
Marcos Nunes
fuente
inputtampoco observa códigos clave. Esto tampoco funcionaría.
Mark Pieszak - Trilon.io
3

De acuerdo con la documentación de jQuery para .keypress (), no captura caracteres no imprimibles, por lo que el espacio de retroceso no funcionará en la pulsación de teclas, pero se atrapa en keydown y keyup:

El evento de pulsación de tecla se envía a un elemento cuando el navegador registra la entrada del teclado. Esto es similar al evento de pulsación de tecla, excepto que las teclas modificadoras y que no se imprimen, como Shift, Esc, y eliminan eventos de pulsación de teclas de activación pero no eventos de pulsación de teclas. Pueden surgir otras diferencias entre los dos eventos según la plataforma y el navegador. ( https://api.jquery.com/keypress/ )

En algunos casos, el keyup no es deseable o tiene otros efectos no deseados y el keydown es suficiente, por lo que una forma de manejar esto es usar keydownpara capturar todas las pulsaciones de teclas, luego establecer un tiempo de espera de un intervalo corto para que se ingrese la clave, luego realice el procesamiento en después de eso.

jQuery(el).keydown( function() { 
    var that = this; setTimeout( function(){ 
           /** Code that processes backspace, etc. **/ 
     }, 100 );  
 } );
Martín pescador
fuente