使用JavaScript模拟点击链接以在IE浏览器中运行

22

我想让JavaScript点击页面上的链接。我在网上找到了一些建议添加以下函数的内容:

function fireEvent(obj,evt){

    var fireOnThis = obj;
    if( document.createEvent ) {
      var evObj = document.createEvent('MouseEvents');
      evObj.initEvent( evt, true, false );
      fireOnThis.dispatchEvent(evObj);
    } else if( document.createEventObject ) {
      fireOnThis.fireEvent('on'+evt);
    }
}

然后使用以下方式调用:

fireEvent(document.getElementById('edit_client_link'),'click');

这在Firefox上似乎没问题,但在IE上不起作用!

有任何想法吗?

5个回答

36

我认为你仍然需要调用document.createEventObject -- 你只是检查它是否存在。以下是未经测试的代码,但基于文档,它应该可以工作。

function fireEvent(obj,evt){

    var fireOnThis = obj;
    if( document.createEvent ) {
      var evObj = document.createEvent('MouseEvents');
      evObj.initEvent( evt, true, false );
      fireOnThis.dispatchEvent( evObj );

    } else if( document.createEventObject ) {
      var evObj = document.createEventObject();
      fireOnThis.fireEvent( 'on' + evt, evObj );
    }
}

17
我自己在IE 7中进行了测试,这个方法可行;干得好!我讨厌每个人都会跟风使用框架,即使只是简单地问一个JavaScript问题。是的,我们知道jQuery可以做任何事情并为你做晚餐,但有时不使用库也很好,知道事情如何工作。 (我同时使用jQuery和MochiKit,但我仍然喜欢纯粹的JavaScript)。 - Jason Bunting
1
等等,这不合理。你调用了 document.createEventObject(),但没有对其返回的事件做任何处理。这与问题中的代码有什么不同,为什么它(据说)能工作?我很想认为 Jason 改变了其他东西,使他的代码开始工作。 - s4y
1
抱歉,但IE的备用选项对我来说无法工作。当我在fireOnThis上调用fireEvent时,它就停止了。 - André Alçada Padez
2
如果您正在动态创建元素,至少对于IE8而言,这似乎无法正常工作。 - kamranicus
如果您需要同时进行SHIFT-CLICK,例如“e.shiftKey”+“e.click”,您可以怎么做? - dza
显示剩余2条评论

2

一开始这个方法对我没用,后来我发现代码缺少IE部分的一个参数。以下是应该可行的更新代码:

function fireEvent(obj, evt) {
    var fireOnThis = obj;

    if (document.createEvent) {
        // alert("FF");
        var evtObj = document.createEvent('MouseEvents');
        evtObj.initEvent(evt, true, false);
        fireOnThis.dispatchEvent(evtObj);
    } 

    else if (document.createEventObject) {
        // alert("IE");
        var evtObj = document.createEventObject();
        fireOnThis.fireEvent('on'+evt, evtObj);
    }
}

1
如果您仍然遇到错误,请尝试这个方法(使用Jquery + prototype)。
function fireEvent(element,event){  
if (document.createEventObject){
// dispatch for IE
try {
      var evt = document.createEventObject();
      jQuery(element).change();
      return element.fireEvent('on'+event,evt);
} catch(e) { }                  
}
else{
// dispatch for firefox + others
var evt = document.createEvent("HTMLEvents");
evt.initEvent(event, true, true ); // event type,bubbling,cancelable
return !element.dispatchEvent(evt);
}
}

0
如果您想模拟点击仅限于链接,您可以使用以下代码:
function clickLink(id){
location.href=document.getElementById(id).href;
}

0

我们发现了一种更简单的模拟右键点击的方法(在IE8中测试过)。使用双击或两次单击,然后使用Shift-F10进行右键单击。我不知道为什么这样做可以,但它确实有效。在下面的示例代码中,我们使用Selenium方法进行两次点击,然后使用IE驱动程序查找WebElement并发送Shift-F10键序列,以模拟鼠标右键单击。我们将其用于测试基于GWT的Web应用程序。其中一个地方它效果不太好的是在树形控件中,上下文菜单设置为出现在鼠标坐标处。经常情况下,鼠标坐标是负数,因此右键单击菜单项不会导致子菜单选项被显示。为了处理这种情况,我们向控件添加了一些代码,以便如果鼠标坐标为负,则上下文菜单将出现在0,0处。

selenium.click("//td[@role='menuitem' and contains(text(), 'Add')]");
selenium.click("//td[@role='menuitem' and contains(text(), 'Add')]");
new InternetExplorerDriver().findElement(By.xpath("//td[@role='menuitem' and contains(text(), 'Add')]")).sendKeys(Keys.SHIFT, Keys.F10);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接