Как я могу вызвать событие JavaScript

У меня есть ссылка на мою страницу. Я пытаюсь автоматизировать несколько кликов по гиперссылке для целей тестирования. Есть ли способ имитировать 50 кликов по гиперссылке с помощью JavaScript?

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

Я ищу триггер события onClick из JavaScript.

8 ответов


выполнение одного клика по HTML-элементу: просто element.click(). большинство основных браузеров поддерживают это.


чтобы повторить щелчок несколько раз: добавить ID к элементу, чтобы однозначно выделить его:

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

, а вызов .click() метод в вашем коде JavaScript через цикл for:

var link = document.getElementById('my-link');
for(var i = 0; i < 50; i++)
   link.click();

вот что я использую:http://jsfiddle.net/mendesjuan/rHMCy/4/

обновлено для работы с 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);
    }
};

обратите внимание, что вызов fireEvent(inputField, 'change'); не означает, что он фактически изменит поле ввода. Типичный случай использования для запуска события изменения - это когда вы программно устанавливаете поле и хотите, чтобы обработчики событий вызывались с момента вызова input.value="Something" не срабатывает событие change.


что

 l.onclick();

делает именно вызов onclick функции l, то есть, если вы установили один с l.onclick = myFunction;. Если вы не установили l.onclick, он ничего не делает. В отличие от этого,

 l.click();

имитирует щелчок и запускает все обработчики событий, будь то добавлено с l.addEventHandler('click', myFunction); в HTML или любым другим способом.


Мне очень стыдно, что существует так много неправильной или нераскрытой частичной применимости.

самый простой способ сделать это через Chrome или Opera (мои примеры будут использовать Chrome) с помощью консоли. Введите следующий код в консоль (обычно в 1 строке):

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

это создаст необходимый результат


.click() не работает с Android (посмотреть mozilla docs, в мобильном разделе). Вы можете вызвать событие click с помощью этого метода:

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(); 
    }
}

С этот пост


используйте платформу тестирования

это может быть полезно -http://seleniumhq.org/ - Selenium-это автоматизированная система тестирования веб-приложений.

вы можете создавать тесты с помощью плагина Firefox селен IDE

ручная стрельба событий

чтобы вручную запускать события правильным образом, вам нужно будет использовать разные методы для разных браузеров-либо el.dispatchEvent или el.fireEvent где el будет вашим элементом якоря. Я считаю, что оба из них потребуют создания объекта Event для передачи.

альтернативным, не совсем правильным, быстрым и грязным способом было бы следующее:

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

IE9+

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

пример использования:

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

источник:https://plainjs.com/javascript/events/trigger-an-event-11/


предупреждение:

element.onclick() ведет себя не так, как ожидалось. Он запускает код только в onclick="" attribute, но не запускает по умолчанию.

у меня была аналогичная проблема с переключателем, не настроенным на проверку, хотя onclick пользовательская функция работает нормально. Пришлось добавить radio.checked = "true";, чтобы установить его. Вероятно, то же самое происходит и для других элементов (после a.onclick() стоит window.location.href = "url";)