2013-06-03 3 views
8

У меня есть всплывающий плагин, который устанавливает html-содержимое <div/> с ответом на вызов AJAX.Необходимо вызвать empty() перед html() или перед innerHTML?

Каждый раз, когда я открываю всплывающее окно, в коде я просто звоню $("#popup").html(response). Это переопределяет существующий html-контент с новым контентом.

Должен ли я позвонить $("popup").empty() перед тем, как позвонить $("popup").html(response), поэтому я освобожу память браузера, используемую объектами, которые ранее были в div $("popup")? (в конечном итоге предотвратить утечку памяти)

PS: что, если я позвоню $("popup")[0].innerHTML = response? должен ли я позвонить .empty() метод?

+0

http://stackoverflow.com/questions/8567957/is-empty-enough-for-big-ajaxy-apps?rq=1 –

ответ

7

Короткий ответ №.

jQuery.fn.html использует DOMNode.innerHTML = после выполнения нескольких других вещей. Один из них - удалить любые сохраненные данные на узлах (хранится через $.fn.data), см. http://james.padolsey.com/jquery/#v=git&fn=jQuery.fn.html для получения полного обзора источника.

.innerHTML удаляет детей и заменяет новый html. Но остерегайтесь утечек памяти. Я бы использовал jQuery.fn.empty перед настройкой innerHTML. например.

var a = document.createElement('div'), 
    b = document.createElement('div'); 

    b.appendChild(a); 

    b.innerHTML = 'new innerHMTL'. 

Вы бы подумали, что все в порядке. Но узел заменяет/удаляет, все еще фиксируется в varible a и поэтому не попадает в сборщик мусора. Я не уверен, кастрированный баран или не что Jquery магазины DOMNodes внутренний, пока вы звоните jQuery.removeData и т.д.

4

JQuery документация метода HTML говорит:

Когда .html() используется для установки содержимого элемента, любое содержание, которое было в этом элементе полностью заменяется новым содержанием. Кроме того, jQuery удаляет другие конструкторы, такие как обработчики данных и событий, из дочерних элементов, прежде чем заменять эти элементы новым контентом.

Поэтому вам не нужно звонить empty().

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