[Javascript] Ho problemi con l'evento keydown e completamento automatico in Firefox su mac


Answers

ok lo ho risolto Grazie mille per il vostro aiuto. Era la funzione di curry che mi mancava prima. Stavo cercando di lavorare sull'evento nell'ambito della funzione setTimeout.

Questo funziona di seguito. SubmitViaEnter viene chiamato dal server degli eventi 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;
}

L'interruzione dell'azione predefinita all'interno di eventObserver significava che nessun carattere poteva essere digitato. Quindi mi sono bloccato all'interno della clausola se INVIO.

Question

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.