87 Stimmen

Auslösen eines Tastatur-Ereignisses in Safari, mit JavaScript

Ich versuche, ein Tastaturereignis in Safari mit JavaScript zu simulieren.

Ich habe dies versucht:

var event = document.createEvent("KeyboardEvent");
event.initKeyboardEvent("keypress", true, true, null, false, false, false, false, 115, 0);

...und auch dies:

var event = document.createEvent("UIEvents");
event.initUIEvent("keypress", true, true, window, 1);
event.keyCode = 115;

Nachdem ich beide Ansätze ausprobiert habe, habe ich jedoch das gleiche Problem: Nachdem der Code ausgeführt wurde, wird die keyCode / which Eigenschaften des Ereignisobjekts werden auf 0 , nicht 115 .

Weiß jemand, wie man ein Tastaturereignis in Safari zuverlässig erstellt und versendet? (Ich würde es vorziehen, es in einfachem JavaScript zu erreichen, wenn möglich).

0 Stimmen

Versuchen Sie, einen von Ihnen definierten Code oder eine Tastenkombination auszuführen, die der Browser versteht? Wenn es sich um Ihren eigenen Code handelt, wäre es vielleicht am besten, einen Event-Wrapper einzurichten, den Sie entweder über eine "echte" Tastaturschnittstelle oder über einen anderen Event-Generator aufrufen können, wie Sie es hier beschrieben haben. Refactoring nach Bedarf.

2 Stimmen

In diesem Beispiel versuche ich zu simulieren, dass der Benutzer "s" drückt. Letztendlich versuche ich zu simulieren, dass der Benutzer in einem Apple Dashboard Widget den Befehl R drückt.

2 Stimmen

Ihr Code hat mein Problem gelöst :)

44voto

termi Punkte 948

Ich arbeite an DOM Keyboard Event Level 3 Polyfill . In den neuesten Browsern oder mit diesem Polyfill können Sie etwas wie folgt tun:

element.addEventListener("keydown", function(e){ console.log(e.key, e.char, e.keyCode) })

var e = new KeyboardEvent("keydown", {bubbles : true, cancelable : true, key : "Q", char : "Q", shiftKey : true});
element.dispatchEvent(e);

//If you need legacy property "keyCode"
// Note: In some browsers you can't overwrite "keyCode" property. (At least in Safari)
delete e.keyCode;
Object.defineProperty(e, "keyCode", {"value" : 666})

UPDATE:

Jetzt unterstützt mein Polyfill die Legacy-Eigenschaften "keyCode", "charCode" und "which"

var e = new KeyboardEvent("keydown", {
    bubbles : true,
    cancelable : true,
    char : "Q",
    key : "q",
    shiftKey : true,
    keyCode : 81
});

Beispiele aquí

Zusätzlich hier ist Cross-Browser initKeyboardEvent getrennt von meinem Polyfill: (gist)

Polyfill Demo

0 Stimmen

Scheint nicht zu funktionieren, wenn man einen scrollbaren Bereich mit den Pfeil- oder Seite-nach-oben/nach-unten-Tasten nach unten scrollen will...

0 Stimmen

Ändern Sie Ihr jsfiddle, um das Ereignis für das Textfeld statt für das Dokument zu senden @ jsfiddle.net/vnathalye/yjc5F/974 . Obwohl der Tastendruck-Handler ausgelöst wird, wird der Text nicht im Textfeld angezeigt. Irgendeine Idee?

1 Stimmen

@termi Ihr Demo-Link ist tot

31voto

tyronegcarter Punkte 3786

Haben Sie das Ereignis korrekt versandt?

function simulateKeyEvent(character) {
  var evt = document.createEvent("KeyboardEvent");
  (evt.initKeyEvent || evt.initKeyboardEvent)("keypress", true, true, window,
                    0, 0, 0, 0,
                    0, character.charCodeAt(0)) 
  var canceled = !body.dispatchEvent(evt);
  if(canceled) {
    // A handler called preventDefault
    alert("canceled");
  } else {
    // None of the handlers called preventDefault
    alert("not canceled");
  }
}

Wenn Sie jQuery verwenden, können Sie das tun:

function simulateKeyPress(character) {
  jQuery.event.trigger({ type : 'keypress', which : character.charCodeAt(0) });
}

0 Stimmen

Es scheint, dass es einen Fehler in der Zeile gibt: evt.initKeyEvent . In Chromium habe ich keine Methode initKeyEvent in KeyboardEvent.prototype. Für mich muss es sein: evt.initKeyboardEvent

4 Stimmen

Ist es möglich, die Tastenkombination Strg + C (Kopieren) damit zu simulieren?

0 Stimmen

@EdPichler Es gibt eine spezielle API für die Interaktion mit dem Pasteboard, ich würde es nicht auf die harte Tour machen, indem ich ein Tastaturevent simuliere. Verwandte SO-Beiträge

18voto

John Punkte 27798

Dies ist zurückzuführen auf eine Fehler in Webkit.

Sie können den Webkit-Fehler umgehen, indem Sie createEvent('Event') statt createEvent('KeyboardEvent') und dann die Zuweisung der keyCode Eigentum. Siehe diese Antwort y dieses Beispiel .

8voto

Javache Punkte 3387

Le site Mozilla-Entwickler-Netzwerk liefert die folgende Erklärung:

  1. Erstellen Sie ein Ereignis mit event = document.createEvent("KeyboardEvent")
  2. Initiieren des Schlüsselereignisses

verwenden:

event.initKeyEvent (type, bubbles, cancelable, viewArg, 
       ctrlKeyArg, altKeyArg, shiftKeyArg, metaKeyArg, 
           keyCodeArg, charCodeArg)
  1. Versenden Sie das Ereignis mit yourElement.dispatchEvent(event)

Ich sehe den letzten Punkt in Ihrem Code nicht, vielleicht ist es das, was Sie vermissen. Ich hoffe, das funktioniert auch im IE...

3 Stimmen

Leider ist die Implementierung von Mozilla nicht standardisiert. Was Punkt 3 anbelangt, so besteht mein Problem darin, das richtige Ereignis zu erzeugen - das Versenden des Ereignisses kommt erst danach. Und da ich für Apples Dashboard entwickle, muss ich mich um den IE überhaupt nicht kümmern! (Juchhu!)

7 Stimmen

.initKeyEvent ist jetzt veraltet

1voto

vutar Punkte 29

Ich bin nicht sehr gut auf diesem Gebiet, aber KeyboardEvent => siehe KeyboardEvent wird initialisiert mit initKeyEvent .
Hier ist ein Beispiel für das Senden von Ereignissen bei <input type="text" /> Element

document.getElementById("txbox").addEventListener("keypress", function(e) {
  alert("Event " + e.type + " emitted!\nKey / Char Code: " + e.keyCode + " / " + e.charCode);
}, false);

document.getElementById("btn").addEventListener("click", function(e) {
  var doc = document.getElementById("txbox");
  var kEvent = document.createEvent("KeyboardEvent");
  kEvent.initKeyEvent("keypress", true, true, null, false, false, false, false, 74, 74);
  doc.dispatchEvent(kEvent);
}, false);

<input id="txbox" type="text" value="" />
<input id="btn" type="button" value="CLICK TO EMIT KEYPRESS ON TEXTBOX" />

7 Stimmen

Es zeigt js:21TypeError: kEvent.initKeyEvent is not a function. (In 'kEvent.initKeyEvent("keypress", true, true, null, false, false, false, false, 74, 74)', 'kEvent.initKeyEvent' is undefined) in safari :(

0 Stimmen

Es sollte sein: var kEvent = document.createEvent("KeyboardEvent"); kEvent.initKeyboardEvent("keypress", true, true, null, false, false, false, false, false, 74, 74); document.dispatchEvent(kEvent);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X