Ist es möglich, Tastendruckereignisse programmgesteuert in JavaScript zu simulieren?
javascript
dom-events
bräunen
quelle
quelle
Antworten:
Eine Nicht-JQuery-Version, die sowohl im Webkit als auch im Gecko funktioniert:
quelle
keyCode
ist immer 0 und ich kann es nicht ändern.event.which
immer0
bei der Verwendung istdocument.createEvent("KeyboardEvent")
. @lluft teilte die Details und eine Problemumgehung, die für mich funktionierte, in diesem Kommentar zu einem anderen Thread. Grundsätzlich müssen Siedocument.createEvent('Event')
ein generisches Ereignis erstellen und dann den Typ auf setzenkeydown
und einekeyCode
Eigenschaft angeben, die dem Zeichencode des Schlüssels entspricht.Wenn Sie jQuery 1.3.1 verwenden können:
quelle
trigger
dies nicht zur Nachahmung nativer Browserereignisse verwendet werden kann .Was Sie tun können, ist das programmgesteuerte Auslösen von Keyevent-Listenern durch Auslösen von Keyevents . Es ist sinnvoll, dies aus Sicht der Sandbox-Sicherheit zuzulassen. Mit dieser Fähigkeit können Sie dann ein typisches Beobachtermuster anwenden . Sie können diese Methode "simulieren" nennen.
Im Folgenden finden Sie ein Beispiel dafür, wie dies im W3C-DOM-Standard zusammen mit jQuery erreicht werden kann:
Dieses Beispiel wurde angepasst von: https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events
In jQuery:
Seit kurzem gibt es jedoch keine [DOM] -Methode, um Keyevents auszulösen, die die Browser-Sandbox verlassen. Alle großen Browser-Anbieter werden sich an dieses Sicherheitskonzept halten.
Plugins wie Adobe Flash, die auf dem NPAPI basieren und die Umgehung der Sandbox ermöglichen, werden schrittweise eingestellt . Firefox .
Ausführliche Erklärung:
Sie können und dürfen aus Sicherheitsgründen nicht (wie Pekka bereits betont hat). Sie benötigen immer eine Benutzerinteraktion dazwischen. Stellen Sie sich außerdem die Möglichkeit vor, dass die Browser-Anbieter von Benutzern verklagt werden, da verschiedene programmatische Tastaturereignisse zu Spoofing-Angriffen geführt haben.
In diesem Beitrag finden Sie Alternativen und weitere Details. Es gibt immer das Flash-basierte Kopieren und Einfügen. Hier ist ein elegantes Beispiel . Gleichzeitig ist es ein Zeugnis dafür, warum sich das Web von Plugin-Anbietern entfernt.
Bei der Opt-In-CORS-Richtlinie für den programmgesteuerten Zugriff auf Remoteinhalte gilt eine ähnliche Sicherheitseinstellung .
Die Antwort lautet:
Unter normalen Umständen gibt es in der Sandbox-Browserumgebung keine Möglichkeit, Eingabetasten programmgesteuert auszulösen .
Fazit: Ich sage nicht, dass dies in Zukunft unter speziellen Browsermodi und / oder Privilegien für das Endziel des Spielens oder ähnliche Benutzererfahrungen nicht möglich sein wird. Vor dem Aufrufen solcher Modi wird der Benutzer jedoch nach Berechtigungen und Risiken gefragt, ähnlich wie beim Vollbild-API-Modell .
Nützlich: Im Kontext von KeyCodes sind dieses Tool und die Zuordnung von Keycodes nützlich.
Offenlegung: Die Antwort basiert auf der Antwort hier .
quelle
Sie können Tastaturereignisse für ein Element wie dieses auslösen
quelle
keypress
mit abgeschrieben wirdkeydown
stattdessen -> developer.mozilla.org/en-US/docs/Web/Events/keypressSie können verwenden
dispatchEvent()
:Ich habe dies nicht getestet, aber es wurde aus dem Code in der Dokumentation von dispatchEvent () angepasst . Sie werden das wahrscheinlich auch lesen wollen, und auch die Dokumente für createEvent () und initKeyEvent ().
quelle
initKeyEvent
oderinitKeyboardEvent()
. Beide sind zugunsten der Verwendung des Konstruktors KeyboardEvent () veraltet .Sie können Tastaturereignisse erstellen und auslösen, die entsprechende registrierte Ereignishandler auslösen. Sie erzeugen jedoch keinen Text , wenn sie beispielsweise an ein Eingabeelement gesendet werden.
Um die Texteingabe vollständig zu simulieren, müssen Sie eine Folge von Tastaturereignissen erstellen und den Text des Eingabeelements explizit festlegen. Die Reihenfolge der Ereignisse hängt davon ab, wie gründlich Sie die Texteingabe simulieren möchten.
Die einfachste Form wäre:
quelle
In einigen Fällen
keypress
kann das Ereignis nicht die erforderliche Funktionalität bieten. Aus Mozilla-Dokumenten können wir ersehen , dass die Funktion veraltet ist:Da das
keypress
Ereignis aus den beiden folglich ausgelösten Ereignissenkeydown
und dem folgendenkeyup
für denselben Schlüssel kombiniert wird , generieren Sie die Ereignisse einfach einzeln:quelle
Aufbauend auf der Antwort von alex2k8 ist hier eine überarbeitete Version, die in allen von jQuery unterstützten Browsern funktioniert (das Problem bestand darin, dass Argumente für jQuery.event.trigger fehlten, die bei Verwendung dieser internen Funktion leicht zu vergessen sind).
Sie können dies sogar noch weiter vorantreiben und nicht nur das Ereignis simulieren lassen, sondern auch das Zeichen einfügen (wenn es sich um ein Eingabeelement handelt). Es gibt jedoch viele browserübergreifende Fallstricke, wenn Sie dies versuchen. Verwenden Sie besser ein ausgefeilteres Plugin wie SendKeys .
quelle
Für Interessierte können Sie tatsächlich Tastatureingabeereignisse zuverlässig neu erstellen. Um den Text im Eingabebereich zu ändern (Cursor oder Seite über ein Eingabezeichen verschieben), müssen Sie dem DOM-Ereignismodell genau folgen: http://www.w3.org/TR/DOM-Level-3-Events/ # h4_events-inputevents
Das Modell sollte Folgendes tun:
Dann für jeden Charakter:
Dann optional für die meisten:
Dies ändert tatsächlich den Text auf der Seite über Javascript (ohne die Wertanweisungen zu ändern) und löst alle Javascript-Listener / -Handler entsprechend aus. Wenn Sie die Sequenz durcheinander bringen, wird Javascript nicht in der richtigen Reihenfolge ausgelöst, der Text im Eingabefeld ändert sich nicht, die Auswahl ändert sich nicht oder der Cursor bewegt sich nicht zum nächsten Leerzeichen im Textbereich.
Leider wurde der Code für einen Arbeitgeber unter einer NDA geschrieben, so dass ich ihn nicht teilen kann, aber es ist definitiv möglich, aber Sie müssen den gesamten Schlüsseleingabestapel für jedes Element in der richtigen Reihenfolge neu erstellen.
quelle
Ab 2019 hat diese Lösung für mich funktioniert:
Ich habe dies in meinem Browsergame verwendet, um mobile Geräte mit einer simulierten Tastatur zu unterstützen.
Erläuterung: Dieser Code
keydown
löst ein einzelnes Ereignis aus, während ein echter Tastendruck einkeydown
Ereignis (oder mehrere davon, wenn es länger gehalten wird) und dann einkeyup
Ereignis auslöst , wenn Sie diese Taste loslassen. Wenn Siekeyup
Ereignisse zu, ist es auch möglich zu simulierenkeyup
Ereignisse durch Änderung"keydown"
zu"keyup"
Snippet in dem Code.Dadurch wird das Ereignis auch an die gesamte Webseite gesendet, daher die
document
. Wenn Sie möchten, dass nur ein bestimmtes Element das Ereignis empfängt, können Siedocument
das gewünschte Element ersetzen .quelle
Trusted
?)Dieser Ansatz unterstützt die browserübergreifende Änderung des Werts des Schlüsselcodes . Quelle
quelle
Verwenden Sie einfach CustomEvent
4 ex wollen Strg + z simulieren
quelle
Hier ist eine Bibliothek, die wirklich hilft: https://cdn.rawgit.com/ccampbell/mousetrap/2e5c2a8adbe80a89050aaf4e02c45f02f1cc12d4/tests/libs/key-event.js
Ich weiß nicht, woher es kam, aber es ist hilfreich. Es fügt eine
.simulate()
Methode hinzuwindow.KeyEvent
, sodass Sie sie einfach mitKeyEvent.simulate(0, 13)
zum Simulieren einesenter
oderKeyEvent.simulate(81, 81)
eines verwenden können'Q'
.Ich habe es unter https://github.com/ccampbell/mousetrap/tree/master/tests erhalten .
quelle
Dies hat bei mir funktioniert und simuliert ein Keyup für meine Textaera. wenn Sie es für die gesamte Seite nur die wollen setzen
KeySimulation()
auf<body>
wie diese<body onmousemove="KeySimulation()">
oder wenn nichtonmousemove
dannonmouseover
oderonload
Werke zu.quelle
initKeyboardEvent
veraltet ist. ( Quelle )Aufgrund der einfachen Verwendung in einem Konsolenkontext war es einmal einzeilig. Aber wahrscheinlich immer noch nützlich.
quelle
Hier ist eine Lösung, die in Chrome und Chromium funktioniert (habe nur diese Plattformen getestet). Es scheint, dass Chrome einen Fehler oder einen eigenen Ansatz beim Umgang mit Schlüsselcodes hat, daher muss diese Eigenschaft separat zum KeyboardEvent hinzugefügt werden.
quelle
Folgendes habe ich gefunden:
quelle
Natives JavaScript mit TypeScript-unterstützter Lösung:
Geben Sie den keyCode oder die von Ihnen verwendete Eigenschaft ein und wandeln Sie ihn in KeyboardEventInit um
Beispiel
quelle
Das habe ich mit js / typescript in Chrome versucht. Dank dieser Antwort für die Inspiration.
quelle
Sobald der Benutzer die betreffende Taste drückt, können Sie einen Verweis darauf speichern und ihn für jedes andere HTML-Element verwenden:
Sie können den keyCode festlegen, wenn Sie ein eigenes Ereignis erstellen. Sie können vorhandene Parameter von jedem realen Tastaturereignis kopieren (Ziele ignorieren, da es die Aufgabe von dispatchEvent ist) und:
quelle
Ich weiß, dass die Frage nach einer Javascript-Methode zur Simulation eines Tastendrucks fragt. Aber für diejenigen, die nach einer jQuery-Methode suchen:
quelle
Der entscheidende Teil, um dies zum Laufen zu bringen, besteht darin
charCode
, dies zu erkennenkeyCode
undwhich
sind allesamt veraltete Methoden . Daher wenn die Codeverarbeitung das Tastendruckereignis verarbeitet, eine dieser drei verwendet, erhält er daher eine falsche Antwort (z. B. eine Standardeinstellung von 0).Solange Sie mit einer nicht veralteten Methode auf das Tastendruckereignis zugreifen, z
key
sollten Sie in Ordnung sein.Zum Abschluss habe ich den grundlegenden Javascript-Code zum Auslösen des Ereignisses hinzugefügt:
quelle
Ich wollte ein Drücken der Tabulatortaste simulieren ... Wenn wir Trevors Antwort erweitern, können wir sehen, dass eine spezielle Taste wie "Tabulatortaste" gedrückt wird, aber wir sehen nicht das tatsächliche Ergebnis, das ein Drücken der Tabulatortaste hätte. .
Es wurde versucht, diese Ereignisse für 'activeElement' sowie das globale Dokumentobjekt auszulösen. Beide - Code für beide unten hinzugefügt;
Ausschnitt unten:
quelle