如何使用JavaScript模拟点击?

Bel*_*ish 263 javascript

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

目前我有:

<script type="text/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);
    }
}
</script>

<a href="http://www.google.com" id="mytest1">test 1</a><br>

<script type="text/javascript">
    simulateClick(document.getElementById('mytest1'));
</script>
Run Code Online (Sandbox Code Playgroud)

但它不起作用:(

有任何想法吗?

Koo*_*Inc 385

这就是我做的东西.这很简单,但它有效:

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

用法:

eventFire(document.getElementById('mytest1'), 'click');
Run Code Online (Sandbox Code Playgroud)

  • 好吧,我在投票按钮上尝试了你的java脚本:)(工作当然) (53认同)
  • `Event.initEvent`现在已被弃用**https://developer.mozilla.org/en/docs/Web/API/Event/initEvent (14认同)
  • @Anderson Green:我在这个jsfiddle中添加了一个例子:http://jsfiddle.net/KooiInc/W4BHD/ (12认同)
  • 证明这是有效的(在Chromium中):带有`document.querySelector('[value ="2706236"]')的+1.nextSibling.nextSibling.dispatchEvent(ev);`:) (3认同)
  • @brilliant:这会不够简单?http://jsfiddle.net/KooiInc/VM5qY/ (3认同)

Dar*_*ney 328

简单的事情怎么样:

document.getElementById('elementID').click();
Run Code Online (Sandbox Code Playgroud)

IE甚至支持.

  • 这之前不存在吗?为什么2010年的答案没有提到这个简单的解决方案?只是好奇... (18认同)
  • 但什么版本的IE?"在IE中工作"就像是说"在Windows上工作"...... (12认同)
  • 问题是"它是否也有效?" - 答案是肯定的 - AFAIK至少降至8,未检查7 (6认同)
  • @Parth +1,我想知道是否也有任何缺点 (4认同)
  • @NinoŠkopac目前非常适合台式机,但不能保证与移动浏览器一起使用。甚至mozilla开发人员网站也没有显示移动支持。 (2认同)
  • @Parth也许是这样,只是没有为他们“点击”。 (2认同)

Bra*_*ing 75

您是否考虑过使用jQuery来避免所有浏览器检测?使用jQuery,它将如下所示:

$("#mytest1").click();
Run Code Online (Sandbox Code Playgroud)

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

Ada*_*lma 16

你可以使用jQuery为自己节省一大堆空间.你只需要使用:

$('#myElement').trigger("click")
Run Code Online (Sandbox Code Playgroud)

  • 通过下载jquery节省空间? (35认同)
  • OP要求使用JavaScript.虽然这是紧凑和功能性的,但是有些人更喜欢no-Library JS而不是像jQuery这样的东西. (8认同)
  • 有些人也喜欢装配. (7认同)

mni*_*chi 14

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.
}
Run Code Online (Sandbox Code Playgroud)

参考

  • 我相信这应该是当今最好的答案 (2认同)

小智 10

在 javascript 中,通过 id 或类名抓取元素,然后应用.click()以使点击发生,如下所示:

document.getElementById("btnHandler").click();
Run Code Online (Sandbox Code Playgroud)


bri*_*itt 7

最好的答案是最好的!但是,它在Firefox中没有触发鼠标事件etype = 'click'.

所以,我改变了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.
    } 
  }
}
Run Code Online (Sandbox Code Playgroud)


Pra*_*mar 6

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

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

在下面的代码中,我使用了setTimeout1 秒后自动单击按钮的功能。

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);
Run Code Online (Sandbox Code Playgroud)
<div> Automatically click </div>
Run Code Online (Sandbox Code Playgroud)