如何在JavaScript中使用x,y坐标模拟点击?
是否可以使用给定的坐标来模拟网页中的JavaScript点击?出于安全原因,您不能使用JavaScript移动鼠标指针,也不能使用JavaScript模拟点击 您试图完成的是什么?您可以发送一个单击事件,尽管这与真正的单击不同。例如,它不能用来欺骗跨域iframe文档,使其认为它被单击了 所有现代浏览器都支持如何在JavaScript中使用x,y坐标模拟点击?,javascript,jquery,html,mouseevent,mouseclick-event,Javascript,Jquery,Html,Mouseevent,Mouseclick Event,是否可以使用给定的坐标来模拟网页中的JavaScript点击?出于安全原因,您不能使用JavaScript移动鼠标指针,也不能使用JavaScript模拟点击 您试图完成的是什么?您可以发送一个单击事件,尽管这与真正的单击不同。例如,它不能用来欺骗跨域iframe文档,使其认为它被单击了 所有现代浏览器都支持document.element frompoint和HTMLElement.prototype.click(),因为至少IE 6、Firefox 5、任何版本的Chrome,可能还有任何您
document.element frompoint
和HTMLElement.prototype.click()
,因为至少IE 6、Firefox 5、任何版本的Chrome,可能还有任何您可能关心的Safari版本。它甚至会跟踪链接并提交表格:
document.elementFromPoint(x, y).click();
是的,您可以通过创建事件并发送它来模拟鼠标单击:
function click(x,y){
var ev = document.createEvent("MouseEvent");
var el = document.elementFromPoint(x,y);
ev.initMouseEvent(
"click",
true /* bubble */, true /* cancelable */,
window, null,
x, y, 0, 0, /* coordinates */
false, false, false, false, /* modifier keys */
0 /*left*/, null
);
el.dispatchEvent(ev);
}
当心在元素上使用click
方法——它被广泛地实现,但不是标准的,并且在例如PhantomJS中会失败。我假设jQuery的.click()
实现做了正确的事情,但尚未确认。这只是更新为使用MouseeEvent对象
function click(x, y)
{
var ev = new MouseEvent('click', {
'view': window,
'bubbles': true,
'cancelable': true,
'screenX': x,
'screenY': y
});
var el = document.elementFromPoint(x, y);
el.dispatchEvent(ev);
}
它对我不起作用,但它将正确的元素打印到控制台 代码如下:
function click(x, y)
{
var ev = new MouseEvent('click', {
'view': window,
'bubbles': true,
'cancelable': true,
'screenX': x,
'screenY': y
});
var el = document.elementFromPoint(x, y);
console.log(el); //print element to console
el.dispatchEvent(ev);
}
click(400, 400);
你的目标是什么?:)例如,你是想模拟点击图像地图吗?@Aicule:谢谢你让我知道!我将为这个问题补充一些信息。我只是在试验,没有什么真正有效的=)在Chrome和Safari中,你可以点击特定的x,y位置。这就是工作原理。Firefox是唯一一款失败的浏览器,所以可能是Firefox特有的安全策略。答案就在下面,
createEvent()
+initMouseEvent()
在我的例子中,是测试。你完全可以用特定的X/Y坐标模拟点击,尽管它的行为不会完全相同。@RadiantHex:yes,事实上,IE是第一个实现它的,它可以追溯到IE6。Chrome、Firefox和Safari 5的实现很好,但Safari 4和Opera的实现不正确(尽管可行)。看,我很高兴这个发现=D使许多现在认为不可能的事情成为可能。。。或者至少不那么复杂。谢谢这似乎不适用于$.live()事件,有人知道如何使它也适用于用$.live()创建的事件吗?@并且这现在在以下条件下工作:我有网页,我正在从我的域以外的其他域加载Iframe。我想点击iframe区域。你对此有什么解决办法吗?@parixit:不,这是不可能的。您可以模拟单击iframe,但它只会向上传播包含的文档。所包含文档中的任何内容都不会受到影响(出于非常明显的安全原因)。将我从混乱中解救出来。我最初的方法失败了,但这次成功了,谢谢.plus1没有使用jQuery。与公认的答案相反,这个答案确实回答了这个问题。这比jQuery的$功能强大得多。click()
initMouseEvent
已被弃用:您可以使用var event=newmouseevent(“click”,{clientX:x,clientY:y,bubbles:true},而不是弃用的initMouseEvent
)
中也显示了这一点。这一点对我来说很有吸引力。它对这个答案没有任何帮助: