Speicherauslastung aufgrund von iFrames mit verwaisten Elementen mit Zirkelbezügen in Internet Explorer 8
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 das Problem beschrieben, das die Speichernutzung bei der Navigation von einer HTML-Seite mit einem iframe in Internet Explorer 8 nicht zu beheben ist.
Ursprüngliche Produktversion: Internet Explorer 8
Ursprüngliche KB-Nummer: 2714930
Problembeschreibung
Stellen Sie sich folgendes Szenario vor: Sie verwenden Internet Explorer 8, um eine HTML-Seite anzuzeigen, die einen iframe enthält. In Internet Explorer navigieren Sie vom iframe weg. Daher werden Speicherebenen des entsprechenden iexplorer.exe Prozesses nicht zurückgegeben, was zu einer Auslastung des Speichers führt, wenn die iframe-Seite mehrmals besucht wird. Dieses Problem wird dem Benutzer in Internet Explorer als Speicherverlust angezeigt. Der Speicher wird nur zurückgegeben, wenn Sie von der oberen Seite weg navigieren.
Ursache
Dies kann vorkommen, wenn der iFrame ein DOM-Element dynamisch erstellt und verwaist, seine Eigenschaft festlegt innerHTML und einen Zirkelverweis erstellt (in der Regel über einen Ereignishandler).
Lösung
Um dieses Problem zu beheben, löschen Sie den Ereignishandler, um den Zirkelverweis zu unterbrechen.
Weitere Informationen
Dieses Problem kann mithilfe des folgenden Beispielcodes reproduziert werden. Die Kommentare geben an, wie Sie das Problem beheben können.
top.htm
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=8"/>
</head>
<body>
<a href="about:blank">about:blank</a><br/>
<iframe src="iframe.htm"></iframe>
</body>
</html>
iframe.htm
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=8"/>
<script src="test.js" type="text/javascript"></script>
</head>
<body>
<div style="font-size: 9pt">In Internet Explorer 8, click the link 10x and you'll see private bytes increase.<br/>
Note: Leaving the main page won't clear the memory right away. However, if the top page includes the same test.js file, it will clear the memory right away.<br/>
</div>
</br>
<a href="iframe.htm">iframe</a><br/>
</body>
</html>
test.js
(function ()
{
var div2 = document.createElement("div");
div2.innerHTML = "<div></div>"; // commenting this out will prevent the memory from accumulating
var tmpFnc = null;
div2.attachEvent("onclick", tmpFnc =
function ()
{
}
);
//div2.detachEvent( "onclick", tmpFnc); // calling this will prevent the memory from accumulating
})();
// this is a long comment, Copy and paste the 100 character line below to make the leak more prominent.
// 1000 lines will leak about 1.1-1.2 MB per iteration.
// 34567890123456789001234567890012345678900123456789001234567890012345678900123456789001234567890012345678
Dieses Problem tritt auf, wenn Sie jQuery.js Version 1.7.2 anstelle von test.js einschließen. In früheren Versionen von jQuery kann dieses Problem ebenfalls auftreten. Das Problem kann auch in anderen JavaScript-Bibliotheken auftreten, die dasselbe tun.