警告
廃止され、サポート対象外となった 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 以前にのみ適用されます。