UpdatePanel async postbacks slow in Internet Explorer
Wichtig
Die Internet Explorer 11-Desktopanwendung wird für bestimmte Versionen von Windows 10 eingestellt und ab dem 15. Juni 2022 nicht mehr unterstützt.
Sie können mit dem Internet Explorer-Modus in Microsoft Edge weiterhin auf ältere Websites zugreifen, für die Internet Explorer erforderlich ist. Anleitung.
Die Internet Explorer 11-Desktopanwendung wird schrittweise an den schnelleren, sichereren Microsoft Edge-Browser umgeleitet und letztendlich über Windows Update deaktiviert werden. Deaktivieren von IE heute.
In diesem Artikel wird eine Problemumgehung vorgestellt, um das Problem zu beheben, dass beim Aufrufen einer Seite und Auswählen eines Seitenelements eine Verzögerung auftritt.
Ursprüngliche Produktversion: Internet Explorer
Ursprüngliche KB-Nummer: 2000262
Problembeschreibung
Wenn Sie Internet Explorer verwenden, um eine Seite zu durchsuchen, die ein UpdatePanel enthält, gibt es eine Verzögerung (häufig zwischen 10 Sekunden und 45 Sekunden oder mehr), nachdem Sie auf ein Seitenelement geklickt haben, das ein asynchrones Postback initiiert. Die Verzögerung tritt bei Verwendung anderer Browser als Internet Explorer nicht auf.
Ursache
Die PageRequestManager's _destroyTree Methode durchläuft die DOM-Elemente innerhalb von UpdatePanel, bevor ein asynchrones Postback initiiert wird, um DOM-Elemente zu löschen. Die _destroyTree spezifische Implementierung der Methode ist in Internet Explorer langsam, wenn unter bestimmten Bedingungen mit einer großen DOM-Struktur gearbeitet wird, da der HTML-Viewer (mshtml.dll) von Internet Explorer DOM-Elemente im Arbeitsspeicher speichert.
Problemumgehung
Sie können javaScript unten unmittelbar vor dem schließenden </body> Element der Seite hinzufügen, bei dem die Verzögerung auftritt.
<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>
Weitere Informationen
Dieses Skript verwendet die getElementsByTagName Methode, die in Internet Explorer wesentlich schneller als die ursprüngliche Implementierung ist.
Dieser Artikel gilt nur für ältere Versionen von asp.net und Internet Explorer 8 oder früheren Versionen.