如何触发 JavaScript 事件点击

IT技术 javascript dom-events
2021-01-22 17:19:52

我的页面中有一个超链接。我正在尝试自动点击超链接以进行测试。有什么方法可以使用 JavaScript 模拟超链接上的 50 次点击?

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

我正在从 JavaScript 中寻找 onClick 事件触发器。

6个回答

在 HTML 元素上执行一次单击:只需执行element.click(). 大多数主要浏览器都支持这一点


多次重复单击:向元素添加 ID 以唯一选择它:

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

.click()通过 for 循环调用JavaScript 代码中方法:

var link = document.getElementById('my-link');
for(var i = 0; i < 50; i++)
   link.click();
如何将相同的 Id 赋予多个元素。这是不正确的。使用类选择器来完成你的任务。多个元素可以具有相同的类。但多个元素不能具有相同的 Id 值
2021-03-13 17:19:52
我不明白循环,这在移动设备上不起作用。
2021-03-19 17:19:52
注意这是为了快速测试的目的。有关更强大、符合标准、跨浏览器的解决方案,请参阅 Juan 的回答。
2021-03-25 17:19:52
@im_benton:循环是为了满足 OP 的特定需求。如果只需要触发一个点击事件,可以省略以for(.
2021-04-07 17:19:52

更新

这是一个旧的答案。现在你应该只使用click对于更高级的事件触发,请使用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'));

原答案

这是我使用的: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"不会触发更改事件。

感谢您的快速响应。在对您的代码段进行一些修改后,我能够运行更改事件:1) var node = document.getElementById(originalEvent.srcElement.id); 2) event.initEvent(eventName, true, true); //我不知道你为什么禁用了更改事件的冒泡。请告诉我你的想法。
2021-03-14 17:19:52
我知道问题是关于点击事件,但你在这里提供了一些通用代码,我可以看到更改事件不会被触发(我测试了它,这对此类事件并不真正有效)。要触发更改事件,我必须使用 jquery 触发功能。
2021-03-18 17:19:52
@AleksanderLech 只是触发一个事件并不能保证该操作会发生。它是为了点击,而不是为了改变。更改不起作用的事件的用例是当您想要更改其值时,但您希望调用所有更改事件处理程序(无论是否设置了它们jQuery)。如果您使用您正在尝试但无法正常工作的确切代码提出新问题,我可以提供更有意义的帮助。
2021-03-18 17:19:52
嘿胡安!你的例子没有定义 JSUtil.NodeTypes.DOCUMENT_NODE
2021-04-01 17:19:52
对于与我面临相同问题的任何人:使用el.dispatchEvent(new Event('click'))不会冒泡。为此,您需要在事件构造函数中指定“气泡”行为:new Event('click', { bubble: true })
2021-04-09 17:19:52

什么

 l.onclick();

do 正是调用 的onclick函数l,也就是说,如果您已经设置了l.onclick = myFunction;. 如果你还没有设置l.onclick,它什么都不做。相比之下,

 l.click();

模拟单击并触发所有事件处理程序,无论是使用l.addEventHandler('click', myFunction);、在 HTML 中添加还是以任何其他方式添加。

@JamesDonnelly 这与附加的处理程序无关,并非所有元素都支持 click 方法,只有继承HTMLElement.click Window 的元素不是 HTMLElement
2021-03-26 17:19:52
FWIW 这只适用于元素级别。如果向window对象添加单击事件,它不会神奇地公开window.click函数。
2021-03-28 17:19:52

我很惭愧有这么多不正确或未公开的部分适用性。

最简单的方法是使用控制台通过 Chrome 或 Opera(我的示例将使用 Chrome)。在控制台输入以下代码(一般在1行):

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

这将生成所需的结果

.click()不适用于 Android(在移动部分查看mozilla 文档)。您可以使用此方法触发点击事件:

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

这个帖子

.click()不适用于Android”实际上,最新的表格显示“兼容性未知”。
2021-03-12 17:19:52
我正在尝试 jQuery 的触发器单击,但发现它最终会调用回调而不是在 DOM 上调度实际事件。@manolo 你的方法是正确的。
2021-03-29 17:19:52