Como posso acionar um clique em um evento JavaScript

215

Eu tenho um hiperlink na minha página. Estou tentando automatizar vários cliques no hiperlink para fins de teste. Existe alguma maneira de simular 50 cliques no hiperlink usando JavaScript?

<a href="#" target="_blank" onclick="javascript:Test("Test");">MSDN</a>

Estou procurando o acionador de evento onClick do JavaScript.

user171523
fonte

Respostas:

285

Executando um único clique em um elemento HTML: Simplesmente faça element.click(). A maioria dos principais navegadores suporta isso .


Para repetir o clique mais de uma vez: Adicione um ID ao elemento para selecioná-lo exclusivamente:

<a href="#" target="_blank" id="my-link" onclick="javascript:Test('Test');">Google Chrome</a>

e chame o .click()método no seu código JavaScript por meio de um loop for:

var link = document.getElementById('my-link');
for(var i = 0; i < 50; i++)
   link.click();
exemplo de mim
fonte
1
Nota: este é para fins de teste rápido. Para uma solução mais robusta, compatível com o padrão, entre navegadores, consulte a resposta de Juan.
instanceof me
3
Eu não entendo o loop e isso não funcionou no celular.
im_benton
@im_benton: O loop foi para as necessidades específicas do OP. Se você só precisa acionar um evento de clique, pode omitir a linha que começa com for(.
Rinogo 7/07
87

ATUALIZAR

Esta foi uma resposta antiga. Atualmente você deve apenas clicar . Para disparos de eventos mais avançados, use dispatchEvent .

const body = document.body;

body.addEventListener('click', e => {
  console.log('clicked body');
});

console.log('Using click()');
body.click();

console.log('Using dispatchEvent');
body.dispatchEvent(new Event('click'));

Resposta original

Aqui está o que eu uso: http://jsfiddle.net/mendesjuan/rHMCy/4/

Atualizado para trabalhar com o IE9 +

/**
 * Fire an event handler to the specified node. Event handlers can detect that the event was fired programatically
 * by testing for a 'synthetic=true' property on the event object
 * @param {HTMLNode} node The node to fire the event handler on.
 * @param {String} eventName The name of the event without the "on" (e.g., "focus")
 */
function fireEvent(node, eventName) {
    // Make sure we use the ownerDocument from the provided node to avoid cross-window problems
    var doc;
    if (node.ownerDocument) {
        doc = node.ownerDocument;
    } else if (node.nodeType == 9){
        // the node may be the document itself, nodeType 9 = DOCUMENT_NODE
        doc = node;
    } else {
        throw new Error("Invalid node passed to fireEvent: " + node.id);
    }

     if (node.dispatchEvent) {
        // Gecko-style approach (now the standard) takes more work
        var eventClass = "";

        // Different events have different event classes.
        // If this switch statement can't map an eventName to an eventClass,
        // the event firing is going to fail.
        switch (eventName) {
            case "click": // Dispatching of 'click' appears to not work correctly in Safari. Use 'mousedown' or 'mouseup' instead.
            case "mousedown":
            case "mouseup":
                eventClass = "MouseEvents";
                break;

            case "focus":
            case "change":
            case "blur":
            case "select":
                eventClass = "HTMLEvents";
                break;

            default:
                throw "fireEvent: Couldn't find an event class for event '" + eventName + "'.";
                break;
        }
        var event = doc.createEvent(eventClass);
        event.initEvent(eventName, true, true); // All events created as bubbling and cancelable.

        event.synthetic = true; // allow detection of synthetic events
        // The second parameter says go ahead with the default action
        node.dispatchEvent(event, true);
    } else  if (node.fireEvent) {
        // IE-old school style, you can drop this if you don't need to support IE8 and lower
        var event = doc.createEventObject();
        event.synthetic = true; // allow detection of synthetic events
        node.fireEvent("on" + eventName, event);
    }
};

Observe que chamar fireEvent(inputField, 'change');não significa que realmente alterará o campo de entrada. O caso de uso típico para disparar um evento de mudança é quando você define um campo programaticamente e deseja que os manipuladores de eventos sejam chamados, pois a chamada input.value="Something"não acionará um evento de mudança.

Juan Mendes
fonte
Hey Juan! Seu exemplo não define JSUtil.NodeTypes.DOCUMENT_NODE
Kato
Eu sei que a pergunta é sobre clicar em eventos, mas você forneceu um código genérico aqui e o que posso ver é que os eventos de alteração não serão acionados (eu testei e isso realmente não funciona para esses eventos). Para acionar eventos de alteração, tive que usar a função de gatilho jquery.
Aleksander Lech
@AleksanderLech Apenas disparar um evento não garante que a ação ocorra. Faz por clique, não por mudança. O caso de uso para eventos em que a mudança não funciona é quando você deseja alterar seu valor, mas deseja que todos os manipuladores de eventos de alteração sejam chamados (independentemente de terem sido configurados jQueryou não). Posso fornecer ajuda mais significativa se você fizer uma nova pergunta com o código exato que estava tentando, mas não estava funcionando.
Juan Mendes
Obrigado pela resposta rápida. Consegui obter o evento de alteração em execução após algumas modificações no seu snippet: 1) var node = document.getElementById (originalEvent.srcElement.id); 2) event.initEvent (eventName, true, true); // Não sei por que você desativou o bubbling para eventos de alteração. Por favor diga-me o que você pensa.
Aleksander Lech
40

o que

 l.onclick();

does é exatamente chamar a onclickfunção de l, isto é, se você tiver definido um com l.onclick = myFunction;. Se você não definiu l.onclick, não faz nada. Em contraste,

 l.click();

simula um clique e aciona todos os manipuladores de eventos, adicionados com l.addEventHandler('click', myFunction);, em HTML ou de qualquer outra forma.

黄 雨伞
fonte
1
FWIW, isso funciona apenas no nível do elemento. Se você adicionar um evento de clique ao windowobjeto, ele não exibirá magicamente uma window.clickfunção.
James Donnelly
20

Tenho muita vergonha de haver tantas aplicabilidades parciais incorretas ou não reveladas.

A maneira mais fácil de fazer isso é através do Chrome ou Opera (meus exemplos usarão o Chrome) usando o console. Digite o seguinte código no console (geralmente em 1 linha):

var l = document.getElementById('testLink');
for(var i=0; i<5; i++){
  l.click();
}

Isso irá gerar o resultado necessário

htmldrum
fonte
12

.click()não funciona com o Android (consulte os documentos do mozilla , na seção móvel). Você pode acionar o evento click com este método:

function fireClick(node){
    if (document.createEvent) {
        var evt = document.createEvent('MouseEvents');
        evt.initEvent('click', true, false);
        node.dispatchEvent(evt);    
    } else if (document.createEventObject) {
        node.fireEvent('onclick') ; 
    } else if (typeof node.onclick == 'function') {
        node.onclick(); 
    }
}

A partir desta postagem

Manolo
fonte
1
Eu estava tentando clicar no gatilho do jQuery, mas descobri que ele acabou chamando o retorno de chamada em vez de despachar o evento real no DOM. @ manolo, seu método está correto.
Akshay Gundewar
" .click()não funciona com Android" Na verdade, a tabela mais recente diz "Compatibilidade desconhecida".
Gaurang Tandon
8

Use uma estrutura de teste

Isso pode ser útil - http://seleniumhq.org/ - O Selenium é um sistema de teste automatizado de aplicativos da web.

Você pode criar testes usando o plugin Selenium IDE do Firefox

Disparo manual de eventos

Para disparar manualmente os eventos da maneira correta, você precisará usar métodos diferentes para diferentes navegadores - el.dispatchEventou el.fireEventonde elserá o seu elemento Anchor. Acredito que ambos exigirão a construção de um objeto Event para passar.

A maneira alternativa, não totalmente correta, rápida e suja seria a seguinte:

var el = document.getElementById('anchorelementid');
el.onclick(); // Not entirely correct because your event handler will be called
              // without an Event object parameter.
Nicole
fonte
7

IE9 +

function triggerEvent(el, type){
    var e = document.createEvent('HTMLEvents');
    e.initEvent(type, false, true);
    el.dispatchEvent(e);
}

Exemplo de uso:

var el = document.querySelector('input[type="text"]');
triggerEvent(el, 'mousedown');

Fonte: https://plainjs.com/javascript/events/trigger-an-event-11/

Fatih Hayrioğlu
fonte
1

Aviso justo:

element.onclick()não se comporta conforme o esperado. Ele executa apenas o código dentro onclick="" attribute, mas não dispara o comportamento padrão.

Eu tive um problema semelhante com o botão de opção não configurado para marcado, mesmo que a onclickfunção personalizada estivesse funcionando bem. Tinha que adicionar radio.checked = "true";para configurá-lo. Provavelmente o mesmo vale para outros elementos (depois a.onclick()deve haver também window.location.href = "url";)

Arvigeus
fonte
De fato, usar onclick()significaria que o eventobjeto não será definido automaticamente pelo navegador, portanto métodos comuns como event.stopPropagation()também serão indefinidos.
Boaz
0

Por favor, chame a função de gatilho para qualquer lugar e o botão clicará.


<a href="#" id="myBtn" title="" >Button click </a>

function trigger(){
    document.getElementById("myBtn").click();
}
Vinod Kumar
fonte