Tir d'un Événement de Clavier en JavaScript
Je suis en train de simuler un événement de clavier en Safari à l'aide de JavaScript.
J'ai essayé ceci:
var event = document.createEvent("KeyboardEvent");
event.initKeyboardEvent("keypress", true, true, null, false, false, false, false, 115, 0);
...et aussi ceci:
var event = document.createEvent("UIEvents");
event.initUIEvent("keypress", true, true, window, 1);
event.keyCode = 115;
Après avoir essayé les deux approches, cependant, j'ai le même problème: une fois que le code a été exécuté, le keyCode
/which
propriétés de l'objet d'événement sont mis à 0
, pas 115
.
Personne ne sait comment fiable pour créer et envoyer un événement de clavier dans Safari? (Je préfère la réaliser dans la plaine du JavaScript, si possible.)
- Êtes-vous essayer d'exécuter du code que vous avez défini ou certains de combinaison de touche le navigateur comprend? Si c'est votre propre code, il peut être préférable à l'installation d'un wrapper d'événement que vous pouvez appeler via un "vrai" clavier de l'interface ou via un autre événement générateur, comme vous l'avez décrit ici. Le Refactoring, selon le cas.
- Dans cet exemple, je suis en train de simuler l'utilisateur en appuyant sur "s". En fin de compte, je suis en train de simuler l'utilisateur en appuyant sur Commande-R dans un Apple Dashboard Widget.
- Votre code a résolu mon problème 🙂
- Mon plaisir! 🙂
- Cela peut être utile: jquery.keymasher.
- Double de Simuler le JavaScript Événements Clés
- Selon le spec., seulement
key
etcode
sont pris en charge.
Vous devez vous connecter pour publier un commentaire.
Je suis en train de travailler sur DOM Événement de Clavier Niveau 3 polyfill . Dans les navigateurs les plus récents ou avec ce polyfill vous pouvez faire quelque chose comme ceci:
Mise à JOUR:
Maintenant mon polyfill prend en charge l'héritage des propriétés "keyCode", "charCode" et "qui"
Exemples ici
En outre ici est cross-browser initKeyboardEvent séparément de ma polyfill: (gist)
Polyfill démo
Avez-vous l'envoi de l'événement correctement?
Si vous utilisez jQuery, vous pouvez faire:
evt.initKeyEvent
. Dans Chrome je n'ai pas de méthode initKeyEvent dans KeyboardEvent.le prototype. Pour moi, c'est:evt.initKeyboardEvent
(evt.initKeyEvent || evt.initKeyboardEvent).call(evt, // etc.
j'aimerais conserver le contexte de l'invocation de la méthode, juste au cas où les méthodes sont à l'aide dethis
en interne...(evt.initKeyEvent || evt.initKeyboardEvent).call(evt, // etc.
event.keyCode
etevent.which
retourne toujours 0. C'est un bug connu et la solution de contournement consiste à utiliser un événement réguliervar event = document.createEvent('Event'); event.initEvent('keydown', true, true); event.keyCode = 76;
initKeyEvent
etinitKeyboardEvent
sont DEPRECATED.Cela est dû à un bug dans Webkit.
Vous pouvez travailler autour de la Webkit bug à l'aide de
createEvent('Event')
plutôt quecreateEvent('KeyboardEvent')
, puis en attribuant lakeyCode
de la propriété. Voir cette réponse et cet exemple.La Mozilla Developer Network fournit l'explication suivante:
event = document.createEvent("KeyboardEvent")
à l'aide de:
yourElement.dispatchEvent(event)
Je ne vois pas le dernier dans votre code, c'est peut-être ce que vous êtes absent. J'espère que cela fonctionne dans IE ainsi...
.initKeyEvent
est maintenant obsolèteJe ne suis pas très bon avec cela, mais
KeyboardEvent
=> voir KeyboardEventest initialisé avec
initKeyEvent
.Voici un exemple pour l'émission de l'événement sur
<input type="text" />
élémentJS:
HTML:
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)
dans safari 🙁