2011-01-14 40 views
151

Me pregunto qué estoy haciendo mal:jQuery: keyPress ¿El retroceso no se disparará?

$('.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 función doSearch() también para ser disparado cuando pulso la tecla de retroceso . Por el momento no ocurre absolutamente nada cuando presiono Retroceso en Chrome y Safari.

¿Alguna idea?

+2

no se dispara en Chrome pero sí en Firefox. – vsync

+0

Puede probar este plugin de jQuery http://code.google.com/p/js-hotkeys/ y usar el alias de la tecla "retroceso" –

Respuesta

265

Use keyup en lugar de keypress. Esto obtiene todos los códigos de tecla cuando el usuario presiona algo

+31

¿Por qué 'keyup' se activaría para Retroceso cuando' keypress' no lo haga? –

+0

es el caso. Keyup activa el retroceso, la pulsación de tecla no es -> raro. ¿Existe la posibilidad de verificar también si se presionan dos teclas como cmd-c, o cmd-v, o cmd-a – matt

+16

? Depende de la clave. Desea usar 'keypress' para' Enter' key, 'keydown' para' Backspace' y demás; de lo contrario, descubrirá que los eventos en algunos navegadores no funcionan como esperaba, especialmente cuando desea evitar el comportamiento predeterminado de la clave. Cuando utiliza el incorrecto, lo que sucederá es que su evento no se captura (como en el caso del Retroceso) o no puede evitarlo; ya que esto sucede antes de que su código de manejo de eventos llegue a él. – srcspider

30

Me encontré con esto. Solía ​​.on por lo que se ve un poco diferente, pero lo hice:

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

Adición de mi trabajo por aquí. Necesitaba eliminar SSN tecleado 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(); 
      } 
     } 
    }); 
+0

no funciona con firefox. –

+1

esto funciona con firefox si usa event.which en lugar de event.keyCode http://api.jquery.com/event.which/ – BishopZ

10

Si desea disparar el evento sólo en los cambios de su uso de insumos:

$('.s').bind('input', function(){ 
    console.log("search!"); 
    doSearch(); 
}); 
+0

'input' tampoco observa keyCodes. Esto tampoco funcionaría. –

1

De acuerdo con la documentación de jQuery para. pulsación de tecla(), que no se enganche caracteres no imprimibles, por lo que la tecla de retroceso no funciona al pulsar las teclas, pero está atrapado en keydown y keyup:

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

En algunos casos keyup no se desea o que tiene otros efectos indeseables y keydown es suficiente, por lo que una manera de manejar esto es usar keydown de atrapar todas las pulsaciones a continuación, establecer un tiempo de espera de un intervalo corto de modo que se ingrese la clave, luego haga el procesamiento allí después.

jQuery(el).keydown(function() { 
    var that = this; setTimeout(function(){ 
      /** Code that processes backspace, etc. **/ 
    }, 100); 
}); 
Cuestiones relacionadas