Est-il possible de simuler des événements de presse clés par programmation en JavaScript?
javascript
dom-events
bronzer
la source
la source
Réponses:
Une version non jquery qui fonctionne à la fois dans webkit et gecko:
la source
keyCode
est toujours 0 et je ne peux pas le changer.event.which
soit toujours0
lors de l'utilisationdocument.createEvent("KeyboardEvent")
. @lluft a partagé les détails et une solution de contournement, qui a fonctionné pour moi, dans ce commentaire sur un autre fil. Fondamentalement, vous devez utiliserdocument.createEvent('Event')
pour créer un événement générique, puis définir le typekeydown
et attribuer unekeyCode
propriété égale au code de caractère de la clé.Si vous êtes d'accord pour utiliser jQuery 1.3.1:
la source
trigger
cela ne peut pas être utilisé pour imiter les événements du navigateur natif .Ce que vous pouvez faire est de déclencher par programme auditeurs KeyEvent en tirant KeyEvents . Il est logique de permettre cela dans une perspective de sécurité en bac à sable. En utilisant cette capacité, vous pouvez ensuite appliquer un modèle d' observateur typique . Vous pouvez appeler cette méthode "simulation".
Vous trouverez ci-dessous un exemple de la façon de réaliser cela dans le standard DOM W3C avec jQuery:
Cet exemple est adapté de: https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events
Dans jQuery:
Mais récemment, il n'y a aucun moyen [DOM] de déclencher réellement des événements clés quittant le sandbox du navigateur. Et tous les principaux fournisseurs de navigateurs adhéreront à ce concept de sécurité.
Quant aux plugins tels qu'Adobe Flash - qui sont basés sur le NPAPI -, et permettent de contourner le bac à sable: ils sont en phase de suppression ; Firefox .
Explication détaillée:
Vous ne pouvez pas et vous ne devez pas le faire pour des raisons de sécurité (comme Pekka l'a déjà souligné). Vous aurez toujours besoin d'une interaction utilisateur entre les deux. Imaginez également la possibilité que les fournisseurs de navigateurs soient poursuivis en justice par les utilisateurs, car divers événements de clavier programmés auront conduit à des attaques d'usurpation.
Voir cet article pour des alternatives et plus de détails. Il y a toujours le copier-coller basé sur Flash. Voici un exemple élégant . Dans le même temps, c'est un témoignage de la raison pour laquelle le Web s'éloigne des fournisseurs de plugins.
Un état d'esprit de sécurité similaire est appliqué dans le cas de la stratégie opt-in CORS pour accéder au contenu distant par programmation.
La réponse est:
il n'y a aucun moyen de déclencher par programmation des clés d'entrée dans l'environnement de navigateur en bac à sable dans des circonstances normales .
Bottomline: Je ne dis pas que cela ne sera pas possible à l'avenir, sous des modes de navigateur spéciaux et / ou des privilèges vers l'objectif final du jeu, ou des expériences utilisateur similaires. Cependant, avant d'accéder à de tels modes, il sera demandé à l'utilisateur des autorisations et des risques, similaires au modèle d'API plein écran .
Utile: dans le contexte de KeyCodes, cet outil et le mappage de codes clés seront utiles.
Divulgation: La réponse est basée sur la réponse ici .
la source
Vous pouvez envoyer des événements de clavier sur un élément comme celui-ci
la source
keypress
être déprécié, en utilisant à lakeydown
place -> developer.mozilla.org/en-US/docs/Web/Events/keypressVous pouvez utiliser
dispatchEvent()
:Je n'ai pas testé cela, mais il est adapté du code de la documentation de dispatchEvent () . Vous voudrez probablement lire cela, ainsi que les documents pour createEvent () et initKeyEvent ().
la source
initKeyEvent
ouinitKeyboardEvent()
. Les deux sont déconseillés en faveur de l'utilisation du constructeur KeyboardEvent () .Vous pouvez créer et distribuer des événements de clavier, et ils déclencheront des gestionnaires d'événements enregistrés appropriés, mais ils ne produiront aucun texte , s'ils sont distribués à l'élément d'entrée par exemple.
Pour simuler entièrement la saisie de texte, vous devez produire une séquence d'événements de clavier et définir explicitement le texte de l'élément d'entrée. La séquence d'événements dépend de la profondeur avec laquelle vous souhaitez simuler la saisie de texte.
La forme la plus simple serait:
la source
Dans certains cas, l'
keypress
événement ne peut pas fournir la fonctionnalité requise. À partir de la documentation de Mozilla, nous pouvons voir que la fonctionnalité est déconseillée:Ainsi, puisque l'
keypress
événement est combiné à partir des deux événements déclenchés en conséquencekeydown
, et les suivantskeyup
pour la même clé, générez simplement les événements un par un:la source
S'appuyant sur la réponse de alex2k8, voici une version révisée qui fonctionne dans tous les navigateurs pris en charge par jQuery (le problème résidait dans les arguments manquants à jQuery.event.trigger, ce qui est facile à oublier lors de l'utilisation de cette fonction interne).
Vous pouvez même pousser cela plus loin et le laisser non seulement simuler l'événement mais également insérer le personnage (s'il s'agit d'un élément d'entrée), mais il existe de nombreux accrochages entre navigateurs lorsque vous essayez de le faire. Mieux vaut utiliser un plugin plus élaboré comme SendKeys .
la source
Depuis 2019, cette solution a fonctionné pour moi:
Je l'ai utilisé dans mon jeu par navigateur, afin de prendre en charge les appareils mobiles avec un clavier simulé.
Clarification: ce code envoie un seul
keydown
événement, tandis qu'une véritable pression sur une touche déclencherait unkeydown
événement (ou plusieurs d'entre eux si elle est maintenue plus longtemps), puis unkeyup
événement lorsque vous relâchez cette touche. Si vous avez également besoin d'keyup
événements, il est également possible de simuler deskeyup
événements en passant"keydown"
à"keyup"
dans l'extrait de code.Cela envoie également l'événement à la page Web entière, d'où le
document
. Si vous souhaitez que seul un élément spécifique reçoive l'événement, vous pouvez remplacerdocument
l'élément souhaité.la source
Trusted
?)Pour les personnes intéressées, vous pouvez en fait recréer de manière fiable les événements d'entrée au clavier. Pour modifier le texte dans la zone de saisie (déplacer les curseurs ou la page via un caractère de saisie), vous devez suivre de près le modèle d'événement DOM: http://www.w3.org/TR/DOM-Level-3-Events/ # h4_events-inputevents
Le modèle devrait faire:
Puis pour chaque personnage:
Ensuite, éventuellement pour la plupart:
Cela modifie en fait le texte de la page via javascript (sans modifier les instructions de valeur) et déclenche les écouteurs / gestionnaires javascript de manière appropriée. Si vous vous trompez, la séquence javascript ne se déclenchera pas dans l'ordre approprié, le texte dans la zone de saisie ne changera pas, les sélections ne changeront pas ou le curseur ne se déplacera pas à l'espace suivant dans la zone de texte.
Malheureusement, le code a été écrit pour un employeur sous un NDA, donc je ne peux pas le partager, mais c'est certainement possible mais vous devez recréer la "pile" d'entrée de clé entière pour chaque élément dans le bon ordre.
la source
Cette approche prend en charge plusieurs navigateurs pour modifier la valeur du code clé . La source
la source
utilisez simplement CustomEvent
4 ex veulent simuler ctrl + z
la source
Voici une bibliothèque qui aide vraiment: https://cdn.rawgit.com/ccampbell/mousetrap/2e5c2a8adbe80a89050aaf4e02c45f02f1cc12d4/tests/libs/key-event.js
Je ne sais pas d'où cela vient, mais c'est utile. Il ajoute une
.simulate()
méthode àwindow.KeyEvent
, donc vous l'utilisez simplement avecKeyEvent.simulate(0, 13)
pour simuler unenter
ouKeyEvent.simulate(81, 81)
pour un'Q'
.Je l'ai eu sur https://github.com/ccampbell/mousetrap/tree/master/tests .
la source
Cela a fonctionné pour moi et il simule une touche pour ma textaera. si vous le voulez pour la page entière vient de mettre le
KeySimulation()
sur<body>
comme celui - ci<body onmousemove="KeySimulation()">
ou sinononmousemove
alorsonmouseover
ouonload
fonctionne aussi.la source
initKeyboardEvent
c'est obsolète. ( Source )Il a été ramé une seule fois en raison d'une utilisation facile dans un contexte de console. Mais probablement encore utile.
la source
Voici une solution qui fonctionne dans Chrome et Chromium (n'ont testé que ces plateformes). Il semble que Chrome ait un bug ou une approche propre pour gérer les codes clés, cette propriété doit donc être ajoutée séparément à KeyboardEvent.
la source
Voici ce que j'ai réussi à trouver:
la source
JavaScript natif avec solution prise en charge par TypeScript:
Tapez le keyCode ou la propriété que vous utilisez et convertissez-la en KeyboardEventInit
Exemple
la source
C'est ce que j'ai essayé avec js / typescript en chrome. Merci à cette réponse pour l'inspiration.
la source
dès que l'utilisateur appuie sur la touche en question, vous pouvez stocker une référence à cela même et l'utiliser sur n'importe quel autre élément HTML:
vous pouvez définir le keyCode si vous créez votre propre événement, vous pouvez copier les paramètres existants à partir de n'importe quel événement de clavier réel (en ignorant les cibles puisque c'est le travail de dispatchEvent) et:
la source
Je sais que la question demande une méthode javascript pour simuler une pression de touche. Mais pour ceux qui recherchent une manière jQuery de faire les choses:
la source
La partie critique pour que cela fonctionne est de réaliser cela
charCode
,keyCode
et cewhich
sont toutes des méthodes obsolètes . Par conséquent, si le traitement du code l'événement de pression de touche utilise l'un de ces trois, il recevra alors une réponse fausse (par exemple, une valeur par défaut de 0).Tant que vous accédez à l'événement de pression de touche avec une méthode non obsolète, par exemple
key
, vous devriez être OK.Pour terminer, j'ai ajouté le code Javascript de base pour déclencher l'événement:
la source
Je voulais simuler une pression sur "Tab" ... En développant la réponse de Trevor, nous pouvons voir qu'une touche spéciale comme "tab" est pressée mais nous ne voyons pas le résultat réel qu'une presse "tab" aurait .. .
essayé de distribuer ces événements pour 'activeElement' ainsi que pour l'objet document global both - code pour les deux ajouté ci-dessous;
extrait ci-dessous:
la source