2

注意:抱歉,我还没有支持这篇文章的代码(仅限敏感的生产代码)。如果以后时间允许,我将尝试提供一个简洁的工作示例。我想发表这篇文章,希望它可以为其他人提供追踪类似问题的提示。

使用

  • 互联网浏览器 9。
  • jQuery 1.9.2 和 2.0.0。
  • HTML5 文档类型

设想

  • 我有一个页面分成逻辑“屏幕”。
  • 每个屏幕都是一个由类名(例如“formScreen”、“errorScreen”、“confirmationScreen”)标识的 DIV。
  • “.formScreen”包含表单(数据输入)字段,整个页面有单个提交按钮,该按钮从表单数据生成 JSON 包并执行 AJAX 回发。
  • 我“以某种方式”填写表格(我填写表格的顺序似乎有所不同),然后提交。
  • 提交收到响应后,代码会更新显示。

问题

提交后隐藏所有“formScreen”DIV 会导致 IE9 完全崩溃。

最初我定义了一个 formScreens 变量:

var formScreens = $(".formScreens");

然后稍后调用:

$(formScreens).hide();  

这会导致 IE 崩溃。

我还尝试了以下方法,这两个选项也会导致崩溃:

var copyOfFormScreens = $("div.formScreen");

$(copyOfFormScreens).each(function ()  
{  
    $(this).hide();                   // Option 2: This fails too. 
    $(this).css("display", "none");   // Option 3: This fails too.  
});

IE 崩溃错误

IE 崩溃时返回以下内容:

问题签名:
  问题事件名称:APPRCASH
  应用程序名称:IEXPLORE.EXE
  应用程序版本:9.0.8112.16496
  申请时间戳:51a55c6d
  故障模块名称:MSHTML.dll
  故障模块版本:9.0.8112.16496
  故障模块时间戳:51a55ff0
  异常代码:c00000fd
  异常偏移量:0032ef01
  操作系统版本:6.1.7601.2.1.0.256.48
  区域 ID:3081
  附加信息 1:39a4
  附加信息 2:39a4d7f18c1c7c725934453009d2f1b9
  附加信息 3:ddcf
  附加信息 4:ddcfafd1b35f05f847ac8d3e7a7bcf12

在 Visual Studio 中调试时如下:

iexplore.exe 中 0x6302EF01 (mshtml.dll) 处的未处理异常:0xC00000FD:堆栈溢出(参数:0x00000001、0x02432F68)。  
iexplore.exe 中 0x630A172B (mshtml.dll) 处的未处理异常:0xC0000005:访问冲突写入位置 0x02430FFC。// 按调试“继续”时,此错误继续显示。
4

2 回答 2

3

解决方法/解决方案

我发现了一个非常简单的解决方法。

隐藏所需元素之前,我将焦点设置到隐藏的 DIV“外部”的元素(即隐藏屏幕 DIV 后仍然可见的元素)。在我的例子中,我将焦点设置在页面中的第一个容器 DIV 上,结果证明它是隐藏 DIV 的祖先。

DIV 布局的外观:

<div class="mainContent">  
  <div class="fromScreen">
  </div>
  <div class="fromScreen">  
  </div>  
  <div class="fromScreen">  
  </div>  
</div>

所以我现在调用的代码是:

$(".mainContent").trigger("focus");  // Call this before the hide.
formScreens.hide();             // Crashes on submit if focus is not set to higher element first.

关键要点

如果隐藏具有在隐藏之前具有焦点的元素的 DIV 会导致问题,请将焦点移到被隐藏的 DIV 之外的元素。

(我的解决方法是受到http://www.3dvia.com/forums/topic/urgent-crash-in-internet-explorer-when-trying-to-hide-the-experience上的第一个响应的启发)

于 2013-08-05T04:55:41.370 回答
0

我也有一个解决方法。如果您将“visibile”CSS 属性显式设置为“Visible”值而不是隐藏外部 div(将 Visible 设置为 Collapse),它会起作用。如果没有这一步,IE 就会崩溃。

但是,此解决方案在其他浏览器中不起作用,因为内部内容仍然可见。因此,我只是简单地检测浏览器类型,而不是在 IE 中将内部 DIV 可见性设置为“可见”,在其他浏览器中设置为“继承”。

IE 的行为很奇怪,因为它会像我最初预期的那样隐藏整个内容,但是逻辑工作是保持内部内容在其他浏览器中可见。

崩溃是IE中的一个错误,它仍然存在于IE11中。

以 IE 为例:

<div id="outerDiv">
  <div style="visibility:visible">To hide</div>
</div>

其他浏览器的示例:

<div id="outerDiv">
  <div style="visibility:inherit">To hide</div>
</div>

现在将“outerDiv”可见性设置为折叠。

于 2016-12-09T22:06:31.750 回答