这在 JavaScript 中很难做到,即使你完美地编写了代码,在某些情况下和/或浏览器中也可能会失败。您必须记住,JavaScript 不能真正直接触发本机事件,尽管存在一些特定于浏览器的例外情况,请参阅此问题以获取有关该主题的更多信息。
更新:
我建议如果这类似于“如何使用教程”,您可以对其进行屏幕录制,然后在网站上播放视频。如果你真的必须这样做,可能会更容易按照时间顺序从帧中移动光标,并让 jQuery 执行所有必要的事件,避免在 x,y 坐标处检测元素。
话虽这么说,这就是我解决这个问题的方法:
您可以做的是使用 JavaScript + jQuery 模拟大多数事件。例如,如果你想模拟所有元素的点击事件,你应该首先创建一个点击事件处理程序:
// Simulate their standard behavior
// if they already had a click event handler make sure it stops propagation
// or returns false, preventDefault won't stop the browser from following
// their href now.
// Change the #iframe accordingly
$("#iframe").contents().find("a").bind('click', function(){
window.location.href = $(this).attr('href');
});
现在为了确保新绑定的点击事件被触发,我们必须手动触发它。根据你的问题,你知道虚拟鼠标的坐标,所以我假设它们在变量x和y中。
为了获得虚拟鼠标下方的元素,您可以使用 JavaScript 函数elementFromPoint(),但作为大多数真正有用的 JavaScript 函数,它在所有浏览器中的工作方式不同。
我还没有对此进行测试,但是在http://www.zehnet.de/2010/11/19/document-elementfrompoint-a-jquery-solution/上有一个改进版本的功能,假设它可以作为它应该让我们继续前进。
在 iframe 而不是在当前文档中调用 elementFromPoint 非常重要,否则它将返回 iframe 元素(更多信息here)
// x,y should be the coordinates where the virtual mouse is
var elementUnder = $("#iframe").contents().get(0).elementFromPoint(x,y);
if($(elementUnder) !== null){
// Now you must decide what to do, probably depending on the element type
// and finally, if it is an anchor, trigger the click event
if($(elementUnder).is("a")) $(elementUnder).trigger('click');
}
可能有更简单或更优雅的解决方案,尽管我真的想不出。由于 iframe 内的页面位于同一个域中,我想您已经知道它所有可能的内容,这使得这变得更加容易,因为您可以为所有必要的事件准备代码。
对于鼠标悬停事件,您也可以这样做,但请记住,您还必须触发鼠标移出事件。
我已将上面的代码添加到您的 jsFiddle 中,以便您可以看到它在锚标记上工作:http: //jsfiddle.net/XySmQ/4/
您必须记住,有许多事件是 JavaScript 或 jQuery无法重新创建的,例如dropdown drop down。