【问题标题】:How to simulate a click with JavaScript?如何使用 JavaScript 模拟点击?
【发布时间】:2011-02-11 22:21:21
【问题描述】:

我只是想知道如何使用 JavaScript 来模拟对元素的点击。

目前我有:

function simulateClick(control) {
  if (document.all) {
    control.click();
  } else {
    var evObj = document.createEvent('MouseEvents');
    evObj.initMouseEvent('click', true, true, window, 1, 12, 345, 7, 220, false, false, true, false, 0, null );
    control.dispatchEvent(evObj);
  }
}
<a href="http://www.google.com" id="mytest1">test 1</a><br>

<script type="text/javascript">
    simulateClick(document.getElementById('mytest1'));
</script>

但它不起作用:(

有什么想法吗?

【问题讨论】:

  • “五个最常见的编码错误”:javascript.about.com/od/hintsandtips/a/worst_4.htm - 几乎没有人再运行 IE4,因此不再需要对 document.all DOM 的支持。尽管仍有多少人在编码中使用它,但确实令人惊讶。更糟糕的是,对 document.all DOM 的支持通常会被测试以确定正在使用的浏览器,如果支持,则代码假定浏览器是 Internet Explorer(这是完全错误的用法,因为 Opera 也可以识别 DOM)。

标签: javascript


【解决方案1】:

您是否考虑过使用 jQuery 来避免所有浏览器检测?使用 jQuery,它会很简单:

$("#mytest1").click();

【讨论】:

  • 这只会触发 jQuery 事件处理程序,而不是默认行为(在这种情况下浏览器会转到 href)
  • 我不知道悲伤,但不必一次又一次地重新编写相同的浏览器检测例程确实很方便。
  • @ErikAigner:我也想知道,但很高兴在这种情况下接受的答案是纯 JavaScript 而不是 jQuery。在SO上看到太多次了。再说一遍:jQuery 是 JavaScript,但 JavaScript 不是 jQuery。虽然我喜欢使用 jQuery,但我看到越来越多的开发人员不了解真正简单的东西。我的 2 美分,忍不住要发表评论。 ;)
  • 还有很多人不知道从哪里开始,如果他们不得不用手洗衣服,因为大多数家庭都有洗衣机,几乎一样多的人都有干衣机. jQuery,就像现代设备一样,让旧的琐事变得更容易,更不容易出错。然而,这不是每个人的解决方案,使用更简洁、更易理解的语法准确回答问题的答案,同时兼容跨浏览器似乎是倒退的。 +1。
  • @FreeAsInBeer 那么你也不应该去任何地方,因为开车要容易得多。但我们知道这很愚蠢。如果您不需要走很远,您可以步行。如果您需要做一些简单的事情并且不想加载整个库来完成它,您可以使用纯 JavaScript。无需为简单的事情浪费气体/带宽。
【解决方案2】:

这是我做的。这很简单,但很有效:

function eventFire(el, etype){
  if (el.fireEvent) {
    el.fireEvent('on' + etype);
  } else {
    var evObj = document.createEvent('Events');
    evObj.initEvent(etype, true, false);
    el.dispatchEvent(evObj);
  }
}

用法:

eventFire(document.getElementById('mytest1'), 'click');

【讨论】:

  • @Anderson Green:我在这个 jsfiddle 中添加了一个示例:jsfiddle.net/KooiInc/W4BHD
  • 证明这有效(在 Chromium 中):+1 与 document.querySelector('[value="2706236"]').nextSibling.nextSibling.dispatchEvent(ev); :)
  • 好吧,我在投票按钮上尝试了你的 java-script :)(当然工作)
  • 要模拟准确的用户行为,您应该用setTimeout 包装dispatchEventclick 调用,因为dispatchEvent 似乎是synchronous
【解决方案3】:

最佳答案是最好的!但是,当 etype = 'click' 时,它并没有在 Firefox 中为我触发鼠标事件。

所以,我将 document.createEvent 更改为 'MouseEvents' 并解决了问题。额外的代码用于测试是否有其他代码干扰了事件,如果它被取消,我会将其记录到控制台。

function eventFire(el, etype){
  if (el.fireEvent) {
    el.fireEvent('on' + etype);
  } else {
    var evObj = document.createEvent('MouseEvents');
    evObj.initEvent(etype, true, false);
    var canceled = !el.dispatchEvent(evObj);
    if (canceled) {
      // A handler called preventDefault.
      console.log("automatic click canceled");
    } else {
      // None of the handlers called preventDefault.
    } 
  }
}

【讨论】:

    【解决方案4】:

    那么简单的事情呢:

    document.getElementById('elementID').click();
    

    Supported 甚至是 IE。

    【讨论】:

    • @HermannIngjaldsson 是的,它在 IE 中完美运行 - msdn.microsoft.com/en-us/library/ie/ms536363%28v=vs.85%29.aspx
    • 问题是“它也适用于 ie 吗?” - 答案是肯定的 - AFAIK 至少下降到 8,还没有检查 7
    • 以前没有这个吗?为什么 2010 年的答案没有提到这个简单的解决方案?只是好奇...
    • @NinoŠkopac 目前在桌面上工作得很好,但不能保证可以在移动浏览器上工作。甚至 Mozilla 开发者网站也不显示移动支持。
    • @Parth 也许是这样,只是没有为他们点击
    【解决方案5】:

    您可以使用 jQuery 为自己节省大量空间。你只需要使用:

    $('#myElement').trigger("click")
    

    【讨论】:

    • OP 要求使用 JavaScript。尽管它紧凑且实用,但有些人更喜欢无库的 JS,而不是像 jQuery 这样的东西。
    • 下载jquery节省空间?
    • 有些人也喜欢组装。
    • @MH 我认为更有效的论点是“保持简单”。您在 SO 中的默认配置文件与 jQuery 的大小大致相同。
    【解决方案6】:
    var elem = document.getElementById('mytest1');
    
    // Simulate clicking on the specified element.
    triggerEvent( elem, 'click' );
    
    /**
     * Trigger the specified event on the specified element.
     * @param  {Object} elem  the target element.
     * @param  {String} event the type of the event (e.g. 'click').
     */
    function triggerEvent( elem, event ) {
      var clickEvent = new Event( event ); // Create the event.
      elem.dispatchEvent( clickEvent );    // Dispatch the event.
    }
    

    参考

    【讨论】:

    【解决方案7】:
    document.getElementById('elementId').dispatchEvent(new MouseEvent("click",{bubbles: true, cancellable: true}));
    

    点击此链接了解使用 Javascript 和浏览器兼容性的鼠标事件

    https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent#Browser_compatibility

    【讨论】:

      【解决方案8】:

      这没有很好的记录,但我们可以非常简单地触发任何类型的事件。

      本例会触发50次双击按钮:

      let theclick = new Event("dblclick")
      
      for (let i = 0;i < 50;i++){
        action.dispatchEvent(theclick) 
      }
      <button id="action" ondblclick="out.innerHTML+='Wtf '">TEST</button>
      <div id="out"></div>

      Event 接口表示发生在 DOM 中的事件。

      用户操作可以触发事件,例如点击鼠标 按钮或敲击键盘,或由 API 生成以表示 异步任务的进度。也可以触发 以编程方式,例如通过调用 HTMLElement.click() 方法 一个元素,或通过定义事件,然后将其发送到指定的 使用 EventTarget.dispatchEvent() 定位目标。

      https://developer.mozilla.org/en-US/docs/Web/API/Event

      https://developer.mozilla.org/en-US/docs/Web/API/Event/Event

      【讨论】:

        【解决方案9】:
        document.getElementById("element").click()
        

        只需从 DOM 中选择元素。节点有点击函数,可以调用。

        或者

        document.querySelector("#element").click()
        

        【讨论】:

        • 我知道。我很着急,所以我没有添加解释。对此感到抱歉。
        • 当您通过 id 获取元素时,不要使用 #。如果您想这样做,请使用查询选择器,即document.querySelector('#elment').click();
        • 糟糕,又打错了
        【解决方案10】:
        const Discord = require("discord.js");
        const superagent = require("superagent");
        
        module.exports = {
            name: "hug",
            category: "action",
            description: "hug a user!",
            usage: "hug <user>",
            run: async (client, message, args) => {
            let hugUser = message.mentions.users.first() 
            if(!hugUser) return message.channel.send("You forgot to mention somebody.");
            let hugEmbed2 = new Discord.MessageEmbed()
            .setColor("#36393F")
            .setDescription(`**${message.author.username}** hugged **himself**`)
            .setImage("https://i.kym-cdn.com/photos/images/original/000/859/605/3e7.gif")
             .setFooter(`© Yuki V5.3.1`, "https://cdn.discordapp.com/avatars/489219428358160385/19ad8d8c2fefd03fa0e1a2e49a2915c4.png")
          if (hugUser.id === message.author.id) return message.channel.send(hugEmbed2);
            const {body} = await superagent
            .get(`https://nekos.life/api/v2/img/hug`);
        
            let hugEmbed = new Discord.MessageEmbed()
            .setDescription(`**${message.author.username}** hugged **${message.mentions.users.first().username}**`)
            .setImage(body.url)
            .setColor("#36393F")
             .setFooter(`© Yuki V5.3.1`, "https://cdn.discordapp.com/avatars/489219428358160385/19ad8d8c2fefd03fa0e1a2e49a2915c4.png")
            message.channel.send(hugEmbed)
        }
        }
        

        【讨论】:

        • 嘿!不鼓励仅使用代码的答案。屏幕长的纯代码答案受到双重打击。 (而且我不接受购买更大屏幕的建议。)
        【解决方案11】:

        模拟事件类似于创建自定义事件。模拟鼠标事件

        • 我们必须使用document.createEvent() 创建MouseEvent
        • 然后使用initMouseEvent(),我们必须设置将要发生的鼠标事件。
        • 然后在您要模拟事件的元素上分派鼠标事件。

        在下面的代码中,我使用了setTimeout,以便在 1 秒后自动点击按钮。

        const div = document.querySelector('div');
        
        div.addEventListener('click', function(e) {
          console.log('Simulated click');
        });
        
        const simulatedDivClick = document.createEvent('MouseEvents');
        
        simulatedDivClick.initEvent(
          'click', /* Event type */
          true, /* bubbles */
          true, /* cancelable */
          document.defaultView, /* view */
          0, /* detail */
          0, /* screenx */
          0, /* screeny */
          0, /* clientx */
          0, /* clienty */
          false, /* ctrlKey */
          false, /* altKey */
          false, /* shiftKey */
          0, /* metaKey */
          null, /* button */
          null /* relatedTarget */
        );
        
        // Automatically click after 1 second
        setTimeout(function() {
          div.dispatchEvent(simulatedDivClick);
        }, 1000);
        &lt;div&gt; Automatically click &lt;/div&gt;

        【讨论】:

          【解决方案12】:

          对我有用的解决方案.... 单击按钮可以调用单击事件,也可以从 JavaScript 文件中调用。 在此代码中,要么单击按钮以显示警报,要么在某些条件下或无条件下简单地调用它

              function ss(){
              alert('dddddddddddddddddddddddd');
              }
              var mybtn=document.getElementById('btn');
              mybtn.click();
              <!DOCTYPE html>
              <html>
              <head>
              <title>Page Title</title>
              </head>
              <body>
              
              <h1>This is a Heading</h1>
              <p>This is a paragraph.</p>
              <button id="btn" onclick="ss()">click to see </button>
              </body>
              </html>

          【讨论】:

            猜你喜欢
            • 2011-09-03
            • 1970-01-01
            • 2016-06-14
            • 1970-01-01
            • 2011-03-17
            • 1970-01-01
            • 2011-02-22
            相关资源
            最近更新 更多