Ich versuche, die folgende, scheinbar einfache Sache zu tun.
Wenn eine Taste gedrückt wird, mit der ein Zeichen in ein Texteingabefeld eingegeben worden wäre, und dieser Tastendruck nicht bereits anderweitig verarbeitet wird (z. B. weil kein Eingabefeld den Fokus hatte), dann ein bestimmtes Eingabefeld fokussieren und das Zeichen dort eingeben .
Dies dient dazu, den Nutzern einen Mausklick in einem Browserspiel zu ersparen, das schnelle Antworten erfordert, könnte aber ebenso gut z. B. in einer Chat-Anwendung verwendet werden. Wenn der Benutzer versehentlich vergisst, dieses (große und offensichtliche) Eingabefeld zu fokussieren, dann möchte ich dies elegant behandeln und ihn nicht bestrafen.
Vorbehalte:
- Wenn ein Eingabefeld den Fokus hat, sollte das Ereignis dorthin gehen und nirgendwo anders.
- Tasten, die keine Zeichen eingeben (Enter, Pfeiltasten, PgUp, PgDn, ...), sollten ihr Standardverhalten beibehalten.
Mit jQuery, kam ich mit etwas wie dieses:
$(document).keypress(function(e) {
var input = $("#my-input-field");
if (e.which >= ' ' && !input.is(":focus")) {
input.focus();
input.trigger(e);
e.preventDefault();
}
});
Dies funktioniert jedoch nicht, und zwar aus zwei Gründen:
- Die Ereignisse sprudeln immer noch zu
document
auch wenn ein bestimmtes Eingabefeld sie verarbeitet. Mögliche Lösungen:- Einhaken
keypress
Ereignisbehandler für alle Eingabefelder und rufenstopPropagation
aber das klingt nach einem furchtbaren Hack, der nur darauf wartet, schief zu gehen. - Überprüfen Sie in der oben genannten Handler, ob ein Eingabefeld derzeit den Fokus hat, und ignorieren Sie es, wenn ja, aber das klingt wie ich würde einige Eckfälle, wo etwas anderes ist mit den Tastendrucken zu verpassen.
- Einhaken
- Aufruf von
.trigger(e)
funktioniert nicht. Es ruft meine benutzerdefinierte Event-Handler, aber nicht auslösen die defautkeypress
Verhalten des tatsächlichen Einfügens des Zeichens.
Was ist der sauberste Ausweg?