我怎样才能模拟点击一个锚标签?

我想模拟点击一个锚点标签与所有额外的东西,如正确的目标处理。

锚点的DOM对象似乎有一个“[click()] [3]”方法,但不是所有的浏览器都支持这个方法。 Firefox会抛出这个错误:

错误:anchorObj.click不是一个函数

它在Opera 10和Konqueror上的工作也很奇怪,当它在一个周围的div的onclick处理程序中被调用时会造成无限的点击。 我猜只有IE8可以正常工作。 无论如何,我不希望它,因为主要浏览器大多有问题。

我在Mozilla论坛中为Firefoxfind了这个备用解决scheme:

var evt = document.createEvent("MouseEvents"); evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); anchorObj.dispatchEvent(evt); 

这对我来说似乎太难看又笨拙。 我不知道它是多么兼容,我想尽可能避免编写浏览器特定的代码。

我不能使用location.href = anchorObj.href; 因为它不处理“目标”属性。 我可以根据目标的价值做一些硬编码,但是我也想避免这种情况。

有build议切换到JQuery,但我不知道如何处理目标属性,因为我以前没有用过它。

这里是一个完整的testing用例,它模拟click事件,调用附加的所有处理程序(保持连接),维护"target"属性(IE中的"srcElement" ),像普通事件一样的气泡,模拟IE的recursion -预防。 在FF 2,Chrome 2.0,Opera 9.10以及IE(6)testing:

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <script> function fakeClick(event, anchorObj) { if (anchorObj.click) { anchorObj.click() } else if(document.createEvent) { if(event.target !== anchorObj) { var evt = document.createEvent("MouseEvents"); evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); var allowDefault = anchorObj.dispatchEvent(evt); // you can check allowDefault for false to see if // any handler called evt.preventDefault(). // Firefox will *not* redirect to anchorObj.href // for you. However every other browser will. } } } </script> </head> <body> <div onclick="alert('Container clicked')"> <a id="link" href="#" onclick="alert((event.target || event.srcElement).innerHTML)">Normal link</a> </div> <button type="button" onclick="fakeClick(event, document.getElementById('link'))"> Fake Click on Normal Link </button> <br /><br /> <div onclick="alert('Container clicked')"> <div onclick="fakeClick(event, this.getElementsByTagName('a')[0])"><a id="link2" href="#" onclick="alert('foo')">Embedded Link</a></div> </div> <button type="button" onclick="fakeClick(event, document.getElementById('link2'))">Fake Click on Embedded Link</button> </body> </html> 

在这里演示。

它通过检查事件的target属性( 在传播过程中保持不变 )来检查发起模拟点击的事件对象,从而避免在非IE浏览器中进行recursion。

IE显然在内部持有对其全局event对象的引用。 DOM级别2没有定义这样的全局variables,所以出于这个原因,模拟器必须通过event本地拷贝。

那么,你可以非常快速地通过jQuery来testing点击发送

 $('#link-id').click(); 

如果点击目标时仍然存在问题,则可以始终这样做

 $('#link-id').click( function( event, anchor ) { window.open( anchor.href, anchor.target, '' ); event.preventDefault(); return false; }); 

引自https://developer.mozilla.org/en/DOM/element.click

点击方法旨在与button,checkbox,收音机,重置或提交types的INPUT元素一起使用。 Gecko并没有在其他元素上实现click方法,这些元素可能会被期望响应鼠标点击,例如链接(A元素),也不一定会触发其他元素的点击事件。

非壁虎DOM可能会有不同的performance。

不幸的是,这听起来像你已经发现你的问题的最佳解决scheme。

作为一个方面说明,我同意你的解决scheme看起来不太理想,但是如果你把这个function封装在一个方法里面(就像JQuery一样),它并不是那么糟糕。

有一个更简单的方法来实现它,

HTML

 <a href="https://getbootstrap.com/" id="fooLinkID" target="_blank">Bootstrap is life !</a> 

JavaScript的

 // Simulating click after 3 seconds setTimeout(function(){ document.getElementById('fooLinkID').click(); }, 3 * 1000); 

使用普通的javascript模拟一个点击与寻址目标属性。

你可以在这里查看jsFiddle的工作示例。