Утечка памяти в IE 8 при перезагрузке кадра в frameset - PullRequest
0 голосов
/ 19 марта 2012

Я включил JQuery в HTML-страницу, которую фрейм ссылается на набор фреймов, и когда я несколько раз обновлял фрейм, браузер теряет память.

home.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
        "http://www.w3.org/TR/html4/frameset.dtd">
<html>
<head>
    <frameset cols="50%,50%*" border="0" frameborder="1" framespacing="1">
        <frame src="link.html" scrolling="no" frameborder="0" noresize="yes" />
        <frame name="jqueryhost" src="" scrolling="no" frameborder="0" noresize="yes" />
    </frameset>
</head>
<body>

</body>
</html>

link.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title></title>
</head>
<body>
    <a href="jqueryhost.html" target="jqueryhost">load jQuery in a frame</a>
</body>
</html>

jqueryhost.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title></title>
    <script type="text/javascript" src="jquery-1.3.2.min.js"></script>

</script>

</head>
<body>
    jQuery Host
</body>
</html>

Снимок экрана с утечкой памяти

enter image description here

Ответы [ 2 ]

1 голос
/ 28 марта 2012
<html>
    <frameset cols="50%,50%" border="0" frameborder="1" framespacing="1">
        <frame src="link.html" />
        <frame src="jqueryhost.html" />
    </frameset>
</html>

, а также в вашем jqueryhost.html у вас отсутствует </script> закрывающий тег

0 голосов
/ 28 марта 2012

Я бы предположил (проприетарный код делает невозможным быть уверенным), что «утечка», которую вы видите, - это ранее загруженные скрипты JQuery. На самом деле вы можете загрузить тег сценария, удалить его, а затем по-прежнему вызывать глобальные функции, которые были определены в этом теге (у меня есть образец этого в конце).

Так что я думаю, что вы видите не столько утечку памяти, сколько сборку мусора, в которой еще нет очистки кода, который был загружен ранее.

Пример вызова функций, которые были загружены, но удалены из DOM:

    <html>
    <body>
    <script type='text/javascript' src='https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js'></script>
    <script id="t1" type='text/javascript'>
      function f1(){
        alert("f1");
      }
    </script>
    <script id="t2" type='text/javascript'>
      function f2(){
        alert("f2");
      }
    </script>
    <script type='text/javascript'>
      f1();
      f2();
      $("#f1").remove();
      $("#f2").remove();
      f1();
      f2();
    </script>
    </body>
    </html>
...