Desencadear um evento keypress / keydown / keyup no JS / jQuery?

173

Qual é a melhor maneira de simular um usuário digitando texto em uma caixa de entrada de texto em JS e / ou jQuery?

Eu não quiser realmente colocar texto na caixa de entrada, eu só quero para acionar todos os eventos manipuladores que normalmente se desencadeada por uma informação do usuário a digitar em uma caixa de entrada. Isso significa foco, pressionamento de tecla, pressionamento de tecla, keyup e desfoque. Eu acho que.

Então, como alguém conseguiria isso?

Alex
fonte

Respostas:

240

Você pode acionar qualquer um dos eventos com uma chamada direta para eles, assim:

$(function() {
    $('item').keydown();
    $('item').keypress();
    $('item').keyup();
    $('item').blur();
});

Isso faz o que você está tentando fazer?

Você provavelmente também deve acionar .focus()e potencialmente.change()

Se você deseja acionar os eventos-chave com chaves específicas, pode fazer o seguinte:

$(function() {
    var e = $.Event('keypress');
    e.which = 65; // Character 'A'
    $('item').trigger(e);
});

Há uma discussão interessante sobre os eventos de pressionamento de tecla aqui: jQuery Event Keypress: Qual tecla foi pressionada? , especificamente em relação à compatibilidade entre navegadores com a propriedade .which.

ebynum
fonte
3
ou$('item').trigger('keypress', {which: 'A'.charCodeAt(0)});
Bob Stein
@ebynum Você pode escrever algum código com Javascript (sem jquery).
Chris P #
1
Se você precisa Ctrl: ctrlKey: true, também: shiftKey,altKey
Илья Зеленько
52

Você pode enviar eventos como

el.dispatchEvent(new Event('focus'));
el.dispatchEvent(new KeyboardEvent('keypress',{'key':'a'}));
aljgom
fonte
5
ouel.dispatchEvent(new Event('keypress', {keyCode: 'a'}))
Cuzox
1
@ Cuzox, por que não usar o KeyboardEvent? Ele preenche automaticamente valores como shiftKey e é a maneira correta. Além disso, você coloca uma string em keyCode, isso está errado.
SuperOP535 13/0918
7
Se você precisar Ctrl: el.dispatchEvent(new KeyboardEvent('keydown', { keyCode: 70, ctrlKey: true }));(Isso causará um atalho Ctrl + F)
Decлья Зеленько
31

Para acionar uma enterpressão de tecla, tive que modificar a resposta @ebynum, especificamente, usando a propriedade keyCode.

e = $.Event('keyup');
e.keyCode= 13; // enter
$('input').trigger(e);
cloakedninjas
fonte
2
keydownevento não está sendo capturado, ou estou fazendo algo errado aqui? fiddle.jshell.net/Palestinian/8d8J9
Omar
@ manto: funciona. Verifique meu comentário aqui para obter um seletor completo para corrigir os controles do asp.net: codeproject.com/Tips/269388/… Certifique-se de chamá-lo depois de inserir qualquer coisa no dom se estiver usando o Ajax.
Dan Randolph
23

Aqui está um exemplo de vanilla js para acionar qualquer evento:

function triggerEvent(el, type){
if ('createEvent' in document) {
        // modern browsers, IE9+
        var e = document.createEvent('HTMLEvents');
        e.initEvent(type, false, true);
        el.dispatchEvent(e);
    } else {
        // IE 8
        var e = document.createEventObject();
        e.eventType = type;
        el.fireEvent('on'+e.eventType, e);
    }
}
Sionnach733
fonte
7
Você pode fornecer alguns exemplos de uso? Como sua função seria usada para enviar um código de chave?
Mac
6
O código fonte para este post pode ser encontrado no link seguinte que inclui documentação: plainjs.com/javascript/events/trigger-an-event-11
Kieren Dixon
17

Você pode conseguir isso com: EventTarget.dispatchEvent(event)e passando um novo KeyboardEvent como o evento.

Por exemplo: element.dispatchEvent(new KeyboardEvent('keypress', {'key': 'a'}))

Exemplo de trabalho:

// get the element in question
const input = document.getElementsByTagName("input")[0];

// focus on the input element
input.focus();

// add event listeners to the input element
input.addEventListener('keypress', (event) => {
  console.log("You have pressed key: ", event.key);
});

input.addEventListener('keydown', (event) => {
  console.log(`key: ${event.key} has been pressed down`);
});

input.addEventListener('keyup', (event) => {
  console.log(`key: ${event.key} has been released`);
});

// dispatch keyboard events
input.dispatchEvent(new KeyboardEvent('keypress',  {'key':'h'}));
input.dispatchEvent(new KeyboardEvent('keydown',  {'key':'e'}));
input.dispatchEvent(new KeyboardEvent('keyup', {'key':'y'}));
<input type="text" placeholder="foo" />

MDN dispatchEvent

MDN KeyboardEvent

JSON C11
fonte
12

Agora você é capaz de fazer:

var e = $.Event("keydown", {keyCode: 64});
simonzack
fonte
2

Antes de tudo, preciso dizer que a amostra do Sionnach733 funcionou perfeitamente. Alguns usuários reclamam da ausência de exemplos reais. Aqui estão meus dois centavos. Estive trabalhando na simulação de cliques do mouse ao usar este site: https://www.youtube.com/tv . Você pode abrir qualquer vídeo e tentar executar este código. Ele executa a mudança para o próximo vídeo.

function triggerEvent(el, type, keyCode) {
    if ('createEvent' in document) {
            // modern browsers, IE9+
            var e = document.createEvent('HTMLEvents');
            e.keyCode = keyCode;
            e.initEvent(type, false, true);
            el.dispatchEvent(e);
    } else {
        // IE 8
        var e = document.createEventObject();
        e.keyCode = keyCode;
        e.eventType = type;
        el.fireEvent('on'+e.eventType, e);
    }
}

var nextButton = document.getElementsByClassName('icon-player-next')[0];
triggerEvent(nextButton, 'keyup', 13); // simulate mouse/enter key press
yuliskov
fonte
1

Pensei em chamar sua atenção que, no contexto específico em que um ouvinte foi definido dentro de um plugin jQuery, a única coisa que simulou com êxito o evento de pressionamento de tecla para mim, eventualmente capturado por esse ouvinte, foi usar setTimeout (). por exemplo

setTimeout(function() { $("#txtName").keypress() } , 1000);

Qualquer uso de $("#txtName").keypress()foi ignorado , embora colocado no final do .ready() function. De qualquer maneira, nenhum suplemento DOM em particular estava sendo criado de forma assíncrona.

Fabien Haddadi
fonte
1

Para conversão de texto datilografado em KeyboardEventInit e forneça o número inteiro keyCode correto

const event = new KeyboardEvent("keydown", {
          keyCode: 38,
        } as KeyboardEventInit);
Eugen Sunic
fonte
1
@CamiRodriguez, o que você pode fazer no TypeScript, pode fazer em JS (assim como o jQuery). Exceto que o TypeScript não altera as sintaxes do JS, apenas as expande. Se você remover `as KeyboardEventInit`, será basicamente um código JS. +1 pela resposta, obrigado.
Gergő Horváth