javascript keyboardevent - Ho problemi con l'evento keydown e completamento automatico in Firefox su mac




1 Answers

Rispondi alla domanda originale

Sì, è un bug Gecko (non specifico per Mac).

L'ultima parte di questo commento contiene la descrizione del work-around: utilizzare il time-out.

[modifica] da quando hai chiesto il chiarimento del bug

Quando si preme Invio e il completamento automatico è attivo, Firefox (erroneamente) attiva prima il gestore di chiavi della pagina, quindi il gestore di chiavi interno del browser che chiude il popup di completamento automatico e aggiorna il valore dell'area di testo, mentre probabilmente dovrebbe semplicemente attivarlo popup di completamento automatico e consente solo alla pagina di conoscere il valore della casella di testo modificato.

Ciò significa che quando viene chiamato il gestore di chiavi, il gestore del completamento automatico non è ancora in esecuzione - il popup di completamento automatico è ancora aperto e il valore della casella di testo è come se fosse appena prima del completamento automatico.

Quando aggiungi una chiamata setTimeout al tuo gestore di chiavi stai dicendo al browser "hey, esegui questa funzione subito dopo aver finito di fare cose già nella tua lista di cose da fare in P1". Quindi il gestore del completamento automatico viene eseguito, poiché è già presente nell'elenco delle cose da fare, quindi viene eseguito il codice inserito in un timeout, quando il popup del completamento automatico è già chiuso e il valore della casella di testo viene aggiornato.

[modifica] rispondendo alla domanda in "Ulteriori modifiche"

Destra. È necessario annullare l'azione predefinita nel gestore eventi, non nel timeout, se si desidera che funzioni:

function onKeyPress(ev) {
  if (... enter pressed ...) {
    setTimeout(function() {
      ... check the new textbox value after letting autocomplete work ...
    }, 0);
    // but cancel the default behavior (submitting the form) directly in the event listener
    ev.preventDefault();
    return false;
  }
}

Se vuoi ancora inviare il modulo su Invio, sarebbe un esercizio più interessante, ma non sembra che tu lo faccia.

escape keypress

Questo mi sta facendo impazzire. È difficile da spiegare ma ci provo.

Ho un campo di testo di input sulla prima pagina del mio sito. Ho codificato un osservatore di eventi keydown che controlla il keyCode e se è ENTER (o equiv), controlla il valore di input (email). Se l'e-mail è valida e unica nel DB, verrà inviato il modulo. Roba di base, o così si potrebbe pensare.

Se digito il mio indirizzo e-mail nel campo e premo invio, funziona perfettamente con tutti i browser. Tuttavia, se digito la prima coppia di lettere, e poi usare i tasti freccia per selezionare l'e-mail dalla casella a discesa della cronologia (spero tu sappia cosa intendo qui), e quindi premi invio il risultato è diverso. Il valore del campo modulo viene acquisito come solo la coppia di lettere che ho digitato, e quindi la validazione sta fallendo. Sembra che quando premo il tasto Invio per "selezionare" l'e-mail dal menu a discesa della cronologia, il browser lo interrompe come se stessi scrivendo.

In Chrome e Safari funziona come dovrebbe. Come dovrebbe significare che quando si preme Invio per "selezionare" l'e-mail dal menu a discesa della cronologia, tutto ciò che fa è mettere quell'indirizzo e-mail nella casella di testo. Solo premendo il secondo tasto INVIO, viene attivato l'osservatore dell'evento e l'e-mail viene convalidata.

Spero che qualcuno possa far luce sul perché questo sta accadendo ... Il mio istinto è una cosa da browser e sarà qualcosa che non posso aggiustare.

Grazie Lee

EDIT: per aggiungere un chiarimento alla mia domanda, aggiungo che sto usando l'evento "keydown" per catturare il momento in cui viene premuto il tasto invio. Ho provato l'evento "keyup" e questo ha risolto il mio problema sopra, ma poi non riesco a fermare il modulo che presenta da solo. L'evento "keyup" si attiva dopo il comportamento predefinito, quindi non è la scelta giusta per questo.

ULTERIORE MODIFICA:

Grazie ancora, e btw, il tuo inglese è eccellente (in risposta al tuo commento sul cattivo inglese).

Ho cambiato il mio gestore di eventi da questo:

$("emailInputBox").observe("keydown", function(event) {
    return submitViaEnter(event, submitSignupFormOne);
});

a questa:

$("emailInputBox").observe("keydown", function(event) {
    setTimeout(submitViaEnter.curry(event, submitSignupFormOne),0);
});

submitViaEnter :

function submitViaEnter(event, callback) {
var code = event.keyCode;
if (code == Event.KEY_RETURN) {
    event.stop();
    return callback(event);
}
return true;
}

Sembra funzionare, ma il problema ora è che il browser è autorizzato a eseguire l'azione predefinita prima di eseguire la funzione submitViaEnter , il che significa che il modulo viene inviato quando submitViaEnter INVIO.




Related

javascript macos firefox prototypejs keycode