隐藏DIV时IE9崩溃

时间:2013-08-05 04:55:41

标签: javascript jquery internet-explorer-9

注意: 抱歉,我还没有支持本文的代码(仅限敏感的生产代码)。如果时间允许,我会尝试提供简明的工作样本。我希望发表这篇文章,希望能够在追踪类似问题时向其他人提供提示。

使用

  • Internet Explorer 9.
  • jQuery 1.9.2和2.0.0。
  • HTML5 doctype

方案

  • 我将页面拆分为逻辑“屏幕”。
  • 每个屏幕是由类名识别的DIV(例如“formScreen”,“errorScreen”,“confirmationScreen”)。
  • “。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返回以下内容:

Problem signature:
  Problem Event Name:   APPCRASH
  Application Name: IEXPLORE.EXE
  Application Version:  9.0.8112.16496
  Application Timestamp:    51a55c6d
  Fault Module Name:    MSHTML.dll
  Fault Module Version: 9.0.8112.16496
  Fault Module Timestamp:   51a55ff0
  Exception Code:   c00000fd
  Exception Offset: 0032ef01
  OS Version:   6.1.7601.2.1.0.256.48
  Locale ID:    3081
  Additional Information 1: 39a4
  Additional Information 2: 39a4d7f18c1c7c725934453009d2f1b9
  Additional Information 3: ddcf
  Additional Information 4: ddcfafd1b35f05f847ac8d3e7a7bcf12

以下在Visual Studio中调试时:

Unhandled exception at 0x6302EF01 (mshtml.dll) in iexplore.exe: 0xC00000FD: Stack overflow (parameters: 0x00000001, 0x02432F68).  
Unhandled exception at 0x630A172B (mshtml.dll) in iexplore.exe: 0xC0000005: Access violation writing location 0x02430FFC.   // This error continued to show when pressing the debug "continue".

2 个答案:

答案 0 :(得分: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

的第一个回复的启发

答案 1 :(得分: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”可见性设置为折叠。