2011-09-17 61 views
4

我有一个小型刮板,我需要使用JavaScript单击一个锚点链接。我尝试了几种方法:jQuery.click()document.createEvent('MouseEvents')等等。它们都有效,但是它们并不像人类点击那样完全执行(它们像打开标签一样打开标签,但不会开始下载)。在JavaScript中模拟人类点击

锚标记有这个属性:

onclick="if (document.getElementById('ReportViewer_ctl01_ctl05_ctl00').selectedIndex == 0) return false; 
if (!ClientToolbarReportViewer_ctl01.HandleClientSideExport()) __doPostBack('ReportViewer$ctl01$ctl05$ctl01','');return false;" 

我也试着运行这个关键,在命令行:

__doPostBack('ReportViewer$ctl01$ctl05$ctl01','') 

这也是这类作品,但并不完全像人类点击。

如果需要,我可以进入更多细节,但目前我正在寻找一个我认为应该存在的魔法子弹。

+0

为什么不用'PHP cURL'访问所需的uri(如果你使用PHP作为服务器端语言)? – yoda

+0

我认为这种差异性有一个有意识的基于安全性的原因;它似乎是为了防止驱动器下载/ EULA接受等等。虽然我可以很可恶,*可恶*错误。 –

+0

@yoda谢谢,不使用PHP,它是一个杂乱无章的杂凑。该链接实际上提交了一个表单来模拟下载。 –

回答

4

我保留了一个pastebin以两种编程方式来完成它。 。它永远只能让我失望,当谷歌决定剥夺它们的默认功能窗口对象(和所有其他物体)>>

http://pastebin.com/VMHvjRaR

function callClickEvent(element){ 
    var evt = document.createEvent("HTMLEvents"); 
    evt.initEvent("click", true, true); 
    element.dispatchEvent(evt); 
} 

function callClickEvent2(element){ 
    var evt = document.createEvent("MouseEvents"); 
    evt.initMouseEvent("click", true, true, window, 
    0, 0, 0, 0, 0, false, false, false, false, 0, null); 
    element.dispatchEvent(evt); 
} 

callClickEvent(document.getElementById("myElement")) 
callClickEvent2(document.getElementById("myElement")) 

MDN文件:

+0

我不确定这是否适用于IE ... – hugomg

+1

**现场演示1:** http://jsfiddle.net/fCbMY/(适用于所有当前浏览器;不适用于IE8,因为IE8不适用实现DOM事件) –

+1

**现场演示2:** http://jsfiddle.net/fCbMY/1/(再次,在所有当前的浏览器中工作;在IE8中不起作用) –