El uso de memoria aumenta debido a los iframes con elementos huérfanos con referencias circulares en Internet Explorer 8
Importante
La aplicación de escritorio Internet Explorer 11 está retirada y sin soporte a partir del 15 de junio de 2022 para determinadas versiones de Windows 10.
Todavía puede acceder a sitios antiguos heredados que requieren Internet Explorer con el modo Internet Explorer en Microsoft Edge. Obtenga más información.
La aplicación de escritorio Internet Explorer 11 se redirigirá progresivamente al explorador Microsoft Edge, más rápido y seguro. En última instancia, se deshabilitará a través de Windows Update. Deshabilite IE hoy.
En este artículo se describe el problema que aumenta el uso de memoria al salir de una página HTML que contiene un iframe en Internet Explorer 8.
Versión del producto original: Internet Explorer 8
Número KB original: 2714930
Síntomas
Imagina la siguiente situación: Usa Internet Explorer 8 para ver una página HTML que contiene un iframe. En Internet Explorer, se navega lejos del iframe. Como resultado, no se devuelven los niveles de memoria del proceso iexplorer.exe correspondiente, lo que provoca una acumulación de memoria si la página iframe se visita varias veces. Este problema aparecerá como una pérdida de memoria en Internet Explorer para el usuario. La memoria solo se devuelve si se desplaza lejos de la página superior.
Causa
Esto puede ocurrir si el iframe crea dinámicamente y huérfana un elemento DOM, establece su propiedad y crea una referencia circular (normalmente a través de un controlador innerHTML de eventos).
Solución
Para resolver este problema, desactive el controlador de eventos para interrumpir la referencia circular.
Más información
Este problema se puede reproducir con el código de ejemplo siguiente. Los comentarios indican cómo se puede solucionar el problema.
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
Este problema se puede ver si incluye jQuery.js v1.7.2 en lugar de test.js. Las versiones anteriores de jQuery también pueden mostrar este problema. Además, el problema puede verse en otras bibliotecas de JavaScript que hacen lo mismo.