Come rilevare `delete` e` .` quando l’utente preme la tastiera su Chrome?

Quando premo spara i tre eventi, keydown , keypress e keyup .

 keydown which: 190 == ¾ keyCode: 190 == ¾ keypress which: 46 == . keyCode: 46 == . keyup which: 190 == ¾ keyCode: 190 == ¾ 

Quando premo delete , vengono keydown due eventi, keydown e keyup .

 keydown which: 46 == . keyCode: 46 == . keyup which: 46 == . keyCode: 46 == . 

Voglio premere . ed essere in grado di ottenere il carattere corrispondente ( 46 == . ). Ma su keydown e keyup ottengo 190 che è ¾ . Sulla keypress del keypress ottengo il valore corretto, ma questo evento non viene triggersto quando si preme delete .

Quando premo delete ottengo il codice 46 su keydown e keyup . Ma il codice 46 è un . e non delete .

Come posso creare un evento per catturare entrambe le chiavi e dire la differenza, se fosse a . premuto o delete chiave?

Pagina da testare: http://jsfiddle.net/Eg9F3/

Penso che la soluzione migliore sarebbe quella di mappare le chiavi che vuoi ( demo ), quindi usare e.which per fare un riferimento incrociato su quale tasto è stato premuto. C’è un buon riferimento ai valori del e.which cross-browser, che funzionano in questo caso perché jQuery normalizza il valore e.which .

 var keys = { 46 : 'del', 190 : '.' }; $("textarea").bind('keyup', function(e){ $('#r').append( 'keyup (' + e.which + '): ' + (keys[e.which] || String.fromCharCode(e.which)) ); }); 

Questo è simile al metodo utilizzato dall’interfaccia utente di jQuery : vedere il riferimento incrociato dei keycode nella parte superiore del file? Ed è anche il metodo che uso nel plugin keycaster .

In effetti è strano ma è logico.

La funzione String.fromCharCode funziona con codice reale del codice, non con le azioni KB (sinistra, elimina …)

Perché non filtrare semplicemente da keyCode?

Ho forzato lo stesso comportamento di Firefox, ad esempio su jsFiddle

 $("textarea").keydown(function(e) { // if the key pressed was found on the list of specialChars if (specialChars[e.keyCode]) { // triggers the fake event $("textarea").trigger("chromekeypress", e); // temporary avoid keypress from firing $("textarea").unbind("keypress"); setTimeout(function(){ $("textarea").bind("keypress", handleKey); },10); } }); $("textarea").keypress(handleKey); // main event $("textarea").bind("chromekeypress", chromeKeyPress); // chrome workaround function chromeKeyPress(i,e){ e.type="chromekeypress"; e.which = 0; // copy Firefox behavior, which == 0 means a special key pressed handleKey(e); // fires the main event } function handleKey(e) { // which is going to be 0 if it is a special key // and keycode will have the code of the special key // or // which will have the value of the key $("#r").html($("#r").html() + "\n" + e.type + "\n" + " which: " + e.which + " == " + String.fromCharCode(e.which) + "\n" + " keyCode: " + e.keyCode + " == " + String.fromCharCode(e.keyCode) + "\n" + ""); } 

Il valore di “which” in un gestore “keypress” non ha lo stesso significato di “which” in un gestore “keydown” o “keyup”. In quelli, è il codice chiave per il tasto sulla tastiera e non un ordinale per i caratteri. In “keypress” è il carattere, ma non si ottiene un “keypress” per Del (come hai notato).

Quindi, questo è un diverso 46 nel gestore “keypress” (per “.”) Che negli eventi “keydown” e “keyup” per Del .

Probabilmente dovresti usare “keydown” o “keyup” e controllare il keycode.