Listener JavaScript, "keypress" non rileva backspace?


141

Sto usando un keypressascoltatore ad es.

addEventListener("keypress", function(event){

}

Tuttavia, questo non sembra rilevare un backspace che cancella il testo ...

C'è un ascoltatore diverso che posso usare per rilevare questo?

Risposte:


167

Evento Pressione viene richiamato solo carattere chiavi (stampabili), KeyDown è sollevato per tutti, anche non stampabile come Control, Shift, Alt, BackSpace, etc.

AGGIORNARE:

L'evento keypress viene generato quando viene premuto un tasto e quel tasto normalmente produce un valore di carattere

Riferimento .


3
Non strettamente vero: molte chiavi non stampabili generano keypresseventi in molti browser. Vedi unixpapa.com/js/key.html
Tim Down

Nella versione corrente di Mozilla, backspace e tutto viene rilevato nell'evento keypress.
Iniravpatel,

70

Prova keydowninvece di keypress.

Gli eventi della tastiera si verificano in questo ordine: keydown, keyup,keypress

Il problema con backspace è probabilmente che il browser tornerà indietro keyupe quindi la tua pagina non vedrà l' keypressevento.


Non ho esaminato gli standard, ma l'ordine degli eventi (almeno in Firefox 37) sembra essere keydown keypress keyup. unixpapa.com/js/testkey.html
jxmallett

Sembra anche che, per eventi chiave negli input, il personaggio non appaia nel campo fino a quando l' keyupevento non viene generato.
jxmallett,

Ultimo - Su iOS (8.2) il tasto Backspace genera solo un keydownevento ma il personaggio non viene rimosso dall'input fino a dopo.
jxmallett,

questa è la risposta questo cattura il tasto Canc e premi Ctrl + V tasto
user1709076

30

L' keypressevento potrebbe essere diverso nei browser.

Ho creato un Jsfiddle per confrontare gli eventi della tastiera (usando le scorciatoie JQuery) su Chrome e Firefox. A seconda del browser in uso keypress, verrà attivato o meno un evento: il backspace verrà attivato keydown/keypress/keyupsu Firefox ma solo keydown/keyupsu Chrome.

Eventi a clic singolo attivati

su Chrome

  • keydown/keypress/keyupquando il browser registra un input da tastiera ( keypressviene attivato)

  • keydown/keyup se nessun input da tastiera (testato con alt, shift, backspace, tasti freccia)

  • keydown solo per scheda?

su Firefox

  • keydown/keypress/keyupquando il browser registra un input da tastiera ma anche per backspace, tasti freccia, tab (quindi qui keypressviene attivato anche senza input)

  • keydown/keyup per alt, maiusc


Questo non dovrebbe sorprendere perché secondo https://api.jquery.com/keypress/ :

Nota: poiché l'evento keypress non è coperto da alcuna specifica ufficiale, il comportamento effettivo riscontrato durante l'utilizzo potrebbe differire tra browser, versioni del browser e piattaforme.

L'uso del tipo di evento keypress è deprecato da W3C ( http://www.w3.org/TR/DOM-Level-3-Events/#event-type-keypress )

Il tipo di evento keypress è definito in questa specifica per riferimento e completezza, ma questa specifica deprezza l'utilizzo di questo tipo di evento. Durante la modifica dei contesti, gli autori possono invece iscriversi all'evento beforeinput.


Infine, per rispondere alla tua domanda, è necessario utilizzare keyupo keydownrilevare un backspace su Firefox e Chrome.


Provalo qui:

$(".inputTxt").bind("keypress keyup keydown", function (event) {
    var evtType = event.type;
    var eWhich = event.which;
    var echarCode = event.charCode;
    var ekeyCode = event.keyCode;

    switch (evtType) {
        case 'keypress':
            $("#log").html($("#log").html() + "<b>" + evtType + "</b>" + " keycode: " + ekeyCode + " charcode: " + echarCode + " which: " + eWhich + "<br>");
            break;
        case 'keyup':
            $("#log").html($("#log").html() + "<b>" + evtType + "</b>" + " keycode: " + ekeyCode + " charcode: " + echarCode + " which: " + eWhich + "<p>");
            break;
        case 'keydown':
            $("#log").html($("#log").html() + "<b>" + evtType + "</b>" + " keycode: " + ekeyCode + " charcode: " + echarCode + " which: " + eWhich + "<br>");
            break;
        default:
            break;
    }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<input class="inputTxt" type="text" />
<div id="log"></div>


1
Risposta eccezionale - principalmente per la spiegazione dei diversi modi di gestire il backspace tra i browser
Jivan,

2
W3School l'ha già fatto: w3schools.com/jsref/…
Tân

1
Lo snippet di codice è stato molto utile
John Gilmer,

17

Qualcosa che ho scritto in caso qualcuno si imbatta in un problema con le persone che colpiscono il backspace mentre pensano di essere in un campo del modulo

window.addEventListener("keydown", function(e){
    /*
     * keyCode: 8
     * keyIdentifier: "U+0008"
    */
    if(e.keyCode === 8 && document.activeElement !== 'text') {
        e.preventDefault();
        alert('Prevent page from going back');
    }
});

8

Il mio controllo numerico:

function CheckNumeric(event) {
    var _key = (window.Event) ? event.which : event.keyCode;
    if (_key > 95 && _key < 106) {
        return true;
    }
    else if (_key > 47 && _key < 58) {
        return true;
    }
    else {
        return false;
    }
}

<input type="text" onkeydown="return CheckNumerick(event);" />

Provalo

Il codice chiave BackSpace è 8


6

event.key === "Backspace"

Più recente e molto più pulito: usare event.key. Niente più codici numerici arbitrari!

note.addEventListener('keydown', function(event) {
    const key = event.key; // const {key} = event; ES6+
    if (key === "Backspace") {
        // Do something
    }
});

Mozilla Docs

Browser supportati


1
Nel 2018 questo è il modo migliore per farlo!
tfantina,

Ho usato il codice chiave 8 per il backspace in ogni singola lingua con cui ho lavorato. Impara i codici ASCII, non sono arbitrari.
André Werlang,

3
Solo perché hai stato utilizzato non significa che non v'è una scelta migliore. .keyè attualmente l'opzione consigliata dai documenti. Inoltre, supporta varie tastiere internazionali con mappature diverse per ogni dato tasto. Non sono arbitrari nel senso che sono
corretti

2

Utilizzare invece uno degli eventi keyup / keydown / beforeinput.

sulla base di questo riferimento, la pressione dei tasti è obsoleta e non è più consigliata.

L'evento keypress viene generato quando viene premuto un tasto che produce un valore di carattere. Esempi di chiavi che producono un valore di carattere sono i tasti alfabetici, numerici e di punteggiatura. Esempi di chiavi che non producono un valore di carattere sono i tasti modificatori come Alt, Maiusc, Ctrl o Meta.

se usi "beforeinput" fai attenzione alla compatibilità con il tuo browser . la differenza tra "beforeinput" e gli altri due è che "beforeinput" viene attivato quando il valore di input sta per essere modificato, quindi con caratteri che non possono modificare il valore di input, non viene attivato (ad esempio shift, ctr, alt).

Ho avuto lo stesso problema e usando il keyup è stato risolto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.