метод JQuery html
пытается предотвратить утечку памяти путем удаления обработчиков событий для каких-либо элементов, удаляются в результате вызова .html('')
объекта jQuery.
Из 1.4.2 источника
html: function(value) {
if (value === undefined) {
return this[0] && this[0].nodeType === 1 ?
this[0].innerHTML.replace(rinlinejQuery, "") :
null;
}
// See if we can take a shortcut and just use innerHTML
// THE RELEVANT PART
else if (typeof value === "string" && !rnocache.test(value) &&
(jQuery.support.leadingWhitespace || !rleadingWhitespace.test(value)) &&
!wrapMap[ (rtagName.exec(value) || ["", ""])[1].toLowerCase() ]) {
value = value.replace(rxhtmlTag, fcloseTag);
try {
for (var i = 0, l = this.length; i < l; i++) {
// Remove element nodes and prevent memory leaks
if (this[i].nodeType === 1) {
jQuery.cleanData(this[i].getElementsByTagName("*"));
this[i].innerHTML = value;
}
}
// If using innerHTML throws an exception, use the fallback method
}
catch(e) {
this.empty().append(value);
}
}
else if (jQuery.isFunction(value)) {
this.each(function(i){
var self = jQuery(this), old = self.html();
self.empty().append(function(){
return value.call(this, i, old);
});
});
}
else {
this.empty().append(value);
}
return this;
}
Мы можем видеть, что функция jQuery.cleanData()
называется. Вот источник для этого
cleanData: function(elems) {
var data, id, cache = jQuery.cache,
special = jQuery.event.special,
deleteExpando = jQuery.support.deleteExpando;
for (var i = 0, elem; (elem = elems[i]) != null; i++) {
id = elem[ jQuery.expando ];
if (id) {
data = cache[ id ];
if (data.events) {
for (var type in data.events) {
if (special[ type ]) {
jQuery.event.remove(elem, type);
} else {
removeEvent(elem, type, data.handle);
}
}
}
if (deleteExpando) {
delete elem[ jQuery.expando ];
} else if (elem.removeAttribute) {
elem.removeAttribute(jQuery.expando);
}
delete cache[ id ];
}
}
}
Это выглядит в jQuery.cache
объект для каких-либо свойств типа событий на события объект свойство объекта данных, относящихся к каждому элементу, которые будут удалены при вызове .html('')
и удаляет их.
Чтобы объяснить, как работает стандартное связывание событий, когда функция привязана как обработчик события, созданного на элементе с помощью jQuery, объект данных добавляется как свойство объекта jQuery.cache
. Этот объект данных содержит объект свойств событий, который будет иметь свойство, созданное на нем, с именем, соответствующим типу события, к которому вы хотите привязать функцию обработчика события. это свойство будет содержать массив функций, который должен вызываться, когда событие возникает на элементе, поэтому функция обработчика события добавляется в этот массив.Если это первая функция обработчика событий для типа события и элемента, о котором идет речь, функция jQuery.event.handle
с вызовом применить (используя этот элемент в качестве контекста, так что this
в контексте выполнения функции будет ссылаться на элемент) зарегистрирован в браузер с использованием addEventListener/attachEvent
.
При возникновении события функция jQuery.event.handle
вызовет все функции в массиве в свойстве объекта свойств событий объекта данных, соответствующего типу события и элементу, на котором было создано событие.
Таким образом, html('')
не должно вызывать утечки памяти, поскольку для предотвращения их существует ряд защитных мер.
@ russ Я думаю, что вы правы вчера, я много тестировал и пришел к выводу, что .html (''); также предотвратит утечку памяти, а Внутренний HTML = '' JS вызовет утечку памяти. Я удивляюсь, что jquery делает внутренний список элементов, на которые мы вызвали функцию $() bind() (т. Е. Связали какое-то событие), так что на window.unload мы можем удалить эти события или jquery делает это автоматически для нас. у кого-нибудь есть идея об этом. –
jQuery автоматически связывает функцию для удаления обработчиков событий на 'window.onunload' как часть выполнения внутреннего скрипта. Вы найдете соответствующий код в источнике 1.4.2 непосредственно перед блоком кода Sizzle - http://code.jquery.com/jquery-1.4.2.js :) –
вы правы, даже jquery 1.3.2 версия clear событий, связанных с элементами при выгрузке окна. , поэтому я думаю, что нам не нужно писать наши коды, чтобы очистить связанные события, чтобы избежать утечек памяти. thanx –