Ich versuche, ein Tastaturereignis in Safari mit JavaScript zu simulieren.
Ich habe das versucht:
var event = document.createEvent("KeyboardEvent");
event.initKeyboardEvent("keypress", true, true, null, false, false, false, false, 115, 0);
... und auch das:
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, werden die keyCode
/ which
-Eigenschaften des Ereignisobjekts auf 0
nicht gesetzt 115
.
Weiß jemand, wie man ein Tastaturereignis in Safari zuverlässig erstellt und versendet? (Ich würde es vorziehen, wenn möglich in einfachem JavaScript zu erreichen.)
javascript
safari
webkit
dom-events
keyboard-events
Steve Harrison
quelle
quelle
Antworten:
Ich arbeite an der Polyfüllung DOM Keyboard Event Level 3 . In den neuesten Browsern oder mit dieser Polyfüllung können Sie Folgendes 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})
AKTUALISIEREN:
Jetzt unterstützt meine Polyfüllung die alten Eigenschaften "keyCode", "charCode" und "which".
var e = new KeyboardEvent("keydown", { bubbles : true, cancelable : true, char : "Q", key : "q", shiftKey : true, keyCode : 81 });
Beispiele hier
Zusätzlich ist hier browserübergreifendes initKeyboardEvent getrennt von meiner Polyfüllung: (gist)
Polyfill- Demo
quelle
Haben Sie die Veranstaltung 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 Folgendes tun:
function simulateKeyPress(character) { jQuery.event.trigger({ type : 'keypress', which : character.charCodeAt(0) }); }
quelle
(evt.initKeyEvent || evt.initKeyboardEvent).call(evt, // etc.
event.keyCode
undevent.which
immer 0 zurückgeben. Es ist ein bekannter Fehler und die Problemumgehung besteht darin, ein reguläres Ereignis zu verwendenvar event = document.createEvent('Event'); event.initEvent('keydown', true, true); event.keyCode = 76;
initKeyEvent
undinitKeyboardEvent
sind DEPRECATED .Dies liegt an einem Fehler im Webkit.
Sie können den Webkit-Fehler umgehen, indem Sie
createEvent('Event')
stattcreateEvent('KeyboardEvent')
und dann diekeyCode
Eigenschaft zuweisen . Siehe diese Antwort und dieses Beispiel .quelle
Das Mozilla Developer Network bietet die folgende Erklärung:
event = document.createEvent("KeyboardEvent")
mit:
yourElement.dispatchEvent(event)
Ich sehe den letzten in Ihrem Code nicht, vielleicht fehlt Ihnen das. Ich hoffe das funktioniert auch im IE ...
quelle
.initKeyEvent
ist jetzt veraltetIch bin nicht sehr gut damit, aber
KeyboardEvent
=> siehe KeyboardEvent wird mit initialisiertinitKeyEvent
.Hier ist ein Beispiel für das Ausgeben eines Ereignisses für ein
<input type="text" />
Elementdocument.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" />
quelle
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 :(