2011-02-08 17 views
26

Non sembra che i metodi jQuery keyup, keydown o keypress vengano attivati ​​quando si preme il tasto backspace. Come intrappolare la pressione del tasto backspace?Come intrappolare il tasto backspace usando jQuery?

+0

Giusto per chiarire, voglio intercettare quando il tasto backspace viene premuto e intraprendere un'azione. Sto cambiando lo stato abilitato di alcuni pulsanti sulla pagina quando l'ultimo carattere viene rimosso da una casella di testo. Pertanto, desidero comunque che il tasto backspace esegua il suo normale funzionamento. – ChrisP

+1

Non è vero. Appare nei metodi keyup e keydown. Solo non appare in keypress. – Line

+0

@RickSmith Non sono d'accordo. La domanda a cui ti riferisci era in JavaScript, mentre l'OP qui sta chiedendo in jQuery. Ci potrebbe essere qualche ragione per cui qualcuno vorrebbe la risposta in un modo o nell'altro. –

risposta

61

provare questo:

$('html').keyup(function(e){if(e.keyCode == 8)alert('backspace trapped')}) 
+16

controlla anche per 46 (cancella) – andufo

+0

Funziona ma non puoi in tal modo mostrare la finestra modale e smettere di tornare alla pagina precedente. –

+1

Prova e.preventDefault() e THEN rendi la cosa più difficile :) –

10

È possibile utilizzare javascript normale per intercettare il tasto backspace. È possibile utilizzare il metodo event.keyCode. Il codice di accesso è di 8, in modo che il codice sarebbe simile a questa:

if (event.keyCode == 8) { 
    // Do stuff... 
} 

Se si desidera controllare sia per il [delete] (46), così come la [backspace] (8) le chiavi, utilizzare il seguente :

if (event.keyCode == 8 || event.keyCode == 46) { 
    // Do stuff... 
} 
3

Lavorando sulla stessa idea come sopra, ma generalizzando un po '. Poiché il backspace dovrebbe funzionare correttamente sugli elementi di input, ma non dovrebbe funzionare se lo stato attivo è un paragrafo o qualcosa del genere, poiché è lì dove la pagina tende a tornare alla pagina precedente nella cronologia.

$('html').on('keydown' , function(event) { 

     if(! $(event.target).is('input')) { 
      console.log(event.which); 
      //event.preventDefault(); 
      if(event.which == 8) { 
      // alert('backspace pressed'); 
      return false; 
     } 
     } 
}); 

ritorno falsa => sia event.preventDefault e event.stopPropagation sono a tutti gli effetti.

+0

upvote per Keydown anziché keyup. –

3

Il comportamento predefinito per il backspace sulla maggior parte dei browser è di tornare alla pagina precedente. Se lo fai non vuoi questo comportamento è necessario per assicurarsi che la chiamata preventDefault(). Tuttavia, come indicato dall'OP, se lo chiami sempre preventDefault(), ti sarà anche impossibile eliminare le cose nei campi di testo. Il codice seguente ha una soluzione adattata da this answer.

Inoltre, piuttosto che utilizzare valori keyCode codificati in modo rigido (alcuni valori cambiano a seconda del browser, anche se non ho trovato che sia vero per Backspace o Delete), jQuery has keyCode constants già definito. Ciò rende il tuo codice più leggibile e si prende cura di eventuali incoerenze del codice chiave per te.

// Bind keydown event to this function. Replace document with jQuery selector 
// to only bind to that element. 
$(document).keydown(function(e){ 

    // Use jquery's constants rather than an unintuitive magic number. 
    // $.ui.keyCode.DELETE is also available. <- See how constants are better than '46'? 
    if (e.keyCode == $.ui.keyCode.BACKSPACE) { 

     // Filters out events coming from any of the following tags so Backspace 
     // will work when typing text, but not take the page back otherwise. 
     var rx = /INPUT|SELECT|TEXTAREA/i; 
     if(!rx.test(e.target.tagName) || e.target.disabled || e.target.readOnly){ 
      e.preventDefault(); 
     } 

     // Add your code here. 
    } 
}); 
+0

Questo gestisce la maggior parte dei casi ma voglio impedire di selezionare Select e su determinati tipi di input come radio o checkbox, quindi ho rimosso 'SELECT' e aggiunto un test su' e.target.type'. Finora ho questi tipi di input 'var rxt =/radio | button | checkbox | image | reset | submit/i;' Color potrebbe anche essere uno da escludere ma che potrebbe essere specifico per il browser. – peater

Problemi correlati