Definitive Möglichkeit, Tastendruckereignisse mit jQuery auszulösen


260

Ich habe alle Antworten auf diese Fragen gelesen und keine der Lösungen scheint zu funktionieren.

Außerdem bekomme ich die Stimmung, dass das Auslösen eines Tastendrucks mit Sonderzeichen überhaupt nicht funktioniert. Kann jemand überprüfen, wer dies getan hat?


14
Nein, Sie vermissen das Konzept verstanden. So soll es nicht funktionieren. Der Trigger ruft nur den Ereignishandler auf. Der Schlüssel wird nicht gedruckt. Wenn Sie den Effekt des Druckens des Schlüssels simulieren möchten, fügen Sie den Schlüssel einfach zum Eingabewert hinzu und lösen gleichzeitig das Ereignis aus.
Nadia Alramli

Interessant, das wusste ich nicht. Können Sie mir in diesem Fall sagen, ob das Auslösen des Ereignisses auch für Nicht-JQuery-Bibliotheken ausgelöst wird? Wenn ich beispielsweise ein onKeydown in einfachem JS eingerichtet habe, wird es dann mein "falsches" Ereignis erfassen?
Mkoryak

2
ja, wenn es ein onkeydown = '...' gab, das in plain js eingerichtet wurde. Es wird durch das gefälschte Ereignis ausgelöst. Ich war mir nicht sicher. Aber ich habe einen kurzen Test gemacht und es hat funktioniert.
Nadia Alramli

2
@ Nadia Danke dafür! Ich habe alle Antworten durchgelesen und mich gefragt, warum die Dinge nicht funktionierten, bevor mir klar wurde, dass meine Erwartungen nicht korrekt waren. Ich vermute, dass viele andere Menschen die gleichen Missverständnisse haben werden.
Mikemaccana

3
Zwei Jahre später ... beim Lesen der Seite scheint der endgültige Weg zu sein: $ ('input # search'). Trigger ($. Event ('keydown', {which: $. Ui.keyCode.ENTER, keyCode: $ .ui.keyCode.ENTER}));
Molokoloco

Antworten:


365

Wenn Sie das Tastendruck- oder Keydown-Ereignis auslösen möchten, müssen Sie lediglich Folgendes tun:

var e = jQuery.Event("keydown");
e.which = 50; // # Some key code value
$("input").trigger(e);

42
Die Frage ist, wie man auslöst, nicht wie man fängt
Chad Grant

2
Ich habe ein Beispiel für die Auslösung des Ereignisses hinzugefügt
Nadia Alramli

4
Sehr schöne Antwort. Es ist erwähnenswert, dass jQuery.Event für jQuery 1.3 oder höher verfügbar ist. Es wurde relevant in dieser Frage: stackoverflow.com/questions/1823617/…
artlung

8
Dies funktionierte bei einem Schieberegler für die jQuery-Benutzeroberfläche nicht. Ich musste e.keyCode wie die Antwort von OreiA unten einstellen.
CrizCraig

2
fwiw, ich hatte mehr Erfolg mit 'keyup' für meine Bewerbung
markieren Sie den

81

Mit jQuery 1.6+ jetzt etwas prägnanter :

var e = jQuery.Event( 'keydown', { which: $.ui.keyCode.ENTER } );

$('input').trigger(e);

(Wenn Sie die jQuery-Benutzeroberfläche nicht verwenden, geben Sie stattdessen den entsprechenden Schlüsselcode ein.)


4
Denken Sie daran, "keyCode" auch durch "which" zu ersetzen.
Richard Nienaber

Ja, Sie müssen definieren, welcher und keyCode sicher sein sollen (wenn der Ereignis-Listener nach e.keyCode sucht, funktioniert dies nur, wenn Sie beim Erstellen des jQuery.Event-Objekts
keyCode

1
jQuery normalisiert, welcher / keyCode also beides bewirkt, sollte beides bewirken.
Nigel Angel

+1 für den Link zu api.jquery.com; und aktuelle jQuery-Versionen normalisieren nicht welchen / keyCode, daher sollten Sie aus Sicherheitsgründen beide angeben
Victor

2
@SamuelLindblom Ich hätte es klarer schreiben sollen: jQuery normalisiert keine über übergebenen Ereigniseigenschaften .trigger(jQuery.Event('name', props)). Schauen Sie sich das Beispiel jsfiddle.net/9ggmrbpd/1 an - Eigenschaften des ausgelösten Ereignisses werden unverändert übergeben. Quellcode: github.com/jquery/jquery/blob/master/src/event.js#L739
Victor

68

Die eigentliche Antwort muss keyCode enthalten:

var e = jQuery.Event("keydown");
e.which = 50; // # Some key code value
e.keyCode = 50
$("input").trigger(e);

Obwohl auf der Website von jQuery angegeben ist, dass which und keyCode normalisiert sind, liegen sie sehr falsch. Es ist immer am sichersten, die standardmäßigen browserübergreifenden Überprüfungen für e.which und e.keyCode durchzuführen und in diesem Fall nur beide zu definieren.


34
+1. Übrigens e.keyCode = e.which = 50;wäre in einer einzigen Zeile schöner. :)
Sk8erPeter

Ich habe gerade herausgefunden, dass die Verwendung nur keyCodefunktioniert. Musste beide einstellen, damit es funktioniert
Tasos K.

@ Sk8erPeter wird es nicht, es sei denn, es ist ein Golph-Codierungswettbewerb
Shabunc

18

Wenn Sie auch die jQuery-Benutzeroberfläche verwenden, können Sie Folgendes tun:

var e = jQuery.Event("keypress");
e.keyCode = $.ui.keyCode.ENTER;
$("input").trigger(e);

1
Dies scheint mit meinem jQuery UI-Schieberegler nicht zu funktionieren. Danke für diese Antwort. Es funktioniert.
CrizCraig

5

Ich habe es mit Keyup zum Laufen gebracht.

$("#id input").trigger('keyup');

3
In meiner Frage vor 6 Jahren wollte ich auch den Schlüsselcode einstellen, wusste aber nicht wie.
Mkoryak

4

Ok, für mich funktioniert das damit ...

var e2key = function(e) {
    if (!e) return '';
    var event2key = {
        '96':'0', '97':'1', '98':'2', '99':'3', '100':'4', '101':'5', '102':'6', '103':'7', '104':'8', '105':'9', // Chiffres clavier num
        '48':'m0', '49':'m1', '50':'m2', '51':'m3', '52':'m4', '53':'m5', '54':'m6', '55':'m7', '56':'m8', '57':'m9', // Chiffres caracteres speciaux
        '65':'a', '66':'b', '67':'c', '68':'d', '69':'e', '70':'f', '71':'g', '72':'h', '73':'i', '74':'j', '75':'k', '76':'l', '77':'m', '78':'n', '79':'o', '80':'p', '81':'q', '82':'r', '83':'s', '84':'t', '85':'u', '86':'v', '87':'w', '88':'x', '89':'y', '90':'z', // Alphabet
        '37':'left', '39':'right', '38':'up', '40':'down', '13':'enter', '27':'esc', '32':'space', '107':'+', '109':'-', '33':'pageUp', '34':'pageDown' // KEYCODES
    };
    return event2key[(e.which || e.keyCode)];
};

var page5Key = function(e, customKey) {
    if (e) e.preventDefault();
    switch(e2key(customKey || e)) {
        case 'left': /*...*/ break;
        case 'right': /*...*/ break;
    }
};

$(document).bind('keyup', page5Key);

$(document).trigger('keyup', [{preventDefault:function(){},keyCode:37}]); 

2

Falls Sie den aktuellen Cursor und die aktuelle Textauswahl berücksichtigen müssen ...

Bei einer AngularJS-App auf Chrome funktionierte dies nicht. Wie Nadia in den ursprünglichen Kommentaren betont, ist der Charakter im Eingabefeld nie sichtbar (zumindest war das meine Erfahrung). Darüber hinaus berücksichtigen die vorherigen Lösungen nicht die aktuelle Textauswahl im Eingabefeld. Ich musste eine wundervolle Bibliotheksauswahl verwenden .

Ich habe einen benutzerdefinierten Ziffernblock auf dem Bildschirm, der mehrere Eingabefelder ausfüllt. Ich musste...

  1. Speichern Sie im Fokus das lastFocus.element
  2. Speichern Sie bei Unschärfe die aktuelle Textauswahl (Start und Stopp).

    var pos = element.selection('getPos')
    lastFocus.pos = { start: pos.start, end: pos.end}
  3. Wenn eine Taste auf meiner Tastatur gedrückt wird:

    lastFocus.element.selection( 'setPos', lastFocus.pos)
    lastFocus.element.selection( 'replace', {text: myKeyPadChar, caret: 'end'})

2

Sie möchten es in einer einzigen Zeile tun, die Sie verwenden können

$("input").trigger(jQuery.Event('keydown', { which: '1'.charCodeAt(0) }));

1

console.log( String.fromCharCode(event.charCode) );

Ich denke, es ist nicht nötig, einen Charakter zuzuordnen.


1

Dies kann wie folgt erreicht werden

$('input').trigger("keydown", {which: 50});

1
Dies scheint nicht zu funktionieren, da hierfür das Argument extraParameters verwendet wird, das nichts innerhalb des Ereignisarguments festlegt, sondern dem Rückruf des Ereignishandlers zusätzliche Argumente hinzufügt.
TimeWaster

1
Keine gültige Lösung
Entwickler
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.