web-dev-qa-db-ja.com

更新KB3154​​070のインストール後、iframeがIEに読み込まれない

主にiframeを処理するアプリケーションがあります(アプリケーション内のさまざまなページをオンデマンドで読み込みます)。

最近、IEブラウザが KB3154​​07 (Current IEバージョン:11.0.9600.18314)でシステムアップデートの一部として更新されました。その更新後、機能の大部分は完全に機能しなくなります。これは、iframeを使用するすべてのページに影響しました。コンテンツが読み込まれず、空白のページが表示されます。下に示すように、ネットワークパネルで検査すると、リクエストが中止されたようです画面キャプチャ ネットワークトラフィックキャプチャ

次のトラブルシューティングを実行しました

すべてのiframeタグが適切に閉じるようにしました。 iframeのソースは空ではありません。 (iframeにロードせずに)同じページに外部からアクセスした場合、正常に動作します。しかし、問題はiframe内だけにあります。この問題の迅速な回避策として、アップデートをロールバックするようユーザーに依頼しました。しかし、これは期待される解決策ではありません。

あなたの助けは本当に感謝しています。

よろしく、スワジェイ。

16
swajay

@Mattの回答は、問題を回避する方法についての手がかりを提供します。 KB3154​​070がインストールされているIEでは、親DOMツリーの準備が完了する前にiframeがスクリプト操作を開始すると、iframeコンテンツがブロックされるようです。 iframeによって読み込まれたリソースにスクリプトが含まれていない場合、ブロッキングが発生しないことに気づきました。 IEがスクリプトでコンテンツをブロックしないこともありますが、これはおそらく、親DOMの準備ができていることとiframeリソースの読み込みとの間の競合状態が原因である可能性があります。

もう1つの観察は、IEをエッジモードで実行しているときに、iframeの読み込みの問題を見たことがないことです。問題は互換モードで実行しているときにのみ発生するようです。

私が取り組んでいるプロジェクトの問題を回避するために、src属性の値を宣言しないiframeをスタブしました。メインページのonloadハンドラー(DOMツリーの準備ができていることを示す)で、JavaScriptを使用してiframeのsrc属性を設定します。これを行うと、iframeが正しく読み込まれるように機能するようです。

たとえば、次のものがあるとします。

<iframe id="myIFrame"></iframe>

Onloadハンドラーには、次のようなものがあります。

document.getElementById('myIFrame').src = '/whatever/url/to/load';

私はまだKB3154​​070が回帰バグ(バグではない場合)を導入したと思いますが、おそらく私が提案したことをアプリケーションに適用できます。

[〜#〜]更新[〜#〜]

IEの更新 KB317016 iframeの読み込みの問題を修正するようです。 Microsoftはバグを正式に認識しています: KB3176757

一部のお客様はIEをすぐに更新できない可能性があるため、変更を維持する予定です。また、行った変更は、サポートする必要があるIEのすべてのバージョンで引き続き機能します。

10
ewh

まったく同じ問題が発生しました。特定のケースでの問題は、iframeが再ペアレント化される(つまり、あるDOMツリーの場所から別の場所に移動される)と、リクエストが中止されることでした。ロード中にiframeを移動しないようにすることで、新しい制限を回避することができました。あなたのケースで正確に何が起こっているのかはわかりませんが、iframeの読み込みの開始と完了の間に発生した何らかのやり取りだったと思います。

4
Matt Burnell

私の会社のレガシーソフトウェアは、この問題によって大きな影響を受けました。 Microsoftがこのバグを解決するまで、次の一般的な解決策を考え出しました。

 $(document).ready(function() {
    loadIframesIE();
 });

 function loadIframesIE() {
    var $iframe;
    $('iframe').each(function(cnt, iframe) {
        $iframe = $(iframe);

        // If the iframe body has no child, it couldn't be loaded
        if ($iframe.contents().find('body').children().length === 0 && !$iframe.attr('resetted')) {

            // Necessary to avoid an infinite loop in some cases
            $iframe.attr('resetted', true);
            $iframe.attr('src', $iframe.attr('src'));

        }
    });
 }
3
fedevegili

私の場合、互換性ヘッダーをEdgeに設定することで問題は修正されました。 KB3154​​070では、ドキュメントモード7および8では機能しませんが、9、10、およびEdgeでは機能します。

また、ドキュメントの読み込み後にsrcを設定するという@ewhの提案は問題なく機能しました。ありがとう。

2
Kosmo