代码之家  ›  专栏  ›  技术社区  ›  user171523

如何触发javascript事件单击

  •  160
  • user171523  · 技术社区  · 14 年前

    我的网页上有一个超链接。为了测试的目的,我正在尝试自动点击超链接。有没有办法用javascript模拟50次点击超链接?

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

    我正在从javascript中寻找onclick事件触发器。

    8 回复  |  直到 6 年前
        1
  •  220
  •   Gaurang Tandon    6 年前

    对HTML元素执行单击: 简单地做 element.click() . Most major browsers support this


    要多次重复单击: 将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();
    
        2
  •  80
  •   Ruan Mendes    7 年前

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

        3
  •  35
  •   黄雨伞    7 年前

    什么

     l.onclick();
    

    确实是在打电话给 onclick 功能 l ,也就是说,如果您设置了 l.onclick = myFunction; . 如果你还没准备好 l.onclick ,它什么也不做。相反,

     l.click();
    

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

        4
  •  19
  •   htmldrum    12 年前

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

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

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

    这将生成所需的结果

        5
  •  10
  •   Manolo    8 年前

    .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

        6
  •  8
  •   Nicole    14 年前

    使用测试框架

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

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

    手动触发事件

    要以正确的方式手动触发事件,您需要为不同的浏览器使用不同的方法-或者 el.dispatchEvent el.fireEvent 在哪里? el 将是你的锚元素。我相信这两个都需要构造一个事件对象才能传入。

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

    var el = document.getElementById('anchorelementid');
    el.onclick(); // Not entirely correct because your event handler will be called
                  // without an Event object parameter.
    
        7
  •  4
  •   Fatih Hayrioğlu    6 年前

    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
  •  1
  •   fedorqui yar    10 年前

    公平警告:

    element.onclick() 不按预期行事。它只在 onclick="" attribute ,但不会触发默认行为。

    我对单选按钮没有设置为选中也有类似的问题,尽管 onclick 自定义函数运行正常。不得不加 radio.checked = "true"; 设置它。其他元素(在 a.onclick() 也应该有 window.location.href = "url"; )

    推荐文章