检测IE操作中止问题的原因

时间:2009-04-22 20:11:08

标签: javascript internet-explorer

我的网站遭遇Operation Aborted error。我觉得奇怪的是,在我的情况下,错误有时只会发生。该网站已经运行了三个月,然后今天它开始发生但不是每次都发生。

此页面出现的页面相当大,有很多第三方控件。我想要的是一个可以确定故障发生位置的工具。似乎我能做的最好就是找到操作中止后发生的第一个javascript错误;但是,这没有多大帮助。这个失败是因为dom的元素不可用,因为IE停止解析HTML,所以我期望这个元素。

任何人都有任何想法或窍门来缩小范围吗?

修改

我很欣赏解决问题的其他方法;但是,我正在寻找的是一种识别导致问题的脚本的方法。

最终编辑

切换到IE8后,我能够确定原因是AjaxControl Toolkit的模态弹出对话框。没有具体的方法来确定这是令人失望的,但调试器让我看到它失败的地方非常一致。由于控件中没有办法告诉它移动它的初始化,我禁用它,并让脚本在我的文档加载事件处理程序中创建客户端控件。

这个问题不是控件的错,它是因为弹出窗口的内容实际上是第二种形式而发生的。坦率地说,我很惊讶它曾经工作过。

6 个答案:

答案 0 :(得分:3)

你是否有任何操纵DOM的javascript,如http://support.microsoft.com/kb/927917#more_information所描述的那样?

尝试将所有脚本块移动到页面的最底部,就在</body>标记之前,并且不要尝试设置body标记本身的innerHTML属性。

如果问题是在完全构建DOM之前执行javascript,请尝试将任何初始化调用移动到仅在页面完全加载后才会运行的函数。所以,而不是像这样的东西:

<div class="myWidgetControl"/>
<script type="text/javascript">
  initializeWidgets();
</script>

尝试这样的事情:

<div class="myWidgetControl"/>
<script type="text/javascript">
  $(document).ready(
    function () { initializeWidgets(); }
  );
</script>

答案 1 :(得分:3)

您可以使用IE Blog提供的脚本来调查问题。请参阅:http://blogs.msdn.com/ie/archive/2009/09/03/preventing-operation-aborted-scenarios.aspx

答案 2 :(得分:1)

这是我使用的一个漂亮技巧(基于下面JS注释中的链接),完全避免Op Ab错误而不影响其他浏览器的性能。您首先将您正在执行的任何脚本包装在一个函数中,然后在delayExecutionForIE函数中调用该函数,然后调用该函数,该函数会导致错误(例如,加载/实例化第三方窗口小部件) myFunction在那里两次,一次用于IE,一次用于好的浏览器。

您的第三方脚本可能会阻止此操作,具体取决于它的确切功能以及预期加载方式,但绝对值得一试。

function delayExecutionForIE() {
      if ( typeof document.all == "object" && 
           (document.readyState != "loaded" 
           && document.readyState != "complete") 
         ) {
            try {
                  //If IE is used, use the trick by Diego Perini
                  //http://javascript.nwbox.com/IEContentLoaded/
                  document.documentElement.doScroll("left");
                  myFunction();
            } catch(error) {
                  setTimeout(delayExecutionForIE, 200);
            }
      } else {
            myFunction();
      }
}

function myFunction() {
    //this is your function that manipulates the DOM
}

delayExecutionForIE();

答案 3 :(得分:1)

在大多数情况下,它是JS中的DOM问题。

$( element ).append( someHtml );

因此,在IE中,只有当对象具有结束标记

时才能向对象添加内容

例如,下面的代码将导致IE7显示消息“Operation aborted”

<div id="o">

...
$(o).appendChild();
...

</div>

正确的方式

<div id="o">

...

</div>

$(o).appendChild();

答案 4 :(得分:0)

虽然IE8将不再导致该错误完全“崩溃”渲染,而是记录错误,但遗憾的是它没有被新的开发人员工具中的JavaScript调试器捕获,并且错误消息不会告诉您错误确实发生了。

一个解决方法,这肯定是单调乏味,但可以找到问题,是使用IE8的调试器在运行的第一段JavaScript代码上放置一个断点,然后继续点击“Step”按钮直到错误图标弹出浏览器的左下角。当发生这种情况时,您知道导致错误的代码行是在您单击步骤之前突出显示的代码行。不过,这可能是你要介入的相当多的代码,但我想不出其他任何东西(好吧,除了联系第三方代码的供应商,看看他们是否有任何可能相关的更新)。

当然,您可以告诉您的用户升级到IE8。 ;)

答案 5 :(得分:0)

微软确实建议升级到IE8!

相关问题