2010-10-10 14 views
56

Sto cercando di implementare la funzionalità di pressione di un tasto che rimuoverà un div quando l'utente preme Esc. Questo funziona per Firefox & IE con il seguente codice:Il tasto di pressione di jQuery non funziona per alcune chiavi in ​​Chrome. Come lavorare?

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

Se mi ha colpito un tasto, viene visualizzato il primo alert, e se ho colpito fuga, viene visualizzato anche il secondo alert.

Tuttavia, ciò non funziona con Chrome. Il primo alert viene sempre visualizzato se premo uno dei tasti delle lettere, ma non quando premo Escape, Tab, Space o uno qualsiasi dei numeri.

Perché dovrebbe essere? C'è un modo per convincere Chrome a rispondere a queste pressioni dei tasti?

+0

Questo è un [bug noto] (https://bugs.chromium.org/p/chromium/issues/detail?id=9061) di Chrome. A maggio 2016 uno sviluppatore ha dichiarato di ritenere che il loro comportamento si adattasse meglio alle specifiche e [non lo aggiusterà] (https://bugs.chromium.org/p/chromium/issues/detail?id=9061#c15). – Sheepy

risposta

108

Provare a gestire keydown invece.

+4

mi hai salvato un sacco di tempo ..grazie SLaks – bragboy

+17

Il trucco di questa risposta, che ritengo sia molto importante notare, è che "provare a manipolare il' keydown' "non è una soluzione generica, ma specifica per" alcune chiavi ". È ancora necessario premere il tasto per gestire correttamente i caratteri ascii. Quindi è davvero un processo multi-passo (confuso). – Kato

+0

Ottima risposta. Ho avuto questo stesso identico problema e questo si è preso cura di esso. –

16

utilizzare keydown. keypress non funziona con ESC in Chrome (non sono sicuro di altri browser).

$(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

Grazie per aver menzionato il bug di Chrome. Sarà utile a chi si chiede perché keypress stia effettivamente lavorando per loro in altri browser. – Gustus

1

Dopo il secondo avviso aggiungere anche

e.preventDefault(); 

Questo impedirà l'azione predefinita della manifestazione per essere attivato.

Maggiori informazioni su questo metodo here

Il codice dovrebbe essere simile

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

Per tasto ESC:

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

Per tasti delle lettere, come 'L':

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

funziona sia in Chrome e Firefox

0

utilizzando il file js Jquery.hotkey si può fare Sortcut chiave

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

Anche se questo snippet di codice può risolvere la domanda, [compresa una spiegazione] (http://meta.stackexchange.com/questions/114762/explaining-entally-code-based-answers) aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro, e queste persone potrebbero non conoscere le ragioni del tuo suggerimento sul codice. – DimaSan

0

pressione del tasto 'ESC'

e.which: 0 
e.keyCode: 27 

keyup 'ESC'

e.which: 27 
e.keyCode: 27 

Per i caratteri non stampabili utilizzare meglio keyup.

Problemi correlati