如何触发 JavaScript 事件点击

Posted

技术标签:

【中文标题】如何触发 JavaScript 事件点击【英文标题】:How can I trigger a JavaScript event click 【发布时间】:2011-01-23 19:20:25 【问题描述】:

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

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

我正在寻找来自 JavaScript 的 onClick 事件触发器。

【问题讨论】:

【参考方案1】:

单击 HTML 元素: 只需执行element.click()。 Most major browsers support this.


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

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

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

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

【讨论】:

注意这是为了快速测试。如需更强大、符合标准、跨浏览器的解决方案,请参阅 Juan 的回答。 我不理解循环,这在移动设备上不起作用。 @im_benton:循环是针对 OP 的特定需求。如果只需要触发点击事件,可以省略以for(开头的行。 如何将相同的 Id 赋予多个元素。这是不正确的。使用类选择器来完成您的任务。多个元素可以具有相同的类。但多个元素不能具有相同的 Id 值 @Parag:再读一遍。循环是点击同一个链接 50 次,这就是它的作用。【参考方案2】:

更新

这是一个旧答案。现在你应该只使用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" 不会触发更改事件。

【讨论】:

嘿胡安!您的示例未定义 JSUtil.NodeTypes.DOCUMENT_NODE 我知道问题是关于点击事件,但你在这里提供了一些通用代码,我可以看到更改事件不会被触发(我测试过它,这并不真正适用于这样事件)。要触发更改事件,我必须使用 jquery 触发函数。 @AleksanderLech 仅仅触发一个事件并不能保证该动作会发生。它是为了点击,而不是为了改变。更改不起作用的事件的用例是您想要更改其值,但您希望调用所有更改事件处理程序(无论它们是否使用jQuery 设置)。如果您使用您正在尝试但无法正常工作的确切代码提出新问题,我可以提供更有意义的帮助。 感谢您的快速响应。在对您的 sn-p 进行一些修改后,我能够运行更改事件: 1) var node = document.getElementById(originalEvent.srcElement.id); 2) event.initEvent(eventName, true, true); //我不知道为什么你禁用了更改事件的冒泡。请告诉我你的想法。 对于和我遇到同样问题的人:使用el.dispatchEvent(new Event('click')) 不会冒泡。为此,您需要在事件构造函数中指定“冒泡”行为:new Event('click', bubble: true )【参考方案3】:

什么

 l.onclick();

does 就是调用lonclick 函数,也就是说,如果你设置了一个l.onclick = myFunction;。如果你没有设置l.onclick,它什么也不做。相比之下,

 l.click();

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

【讨论】:

FWIW 这仅适用于元素级别。如果您向window 对象添加点击事件,它不会神奇地公开window.click 函数。 @JamesDonnelly 它与附加的处理程序无关,并非所有元素都支持click方法,只有继承HTMLElement.click的元素窗口不是HTMLElement【参考方案4】:

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

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

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

这将生成所需的结果

【讨论】:

【参考方案5】:

.click() 不适用于 android(查看mozilla docs,在移动部分)。可以通过这个方法触发点击事件:

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

来自this post

【讨论】:

我正在尝试 jQuery 的触发点击,但发现它最终调用回调而不是在 DOM 上调度实际事件。 @manolo 你的方法是正确的。 ".click() 不适用于 Android" 实际上,最新的表格显示“兼容性未知”。【参考方案6】:

使用测试框架

这可能会有所帮助 - http://seleniumhq.org/ - Selenium 是一个 Web 应用程序自动化测试系统。

您可以使用 Firefox 插件 Selenium IDE 创建测试

手动触发事件

要以正确的方式手动触发事件,您需要为不同的浏览器使用不同的方法 - el.dispatchEventel.fireEvent 其中el 将是您的 Anchor 元素。我相信这两个都需要构造一个 Event 对象才能传入。

另一种不完全正确的快速而肮脏的方法是:

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

【讨论】:

【参考方案7】:

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/

【讨论】:

【参考方案8】:

请在任何地方和按钮会点击的地方调用触发函数。


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

function trigger()
    document.getElementById("myBtn").click();

【讨论】:

【参考方案9】:

公平警告:

element.onclick() 未按预期运行。它只运行onclick="" attribute 内的代码,但不会触发默认行为。

即使onclick 自定义函数运行良好,我也遇到了类似的问题,即未设置为选中的单选按钮。必须添加 radio.checked = "true"; 来设置它。其他元素可能也是如此(a.onclick() 之后应该还有window.location.href = "url";

【讨论】:

确实,使用onclick()意味着event对象不会被浏览器自动定义,所以像event.stopPropagation()这样的常用方法也将是未定义的。

以上是关于如何触发 JavaScript 事件点击的主要内容,如果未能解决你的问题,请参考以下文章

如何根据鼠标点击位置参数触发Javascript中的事件?

JAVA Eclipse 如何点击一个按钮就触发另外一个CLASS程序

java中如何获取网页中鼠标点击过的事件

javascript如何判断鼠标是不是触发了onmouseover事件

Javascript事件 - 检测点击链接

JavaScript 事件点击触发了两次