¿Es posible simular eventos de pulsación de teclas mediante programación en JavaScript?
javascript
dom-events
bronceado
fuente
fuente
Respuestas:
Una versión no jquery que funciona tanto en webkit como en gecko:
fuente
keyCode
siempre es 0 y no puedo cambiarlo.event.which
que siempre esté presente0
cuando se usadocument.createEvent("KeyboardEvent")
. @lluft compartió los detalles y una solución alternativa, que funcionó para mí, en este comentario en un hilo diferente. Básicamente, debe usardocument.createEvent('Event')
para crear un evento genérico y luego establecer el tipo enkeydown
ykeyCode
asignar una propiedad igual al código de código de la clave.Si está bien usar jQuery 1.3.1:
fuente
trigger
no se puede utilizar para imitar eventos de navegador nativos .Lo que puede hacer es activar mediante programación los oyentes keyevent disparando eventos keyevent . Tiene sentido permitir esto desde una perspectiva de seguridad de espacio aislado. Con esta habilidad, puede aplicar un patrón típico de observador . Podría llamar a este método "simulación".
A continuación se muestra un ejemplo de cómo lograr esto en el estándar W3C DOM junto con jQuery:
Este ejemplo está adaptado de: https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events
En jQuery:
Pero a partir de hace poco, no existe una forma [DOM] de desencadenar eventos clave que abandonan el entorno limitado del navegador. Y todos los principales proveedores de navegadores se adherirán a ese concepto de seguridad.
En cuanto a los complementos como Adobe Flash, que se basan en el NPAPI, y permiten pasar por alto el sandbox: estos están desapareciendo gradualmente ; Firefox .
Explicación detallada:
No puede y no debe por razones de seguridad (como Pekka ya señaló). Siempre necesitará una interacción del usuario en el medio. Además, imagine la posibilidad de que los proveedores de navegadores sean demandados por los usuarios, ya que varios eventos de teclado programáticos han llevado a ataques de suplantación de identidad.
Vea esta publicación para alternativas y más detalles. Siempre existe el flash basado en copiar y pegar. Aquí hay un ejemplo elegante . Al mismo tiempo, es un testimonio de por qué la web se está alejando de los proveedores de complementos.
Existe una mentalidad de seguridad similar aplicada en el caso de la política opcional de CORS para acceder al contenido remoto mediante programación.
La respuesta es:
no hay forma de activar las teclas de entrada mediante programación en el entorno del navegador de espacio aislado en circunstancias normales .
En pocas palabras : no estoy diciendo que no será posible en el futuro, bajo modos especiales de navegador y / o privilegios hacia el objetivo final de los juegos, o experiencias de usuario similares. Sin embargo, antes de ingresar a tales modos, se le solicitará al usuario permisos y riesgos, similar al modelo de API de pantalla completa .
Útil: en el contexto de KeyCodes, esta herramienta y el mapeo de códigos clave serán útiles.
Divulgación: la respuesta se basa en la respuesta aquí .
fuente
Puede enviar eventos de teclado en un elemento como este
fuente
keypress
se deprecia, usando en sukeydown
lugar -> developer.mozilla.org/en-US/docs/Web/Events/keypressPuedes usar
dispatchEvent()
:No probé esto, pero está adaptado del código en la documentación de dispatchEvent () . Probablemente quiera leer eso, y también los documentos para createEvent () y initKeyEvent ().
fuente
initKeyEvent
o noinitKeyboardEvent()
. Ambos están en desuso a favor del uso del constructor KeyboardEvent () .Puede crear y enviar eventos de teclado, y activarán los controladores de eventos registrados apropiados, sin embargo , no producirán ningún texto , si se envían al elemento de entrada, por ejemplo.
Para simular completamente la entrada de texto, debe producir una secuencia de eventos de teclado y configurar explícitamente el texto del elemento de entrada. La secuencia de eventos depende de cuán completamente desee simular la entrada de texto.
La forma más simple sería:
fuente
En algunos casos, el
keypress
evento no puede proporcionar la funcionalidad requerida. De los documentos de Mozilla podemos ver que la característica está en desuso:Entonces, dado que el
keypress
evento se combina a partir de los dos eventos consecuentemente disparadoskeydown
, y el siguientekeyup
para la misma clave, solo genera los eventos uno por uno:fuente
Sobre la base de la respuesta de alex2k8, aquí hay una versión revisada que funciona en todos los navegadores que admite jQuery (el problema estaba en la falta de argumentos para jQuery.event.trigger, que es fácil de olvidar al usar esa función interna).
Incluso podría llevar esto más lejos y dejar que no solo simule el evento, sino que realmente inserte el carácter (si es un elemento de entrada), sin embargo, hay muchos trucos entre navegadores al intentar hacerlo. Mejor use un complemento más elaborado como SendKeys .
fuente
A partir de 2019, esta solución me ha funcionado:
Utilicé esto en mi juego de navegador, para admitir dispositivos móviles con un teclado simulado.
Aclaración: este código despacha un solo
keydown
evento, mientras que una pulsación de tecla real activaría unkeydown
evento (o varios de ellos si se mantiene más tiempo), y luego unkeyup
evento cuando sueltas esa tecla. Si necesitakeyup
eventos también, también es posible simularkeyup
eventos cambiando"keydown"
a"keyup"
en el fragmento de código.Esto también envía el evento a toda la página web, de ahí el
document
. Si solo desea que un elemento específico reciba el evento, puede sustituirlodocument
por el elemento deseado.fuente
Trusted
?)Para aquellos interesados, de hecho, puede recrear eventos de entrada de teclado de manera confiable. Para cambiar el texto en el área de entrada (mover cursores o la página a través de un carácter de entrada) debe seguir de cerca el modelo de evento DOM: http://www.w3.org/TR/DOM-Level-3-Events/ # h4_events-inputevents
El modelo debe hacer:
Luego para cada personaje:
Entonces, opcionalmente para la mayoría:
En realidad, esto cambia el texto en la página a través de javascript (sin modificar las declaraciones de valor) y activa los oyentes / controladores de javascript adecuadamente. Si estropea la secuencia, JavaScript no se activará en el orden apropiado, el texto en el cuadro de entrada no cambiará, las selecciones no cambiarán o el cursor no se moverá al siguiente espacio en el área de texto.
Desafortunadamente, el código fue escrito para un empleador bajo un NDA, por lo que no puedo compartirlo, pero definitivamente es posible, pero debe recrear toda la "pila" de entrada clave para cada elemento en el orden correcto.
fuente
Este enfoque admite el uso de varios navegadores para cambiar el valor del código clave . Fuente
fuente
solo usa CustomEvent
4 ex quieren simular ctrl + z
fuente
Aquí hay una biblioteca que realmente ayuda: https://cdn.rawgit.com/ccampbell/mousetrap/2e5c2a8adbe80a89050aaf4e02c45f02f1cc12d4/tests/libs/key-event.js
No sé de dónde vino, pero es útil. Agrega un
.simulate()
método awindow.KeyEvent
, por lo que lo usa simplementeKeyEvent.simulate(0, 13)
para simular unenter
oKeyEvent.simulate(81, 81)
para un'Q'
.Lo obtuve en https://github.com/ccampbell/mousetrap/tree/master/tests .
fuente
Esto funcionó para mí y simula un keyup para mi textaera. si lo desea para toda la página sólo hay que poner el
KeySimulation()
sobre<body>
como esto<body onmousemove="KeySimulation()">
o si noonmousemove
a continuación,onmouseover
oonload
las obras también.fuente
initKeyboardEvent
está en desuso. ( Fuente )Se remaron una sola vez debido al uso fácil en un contexto de consola. Pero probablemente útil aún.
fuente
Aquí hay una solución que funciona en Chrome y Chromium (solo he probado estas plataformas). Parece que Chrome tiene algún error o enfoque propio para manejar códigos clave, por lo que esta propiedad debe agregarse por separado al KeyboardEvent.
fuente
Esto es lo que logré encontrar:
fuente
JavaScript nativo con solución compatible con TypeScript:
Escriba keyCode o la propiedad que esté utilizando y transmítala a KeyboardEventInit
Ejemplo
fuente
Eso es lo que probé con js / typecript en Chrome. Gracias a esta respuesta por inspiración.
fuente
tan pronto como el usuario presione la tecla en cuestión, puede almacenar una referencia a eso incluso y usarla en cualquier otro elemento HTML:
puede establecer el KeyCode si crea su propio evento, puede copiar los parámetros existentes de cualquier evento de teclado real (ignorando los objetivos ya que es el trabajo de dispatchEvent) y:
fuente
Sé que la pregunta pide una forma de JavaScript para simular una pulsación de tecla. Pero para aquellos que buscan una forma jQuery de hacer las cosas:
fuente
La parte crítica para lograr que esto funcione es darse cuenta de eso
charCode
,keyCode
y todoswhich
son métodos obsoletos . Por lo tanto, si el código que procesa el evento de pulsación de tecla usa cualquiera de estos tres, recibirá una respuesta falsa (por ejemplo, un valor predeterminado de 0).Siempre que acceda al evento de pulsación de tecla con un método no obsoleto, como
key
, debería estar bien.Para completar, agregué el código Javascript básico para activar el evento:
fuente
Quería simular una prensa 'Tab' ... Ampliando la respuesta de Trevor, podemos ver que se presiona una tecla especial como 'tab' pero no vemos el resultado real que tendría una prensa 'tab' ... .
intenté despachar estos eventos para 'activeElement', así como el objeto de documento global, ambos: el código para ambos se agrega a continuación;
fragmento a continuación:
fuente