Подтвердить что ты не робот

Массивная утечка памяти IE7 при уничтожении диалогового окна JQuery UI при закрытии

Я искал ответы на все вопросы или даже ссылку на эту конкретную проблему безрезультатно. Я использую JQuery UI 1.8.7 и JQuery 1.5.1. У меня есть диалог, который я хочу не только уничтожить при закрытии, но и удалить из DOM по закрытию. Это отлично работает в Firefox. Однако, когда я делаю то же самое в IE7, я вижу 6MB-шип в использовании памяти для браузера, и эта память никогда не восстанавливается до тех пор, пока я полностью не выключу браузер. Поэтому моя первая мысль заключалась в том, что что-то в моем диалоге вызывает утечку памяти. Я удалил все, что добавлял, и сделал простой диалог, используя следующий код:

$('<div id="testMe">hello</div>').dialog({
    modal: true,
    autoOpen: true,
    close: function() { $(this).dialog('destroy'); }
});

Когда я открою это диалоговое окно, закройте его и обновите браузер. Я всегда получаю больше памяти на 6 Мбайт, чем раньше. Если я открою это диалоговое окно, но затем обновить браузер до его закрытия, то я не вижу всплеска памяти вообще. Я понятия не имею, что может быть причиной этого - я нашел кучу потоков об общих утечках памяти JQuery UI, но ни один из исправлений не сделал ничего, чтобы исправить мою ситуацию.

Я также подумал, что, возможно, какой-то другой код в моем проекте мешает. Это не так. Если я делаю то же самое, используя этот пример jsFiddle, я получаю всплеск памяти! (http://jsfiddle.net/n68Af/1/). На данный момент я понятия не имею, куда еще повернуть или что еще делать. Мне нужно уничтожить эти диалоги и удалить их из DOM - в нашем (очень большом) приложении есть несколько примеров диалоговых окон, которые учитывают тот факт, что диалог Div больше не находится в DOM после закрытия.

Изменить: изменение значения модального флага не влияет. Кроме того, я понимаю, что мой пример не удаляет элемент из DOM. Я делаю это или нет, утечка памяти остается. Код в моем фактическом проекте просто удаляет элемент из dom, используя $(this).remove(). Я упростил этот пример, потому что реальная проблема - это вызов "destroy", оставляющий какую-то циклическую ссылку или что-то, что вызывает упоминание о всплеске памяти 6 МБ.

Изменить: после изучения этого больше не кажется, что я использую виджет JQuery UI (я попробовал Dialog, свой собственный виджет и Button). Пока я удаляю элемент, который виджет ссылается на DOM, я вижу огромную утечку памяти в IE7. Утечка памяти также возникает, если я перемещаю элементы в другое место в DOM. Я попробовал создать "мусорный ящик" DIV, чтобы я переместил все содержимое своего диалога, а не удалял их полностью, и произошел тот же всплеск.

Приветствуется любая помощь или направление. Спасибо заранее, ребята!

4b9b3361

Ответ 1

$('<div id="testMe">hello</div>').dialog({
    modal: true,
    autoOpen: true,
    close: function() { $(this).dialog('destroy').remove(); }
});

Это полностью удалит диалог из DOM

Ответ 2

Почему это действительно происходит, я не уверен. У IE есть история появления странных ошибок с момента запуска IE. Лучшим вариантом для вас является обновить вашу библиотеку jQuery до последней версии. Если это не сработает, вы можете попробовать создать собственное диалоговое окно, которое на самом деле не так сложно.

Проблема может заключаться в том, что удаление элемента из DOM кажется сбойным. В этом случае вы можете повторно использовать объект и элемент диалога, чтобы вам не нужно было .remove() его.