次の方法で共有


Internet Explorer で UpdatePanel 非同期ポストバックが遅くなる

警告

廃止され、サポート対象外となった Internet Explorer 11 デスクトップ アプリケーションは、特定のバージョンの Windows 10 で Microsoft Edge の更新プログラムを通じて完全に無効になります。 詳細については、「Internet Explorer 11 デスクトップ アプリの廃止に関する FAQ」をご覧ください。

この記事では、ページにアクセスしてページ要素を選択すると遅延が発生する問題を解決するための回避策について説明します。

元の製品バージョン: Internet Explorer
元の KB 番号: 2000262

症状

Internet Explorer を使用して UpdatePanel を含むページを参照すると、非同期ポストバックを開始するページ要素をクリックした後に遅延 (多くの場合、10 秒から 45 秒以上の間) が発生します。 Internet Explorer 以外のブラウザーを使用する場合、遅延は発生しません。

原因

PageRequestManager's _destroyTree メソッドは、DOM 要素を破棄するために非同期ポストバックを開始する前に、UpdatePanel 内の DOM 要素を反復処理します。 Internet Explorer の HTML ビューアー (mshtml.dll) がメモリに DOM 要素を格納する方法により、一部の条件下で大きな DOM ツリーを操作する場合、 _destroyTree メソッドの特定の実装が Internet Explorer で遅くなります。

回避策

遅延が発生しているページの終了 </body> 要素の直前に、以下の JavaScript を追加できます。

<script language="javascript" type="text/javascript">

    function disposeTree(sender, args)
    {
        var elements = args.get_panelsUpdating();
        for (var i = elements.length - 1; i >= 0; i--)
        {
            var element = elements[i];
            var allnodes = element.getElementsByTagName('*'),
                length = allnodes.length;
            var nodes = new Array(length)
            for (var k = 0; k < length;
                {
                    nodes[k] = allnodes[k];
                }
            for (var j = 0, l = nodes.length; j < l;
            {
                var node = nodes[j];
                if (node.nodeType === 1)
                {
                    if (node.dispose && typeof (node.dispose) === "function")
                    {
                        node.dispose();
                    }
                    else if (node.control && typeof (node.control.dispose) === "function")
                    {
                        node.control.dispose();
                    }
                    var behaviors = node._behaviors;
                    if (behaviors)
                    {
                        behaviors = Array.apply(null, behaviors);
                        for (var k = behaviors.length - 1; k >= 0; k--)
                        {
                            behaviors[k].dispose();
                        }
                    }
                }
            }
            element.innerHTML = "";
        }
    }
Sys.WebForms.PageRequestManager.getInstance().add_pageLoading(disposeTree);
</script>

詳細

このスクリプトでは、 getElementsByTagName メソッドを使用します。Internet Explorer では、元の実装よりもはるかに高速です。

この記事は、以前のバージョンの asp.net および Internet Explorer 8 以前にのみ適用されます。