Как я могу заставить сборку мусора Javascript в IE? IE работает очень медленно после AJAX-вызовов и манипуляций с DOM - PullRequest
9 голосов
/ 03 мая 2010

У меня есть страница с выпадающими списками. Выбор option из первого select заполняет второе, а выбор option из второго select возвращает таблицу результатов сопоставления с использованием функции innerHtml для пустой div на странице.

Проблема в том, что после того, как я сделал свой выбор и значительный объем данных перенесен на страницу, весь последующий Javascript на странице работает исключительно медленно. Кажется, что все данные, которые я извлек через AJAX для заполнения div, все еще занимают много памяти. Я попытался установить возвращаемый объект, содержащий результаты AJAX, равным null после вызова innerHtml, но безуспешно.

Firefox, Safari, Chrome и Opera не показывают снижения производительности, когда я использую Javascript для вставки большого количества данных в DOM, но в IE это очень очевидно. Чтобы проверить, что это проблема Javascript / DOM, а не просто старая проблема IE, я создал версию страницы, которая возвращает все результаты при начальной загрузке, а не через AJAX / Javascript, и обнаружил, что IE не имеет проблем с производительностью.

К вашему сведению, я использую метод jQuery.get в jQuery для выполнения вызова AJAX.

РЕДАКТИРОВАТЬ Вот что я делаю:

<script type="text/javascript">
function onFinalSelection() {
  var searchParameter = jQuery("#second-select").val();
  jQuery.get("pageReturningAjax.php",
  {SEARCH_PARAMETER: searchParameter},
  function(data) {
    jQuery("#result-div").get(0).innerHtml = data;
   //jQuery("#result-div").html(data); //Tried this, same problem
    data = null;
  },
  "html");
}
</script>

Хочу отметить, что это становится проблемой только тогда, когда возвращаемое значение data достаточно велико. Это напрямую связано с размером, поскольку я могу видеть умеренное замедление для результатов среднего размера и только значительное замедление, когда возвращается несколько сотен записей +.

Ответы [ 3 ]

15 голосов
/ 21 мая 2010

Вы можете форсировать сборку мусора в IE с помощью функции CollectGarbage , например,

if (typeof(CollectGarbage) == "function")
    CollectGarbage();

Сборщик мусора JScript подробно описан в этой записи блога: http://blogs.msdn.com/ericlippert/archive/2003/09/17/53038.aspx

Как говорится в блоге, сборщик мусора непредсказуем, поэтому удаление данных или data = null будет не немедленно восстановить память, но в конечном итоге вернуть его.


Но я сомневаюсь, что снижение производительности действительно вызвано использованием памяти; Я думаю, что это проблема с рендерингом DOM.

7 голосов
/ 03 мая 2010

Используйте

$("#result-div").html(data);

html() использует метод jQuery empty, который очень усердно работает для предотвращения утечек памяти.

пробовали ли вы:

delete data;

Я думаю, что в вашем коде есть другие проблемы с производительностью, вызывающие медлительность. Используются ли ваши возвращаемые данные в формате png с альфа-прозрачностью? Я видел, что убивают IE6 (когда применяется альфа-фильтр) и значительно замедляют IE7.

3 голосов
/ 11 мая 2012

Если кто-то интересуется не только IE:

Для принудительного сбора мусора в Gecko:

window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
  .getInterface(Components.interfaces.nsIDOMWindowUtils)
  .garbageCollect();

Ссылка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...