2011-01-14 6 views
151

Mi chiedo che cosa sto facendo male:jQuery: keyPress Backspace non si attiva?

$('.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(); 
     } 

    }); 

Voglio che la mia funzione di doSearch() anche di essere licenziato quando ho colpito il chiave Backspace. Al momento non accade assolutamente nulla quando premo Backspace in Chrome e Safari.

qualche idea?

+2

non attiva su Chrome ma su Firefox. – vsync

+0

Puoi provare questo plug-in jQuery http://code.google.com/p/js-hotkeys/ e utilizzare l'alias chiave "backspace" –

risposta

265

Utilizzare keyup anziché keypress. Questo ottiene tutti i codici chiave quando l'utente preme qualcosa

+31

Perché l'attivazione di 'keyup' per Backspace quando' keypress' no? –

+0

è il caso. Keyup attiva il backspace, la pressione del tasto non -> strana. c'è la possibilità di controllare anche se due tasti sono premuti come cmd-c, o cmd-v o cmd-a – matt

+16

In realtà dipende dalla chiave. Si desidera utilizzare il tasto 'premere' per il tasto 'Invio',' keydown' per 'Backspace' e così via; in caso contrario, i tuoi eventi in alcuni browser non funzionano come previsto, soprattutto quando si desidera impedire il comportamento predefinito della chiave. Quando usi quello sbagliato, ciò che accadrà è che il tuo evento non viene catturato affatto (come nel caso di Backspace) o non puoi impedirlo; poiché accade già prima che arrivi il codice di gestione degli eventi. – srcspider

30

Mi sono imbattuto in questo io stesso. Ho usato .on in modo che appaia un po 'diverso, ma ho fatto questo:

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

aggiungendo il mio lavoro in giro qui. Avevo bisogno di eliminare SSN digitato dall'utente così ho fatto questo in 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

non funziona con firefox. –

+1

funziona con firefox se si utilizza event.which anziché event.keyCode http://api.jquery.com/event.which/ – BishopZ

10

Se si vuole generare l'evento solo su modifiche per l'utilizzo di input:

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

'input' non osserva i codici chiave. Neanche questo funzionerebbe. –

1

Secondo la documentazione jQuery per. Pressione(), non cattura caratteri non stampabili, quindi backspace non funziona alla pressione dei tasti, ma viene catturato in keydown e keyup:

keyPress viene inviato ad un elemento quando il browser registra input da tastiera . È simile all'evento keydown, tranne che per i tasti modificatore e non di stampa come Shift, Esc e cancella eventi di keydown del trigger ma non per gli eventi di keypress. Altre differenze tra i due eventi possono sorgere a seconda della piattaforma e del browser. (https://api.jquery.com/keypress/)

In alcuni casi keyup non desiderati o ha altri effetti indesiderati e keydown è sufficiente, quindi un modo per gestirle è di utilizzare keydown per catturare tutte le battiture quindi impostare un timeout di un breve intervallo così che la chiave è stata inserita, quindi eseguire l'elaborazione lì dopo.

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