【问题标题】:Detecting cause of IE's Operation Aborted Issue检测 IE 操作中止问题的原因
【发布时间】:2009-04-22 20:11:07
【问题描述】:

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

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

任何人有任何想法或技巧来缩小范围吗?

编辑

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

最终编辑

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

这个问题不是控件的错,它发生是因为弹出窗口的内容实际上是第二种形式。坦率地说,我很惊讶它居然奏效了。

【问题讨论】:

  • IE 的 javascript 错误报告是出了名的无用。您在 Firefox 中遇到任何错误吗?
  • 在 Firefox 中什么都没有。

标签: javascript internet-explorer


【解决方案1】:

您是否有任何 javascript 正在操作 DOM,如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>

【讨论】:

  • 这就是问题所在,我个人没有这样做,但我不知道 ComponentArt 网格、对话框、回调、Ajax 工具包对话框等是否在这样做。
  • 我得到的第一个 javascript 错误来自 Ajax 控件工具包注册弹出窗口。它失败是因为 $get(element) 是 null 所以甚至没有在这里修改 dom...
  • 好的,我刚刚添加了一个示例,说明您可以如何解决该问题。这有帮助吗?
  • 我应该提到,该示例使用 JQuery,但您可以使用任何您喜欢的方法将事件注册到身体的 onload 事件。
  • 不是真的因为我不确定是什么 javascript 导致了这个问题,而且很多 javascript 是由我的服务器端控件发出的,这就是为什么我不能轻易将所有脚本移动到底端。如果我能查明谁是罪犯,那么我可以在他周围工作,将他移除等等......
【解决方案2】:

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

【讨论】:

  • 很好的链接 - 它承认这个错误也发生在 IE8 中,只是不那么频繁。
【解决方案3】:

这是我使用的一个绝妙技巧(基于下面 JS cmets 中的链接),它完全避免了 Op Ab 错误,而不会影响其他浏览器的性能。您首先将您正在执行的任何可能导致错误(例如,加载/实例化第 3 方小部件)的脚本包装在一个函数中,然后在 delayExecutionForIE 函数中调用该函数——注意对 @987654322 的调用@ 有两次,一次用于 IE,一次用于漂亮的浏览器。

您的第 3 方脚本可能会阻止这项工作,具体取决于它的具体作用以及预期的加载方式,但绝对值得一试。

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

【讨论】:

    【解决方案4】:

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

    $( element ).append( someHtml );
    

    所以在 IE 中,只有当对象有结束标记时,才能将内容添加到对象中

    例如下面的代码会导致 IE7 带来消息“操作中止”

    <div id="o">
    
    ...
    $(o).appendChild();
    ...
    
    </div>
    

    正确的方法

    <div id="o">
    
    ...
    
    </div>
    
    $(o).appendChild();
    

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

      • 好吧,我升级到了 IE8,虽然它在发生错误时不再出错,但我失去了应用程序中的关键功能。我很清楚现在是什么导致了这个问题,只需要尝试证明它。感谢您提供更多信息
      • IE8 中仍然会出现该错误,只是不那么频繁了。请参阅上面 Robert.K 的文章。
      【解决方案6】:

      微软确实建议升级到 IE8!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-02-26
        • 1970-01-01
        • 1970-01-01
        • 2020-01-16
        • 1970-01-01
        • 1970-01-01
        • 2010-12-12
        相关资源
        最近更新 更多