Estoy intentando simular un evento de teclado en Safari usando JavaScript.
He intentado esto:
var event = document.createEvent("KeyboardEvent");
event.initKeyboardEvent("keypress", true, true, null, false, false, false, false, 115, 0);
... y también esto:
var event = document.createEvent("UIEvents");
event.initUIEvent("keypress", true, true, window, 1);
event.keyCode = 115;
Sin embargo, después de probar ambos enfoques, tengo el mismo problema: después de ejecutar el código, las propiedades keyCode
/ which
del objeto de evento se establecen en 0
, no 115
.
¿Alguien sabe cómo crear y enviar de manera confiable un evento de teclado en Safari? (Preferiría lograrlo en JavaScript simple si es posible).
javascript
safari
webkit
dom-events
keyboard-events
Steve Harrison
fuente
fuente
Respuestas:
Estoy trabajando en DOM Keyboard Event Level 3 polyfill . En los últimos navegadores o con este polyfill, puede hacer algo como esto:
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})
ACTUALIZAR:
Ahora mi polyfill admite propiedades heredadas "keyCode", "charCode" y "which"
var e = new KeyboardEvent("keydown", { bubbles : true, cancelable : true, char : "Q", key : "q", shiftKey : true, keyCode : 81 });
Ejemplos aquí
Además, aquí está initKeyboardEvent entre navegadores por separado de mi polyfill: (gist)
Demostración de Polyfill
fuente
¿Enviaste el evento correctamente?
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"); } }
Si usa jQuery, podría hacer:
function simulateKeyPress(character) { jQuery.event.trigger({ type : 'keypress', which : character.charCodeAt(0) }); }
fuente
(evt.initKeyEvent || evt.initKeyboardEvent).call(evt, // etc.
event.keyCode
yevent.which
siempre devuelve 0. Es un error conocido y la solución es usar un evento regularvar event = document.createEvent('Event'); event.initEvent('keydown', true, true); event.keyCode = 76;
initKeyEvent
yinitKeyboardEvent
están DESAPARECIDOS .Esto se debe a un error en Webkit.
Puede solucionar el error de Webkit usando en
createEvent('Event')
lugar decreateEvent('KeyboardEvent')
, y luego asignando lakeyCode
propiedad. Vea esta respuesta y este ejemplo .fuente
La red de desarrolladores de Mozilla ofrece la siguiente explicación:
event = document.createEvent("KeyboardEvent")
utilizando:
yourElement.dispatchEvent(event)
No veo el último en tu código, tal vez eso es lo que te estás perdiendo. Espero que esto también funcione en IE ...
fuente
.initKeyEvent
ahora está obsoletoNo soy muy bueno con esto pero
KeyboardEvent
=> ver que KeyboardEvent se inicializa coninitKeyEvent
.Aquí hay un ejemplo para emitir un evento en un
<input type="text" />
elemento.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" />
fuente
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)
en safari :(