É possível simular eventos de pressionamento de tecla programaticamente em JavaScript?
javascript
dom-events
bronzeado
fonte
fonte
Respostas:
Uma versão não-jquery que funciona no webkit e no gecko:
fonte
keyCode
é sempre 0 e não posso alterá-lo.event.which
com que sempre ocorra0
ao usardocument.createEvent("KeyboardEvent")
. O @lluft compartilhou os detalhes e uma solução alternativa, que funcionou para mim, neste comentário em um tópico diferente. Basicamente, você precisa usardocument.createEvent('Event')
para criar um evento genérico e, em seguida, definir o tipokeydown
e fornecer umakeyCode
propriedade igual ao código da chave.Se você está bem para usar o jQuery 1.3.1:
fonte
trigger
não pode ser usado para imitar eventos nativos do navegador .O que você pode fazer é acionar programaticamente os ouvintes do evento de chave acionando eventos de chave . Faz sentido permitir isso de uma perspectiva de segurança em área restrita. Usando essa capacidade, você pode aplicar um padrão típico de observador . Você pode chamar esse método de "simulação".
Abaixo está um exemplo de como fazer isso no padrão W3C DOM junto com o jQuery:
Este exemplo é adaptado de: https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events
No jQuery:
Mas, recentemente, não há [DOM] maneira de realmente acionar eventos importantes saindo da caixa de proteção do navegador. E todos os principais fornecedores de navegadores seguirão esse conceito de segurança.
Quanto aos plug-ins como o Adobe Flash - que são baseados no NPAPI -, e permitem ignorar a sandbox: eles são eliminados gradualmente ; Firefox .
Explicação detalhada:
Você não pode e não deve por motivos de segurança (como já destacou Pekka). Você sempre exigirá uma interação do usuário no meio. Além disso, imagine a chance de os fornecedores de navegadores serem processados pelos usuários, pois vários eventos programáticos do teclado levaram a ataques de falsificação.
Veja este post para alternativas e mais detalhes. Há sempre o copiar e colar baseado em flash. Aqui está um exemplo elegante . Ao mesmo tempo, é um testemunho do motivo pelo qual a Web está se afastando dos fornecedores de plug-ins.
Existe uma mentalidade de segurança semelhante aplicada no caso da política do opt-in para acessar conteúdo remoto programaticamente.
A resposta é:
Não há como acionar programaticamente chaves de entrada no ambiente do navegador em área restrita em circunstâncias normais .
Conclusão: não estou dizendo que não será possível no futuro, sob modos especiais de navegador e / ou privilégios em relação ao objetivo final dos jogos ou experiências similares do usuário. No entanto, antes de entrar nesses modos, o usuário será solicitado a fornecer permissões e riscos, semelhantes ao modelo da API de tela cheia .
Útil: No contexto de KeyCodes, essa ferramenta e o mapeamento de código de chave serão úteis.
Divulgação: a resposta é baseada na resposta aqui .
fonte
Você pode despachar eventos do teclado em um elemento como este
fonte
keypress
foi depreciado, usandokeydown
-> developer.mozilla.org/pt-BR/docs/Web/Events/keypressVocê pode usar
dispatchEvent()
:Não testei isso, mas ele foi adaptado do código na documentação de dispatchEvent () . Você provavelmente vai querer ler isso e também os documentos para createEvent () e initKeyEvent ().
fonte
initKeyEvent
ou nãoinitKeyboardEvent()
. Ambos foram descontinuados em favor do uso do construtor KeyboardEvent () .Você pode criar e despachar eventos do teclado, e eles acionarão os manipuladores de eventos registrados apropriados; no entanto, eles não produzirão nenhum texto , se despachados para o elemento de entrada, por exemplo.
Para simular totalmente a entrada de texto, você precisa produzir uma sequência de eventos do teclado e definir explicitamente o texto do elemento de entrada. A sequência de eventos depende de quão profundamente você deseja simular a entrada de texto.
A forma mais simples seria:
fonte
Em alguns casos, o
keypress
evento não pode fornecer a funcionalidade necessária. Nos documentos do mozilla , podemos ver que o recurso foi descontinuado:Portanto, como o
keypress
evento é combinado dos dois eventos acionados consequentementekeydown
, e o seguintekeyup
para a mesma chave, apenas gere os eventos um por um:fonte
Com base na resposta do alex2k8, aqui está uma versão revisada que funciona em todos os navegadores suportados pelo jQuery (o problema estava na falta de argumentos para o jQuery.event.trigger, o que é fácil esquecer ao usar essa função interna).
Você pode ir além e simular não apenas o evento, mas também inserir o caractere (se for um elemento de entrada); no entanto, existem muitas dicas entre navegadores ao tentar fazer isso. Melhor usar um plugin mais elaborado como o SendKeys .
fonte
A partir de 2019, esta solução funcionou para mim:
Usei isso no jogo do meu navegador, para suportar dispositivos móveis com um teclado simulado.
Esclarecimento: Esse código despacha um único
keydown
evento, enquanto uma pressão real na tecla acionaria umkeydown
evento (ou vários deles, se for mantido por mais tempo) e, em seguida, umkeyup
evento quando você soltar essa tecla. Se você também precisar dekeyup
eventos, também é possível simularkeyup
eventos alterando"keydown"
para"keyup"
no trecho de código.Isso também envia o evento para toda a página da Web, daí o
document
. Se você desejar que apenas um elemento específico receba o evento, poderá substituirdocument
o elemento desejado.fonte
Trusted
?)Para os interessados, é possível recriar de fato os eventos de entrada do teclado de maneira confiável. Para alterar o texto na área de entrada (mover cursores ou a página por meio de um caractere de entrada), é necessário seguir o modelo de evento DOM de perto: http://www.w3.org/TR/DOM-Level-3-Events/ # h4_events-inputevents
O modelo deve fazer:
Depois, para cada personagem:
Em seguida, opcionalmente para a maioria:
Na verdade, isso altera o texto na página via javascript (sem modificar as declarações de valor) e aciona os ouvintes / manipuladores de javascript adequadamente. Se você estragar a sequência, o javascript não será acionado na ordem apropriada, o texto na caixa de entrada não será alterado, as seleções não serão alteradas ou o cursor não se moverá para o próximo espaço na área de texto.
Infelizmente, o código foi escrito para um empregador sob um NDA, portanto não posso compartilhá-lo, mas é definitivamente possível, mas você deve recriar toda a "pilha" de entrada de chave para cada elemento na ordem correta.
fonte
Essa abordagem suporta cross-browser alterando o valor do código-chave . Fonte
fonte
basta usar CustomEvent
4 ex quer simular ctrl + z
fonte
Aqui está uma biblioteca que realmente ajuda: https://cdn.rawgit.com/ccampbell/mousetrap/2e5c2a8adbe80a89050aaf4e02c45f02f1cc12d4/tests/libs/key-event.js
Não sei de onde veio, mas é útil. Ele adiciona um
.simulate()
método awindow.KeyEvent
, então você o usa simplesmenteKeyEvent.simulate(0, 13)
para simular umenter
ouKeyEvent.simulate(81, 81)
para um'Q'
.Comprei-o em https://github.com/ccampbell/mousetrap/tree/master/tests .
fonte
Isso funcionou para mim e simula um keyup para o meu textaera. Se você quer para toda a página basta colocar o
KeySimulation()
sobre<body>
como esta<body onmousemove="KeySimulation()">
, ou se nãoonmousemove
, em seguida,onmouseover
ouonload
obras também.fonte
initKeyboardEvent
está obsoleto. ( Source )Ele foi remar uma vez devido ao fácil uso em um contexto de console. Mas provavelmente ainda útil.
fonte
Aqui está uma solução que funciona no Chrome e no Chromium (apenas testaram essas plataformas). Parece que o Chrome tem algum bug ou uma abordagem própria para lidar com códigos de chave, portanto essa propriedade deve ser adicionada separadamente ao KeyboardEvent.
fonte
Isto é o que eu consegui encontrar:
fonte
JavaScript nativo com solução suportada por TypeScript:
Digite o keyCode ou a propriedade que você está usando e faça a conversão para KeyboardEventInit
Exemplo
fonte
Foi o que tentei com js / typescript no chrome. Graças a esta resposta para inspiração.
fonte
assim que o usuário pressionar a tecla em questão, você poderá armazenar uma referência a ela e usá-la em qualquer outro elemento HTML:
você pode definir o keyCode se criar seu próprio evento, copiar parâmetros existentes de qualquer evento real do teclado (ignorando destinos, pois é o trabalho de dispatchEvent) e:
fonte
Eu sei que a pergunta pede uma maneira javascript de simular um pressionamento de tecla. Mas para aqueles que procuram uma maneira jQuery de fazer as coisas:
fonte
A parte crítica de começar este trabalho é perceber que
charCode
,keyCode
ewhich
são todos métodos obsoletos . Portanto, se o código que processa o evento de pressionamento de tecla usar qualquer um desses três, ele receberá uma resposta falsa (por exemplo, um padrão de 0).Desde que você acesse o evento de pressionamento de tecla com um método não preterido, como
key
, você deve estar OK.Para concluir, adicionei o código Javascript básico para acionar o evento:
fonte
Eu queria simular uma imprensa 'Tab' ... Expandindo a resposta de Trevor, podemos ver que uma tecla especial como 'tab' é pressionada, mas não vemos o resultado real que uma imprensa 'tab' teria .. .
tentou enviar esses eventos para 'activeElement', bem como o objeto de documento global - código para os dois adicionados abaixo;
snippet abaixo:
fonte