Domanda

Questo mi sta facendo noci. Il suo uno difficile da spiegare, ma avrò un andare.

Ho un campo di inserimento testo sulla prima pagina del mio sito. Ho codificato un osservatore evento KeyDown che controlla il keyCode e se il suo ENTER (o equiv), controllare itll il valore di ingresso (e-mail). Se l'e-mail è valido e unico nel DB itll inviare il modulo. roba di base, o almeno così si potrebbe pensare.

Se digito il mio indirizzo di posta elettronica nel campo e premere Invio, funziona benissimo in tutti i browser. Tuttavia, se si digita il primo paio di lettere, e quindi utilizzare i tasti freccia per selezionare l'e-mail dalla casella a discesa storia (spero che tu sai cosa voglio dire qui), quindi premere invio il risultato è diverso. Il valore del campo modulo viene catturato come solo la coppia di lettere che ho scritto, e quindi la validazione sta fallendo. Sembra che quando si preme il tasto Invio per "selezionare" l'e-mail dal menu a discesa la storia, il browser che interrompe come se stavo scrivendo.

In Chrome e Safari funziona come dovrebbe. Come è giusto che significa che quando si preme Invio a "selezionare" l'e-mail dal menu a discesa la storia, tutto ciò che fa è che mette indirizzo e-mail nella casella di testo. Solo al secondo INVIO premere il tasto vuol quindi attivare l'osservatore dell'evento, e l'e-mail viene convalidato.

La speranza qualcuno può far luce sul perché questo sta accadendo ... La mia sensazione è proprio una cosa browser e sarà qualcosa non posso correzione.

Grazie Lee

EDIT: Per aggiungere un chiarimento alla mia domanda mi permetta di aggiungere che Im utilizzando l'evento "KeyDown" per catturare il momento in cui la pressione del tasto ENTER. Ho provato l'evento "keyup" e questo risolto il mio problema di cui sopra, ma poi non posso sembrare di fermare il modulo Sottoporre da solo. L'evento "KeyUp" innesca dopo il comportamento di default, quindi la sua non è la scelta giusta per questo.

ULTERIORI EDIT:

Grazie ancora, e btw, il vostro inglese è eccellente (in risposta al tuo commento su Bad inglese).

Ho cambiato il mio gestore di eventi da questo:

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

a questo:

$("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 è consentito di svolgere l'azione di default prima di eseguire la funzione submitViaEnter che significa che il modulo è presentata quando ho colpito INVIO.

È stato utile?

Soluzione

Risposta alla domanda iniziale

Sì, è un bug Gecko (non Mac-specifica però).

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

[modifica] dal momento che hai chiesto per la chiarificazione del bug

Quando si preme Invio e il completamento automatico è attiva, Firefox (erroneamente) prima spara di gestione dei tasti della pagina, quindi di gestione dei tasti interno del browser che si chiude il popup di completamento automatico e aggiorna il valore di testo, mentre è probabilmente dovrebbe solo fuoco è al popup di completamento automatico e solo lasciare che il pagina di conoscere il valore di testo modificato.

Questo significa che quando il vostro gestore chiave si chiama, gestore del completamento automatico non è stato eseguito ancora - il popup di completamento automatico è ancora aperto e il valore casella di testo è come se fosse appena prima del completamento automatico è successo

.

Quando si aggiunge una chiamata setTimeout al gestore chiave che stai dicendo al browser "hey, eseguire questa funzione subito dopo aver finito di fare cose già nel vostro P1 to-do list". Così gestore del completamento automatico funziona, dal momento che è già nella lista delle cose da fare, quindi il codice si mette su un time-out viene eseguito -. Quando il popup di completamento automatico è già chiuso e il valore del testo aggiornato

[modifica] rispondendo alla domanda nella sezione "Ulteriori modifica"

destro. È necessario annullare l'azione predefinita nel gestore di eventi, non nel timeout, se si desidera farlo funzionare:

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 ancora voleva inviare il modulo su Invio, sarebbe un esercizio più interessante, ma non sembra che fai.

Altri suggerimenti

ok si è occupata. Grazie mille per il vostro aiuto. E 'stata la funzione di curry che mi mancava prima. Stavo cercando di lavorare sulla manifestazione all'interno del campo di applicazione della funzione di setTimeout.

Questo funziona sotto. Il submitViaEnter è chiamato dal eventobserver e risponde all'evento keyDown:

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

Arresto l'azione predefinita all'interno della eventObserver significava che nessun carattere potrebbero essere digitati. Così ho attaccato all'interno del se ENTER clausola chiave.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top