2009-12-29 3 views
1

Недавно я должен периодически выполнять скрипт, полученный через Ajax с веб-сервера. Я делаю это, сначала создавая тэг Script и назначая текстовый атрибут для запуска скрипта. Затем я распоряжаюсь тег сценария просто чтобы узнать, что память продолжает расти на каждое создание в IE 7. Следующий HTML иллюстрирует проблему:IE утечки памяти для динамически сгенерированного javascript

<html> 
<body> 
<span id='m_garbageBin'></span> 
<script type="text/javascript"> 
    function buttonClicked() 
    { 
     for (var i = 0; i < 100000; i++) 
     { 
      var sc = document.createElement("script"); 
      sc.text = "var x=1;"; 
      document.body.appendChild(sc); 
      m_garbageBin.appendChild(sc); 
      m_garbageBin.innerHTML = ''; 
     } 
    } 
</script> 
<script id='m_dynamicScript' type="text/javascript"> 
</script> 
    <input type='button' value='Click me!' onclick='buttonClicked();'/> 
</body> 

Скрипт ничего не делает вообще и все еще память продолжает увеличиваться при каждом нажатии на кнопку в IE, но не в Firefox (используя .innerHTML вместо .text). Тот факт, что я должен периодически выполнять сценарий для выполнения, не может быть изменен. Кто-нибудь знает, что я могу сделать, чтобы избежать увеличения памяти в IE?

+1

это не "Аякса" –

+0

Где 'm_garbageBin' определено? Кроме того, конечно, использование памяти увеличивается, вы создаете 100000 элементов каждый раз при запуске функции. –

+0

@ Luke: приведенное выше является иллюстрацией проблемы, а не оригинальным сценарием Конрада (по-видимому, часть AJAX отлично работает). – outis

ответ

0

попробуйте delete sc;, когда после установки innerHTML на ''.

+0

Спасибо за предложение, но это не сделало трюк. – Conrad

+0

Операция 'delete' на самом деле завершится неудачно (она вернет false, и ничего не будет удалено), потому что экземпляр переменной, созданный в контексте выполнения *« Код функции »*, устанавливает переменные с атрибутом свойства' {DontDelete} ' , Дополнительная информация: http://bclary.com/2004/11/07/#a-10.2.3 – CMS

3

Попробуйте удалить script элементы только после того, как они добавляются, что-то вроде этого может помочь:

function buttonClicked() { 
    var head = document.getElementsByTagName('head')[0]; 
    for (var i = 0; i < 100000; i++) { 
     var script = document.createElement("script"); 
     script.type = "text/javascript"; 
     script.text = "var x=1;"; 
     head.appendChild(script); 
     head.removeChild(script); 
    } 
} 

Вот как некоторые современные библиотеки, как JQuery make it.

Смотрите также:

+0

Насколько я знаю, IE имеет проблемы с функцией removeChild, которые фактически не освобождают память до тех пор, пока страница выгружается, даже элемент удаляется с помощью этого вызова. Некоторые называют это «psuedo-leak»: http://www.mail-archive.com/[email protected]/msg05231.html – Conrad

Смежные вопросы