【问题标题】:Emulate clicking a link with Javascript that works with IE使用适用于 IE 的 Javascript 模拟单击​​链接
【发布时间】:2009-05-06 02:06:47
【问题描述】:

我想让 java 脚本点击页面上的链接..我在网上发现了一些建议添加这样的函数:

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');

这对 FF 似乎可以正常工作,但在 IE 上它不起作用!

有什么想法吗?

【问题讨论】:

    标签: javascript internet-explorer firefox


    【解决方案1】:

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

    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 );
        }
    }
    

    【讨论】:

    • 我自己在 IE 7 中进行了测试,它可以工作;不错的工作!我讨厌这样一个事实,即当有人简单地问一个 JavaScript 问题时,每个人和他们的妈妈总是跳上框架的潮流。是的,我们知道,我们知道,jQuery 可以为您做任何事情并为您做晚餐,但有时很高兴知道没有这样的库是如何工作的。 (我同时使用 jQuery 和 MochiKit,但我仍然喜欢普通的 JavaScript)。
    • 等等,这没有意义。您正在调用document.createEventObject(),但没有对它返回的事件做任何事情。这与问题中的代码有何不同,为什么它(据说)有效?我很容易认为 Jason 改变了其他一些东西,使他的代码开始工作。
    • @Sid,你对 Jason 改变某些东西是正确的。如果需要,请参阅我的修订以获取详细信息。
    • 很抱歉,IE 的后备方案对我不起作用。当我在 fireOnThis 上调用 fireEvent 时它会停止。
    • 如果您动态创建元素,这似乎不起作用,至少对于 IE8。
    【解决方案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);
        }
    }
    

    【讨论】:

      【解决方案3】:

      如果您仍然遇到错误,请尝试此操作(使用 Jquery + 原型)

      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);
      }
      }
      

      【讨论】:

        【解决方案4】:

        如果你想模拟仅针对链接的点击,你可以使用这个:

        function clickLink(id){
        location.href=document.getElementById(id).href;
        }
        

        【讨论】:

          【解决方案5】:

          我们找到了一种更简单的方法来模拟右键单击(在 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);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-11-06
            相关资源
            最近更新 更多