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 から以下が返されました。

問題の署名:
  問題イベント名: APPCRASH
  アプリケーション名: IEXPLORE.EXE
  アプリケーションのバージョン: 9.0.8112.16496
  アプリケーションのタイムスタンプ: 51a55c6d
  障害モジュール名: MSHTML.dll
  障害モジュールのバージョン: 9.0.8112.16496
  障害モジュールのタイムスタンプ: 51a55ff0
  例外コード: c00000fd
  例外オフセット: 0032ef01
  OS バージョン: 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

私にも回避策があります。外側の div を非表示にする (Visible を Collapse に設定する) よりも、「visible」CSS プロパティを明示的に「Visible」値に設定すると、機能します。この手順を行わないと、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" Visibility を Collapse に設定します。

于 2016-12-09T22:06:31.750 に答える