Я думал, что Дэвид может быть на что-то с предполагаемой утечкой removeChild, но я не могу воспроизвести это в IE8 ... это может случиться в более ранних браузерах, но это не то, что мы имеем здесь. Если я удаляю вручную div'ы, утечки нет; если я изменю jQuery, чтобы использовать outerHTML= ''
(или move-to-bin, а затем bin.innerHTML) вместо removeChild, все равно будет утечка.
В процессе исключения я начал взламывать биты remove
в jQuery. строка 1244 в 1.3.2:
//jQuery.event.remove(this);
jQuery.removeData(this);
Комментирование этой строки не привело к утечке.
Итак, давайте посмотрим на event.remove, он вызывает data('events')
, чтобы увидеть, есть ли какие-либо события, связанные с элементом. Что data
делает?
// Compute a unique ID for the element
if ( !id )
id = elem[ expando ] = ++uuid;
О. Таким образом, он добавляет одно из свойств взлома записи uUid-to-data-lookup jQuery для каждого элемента, который он даже пытается прочитать данных, включая каждого потомка удаляемого элемента! Как глупо. Я могу замкнуть это, поместив эту строку прямо перед ней:
// Don't create ID/lookup if we're only reading non-present data
if (!id && data===undefined)
return undefined;
, который, по-видимому, исправляет утечку для этого случая в IE8. Не могу гарантировать, что это не сломает что-то еще в лабиринте, который является jQuery, но логически это имеет смысл.
Насколько я могу понять, утечка - это просто объект jQuery.cache
(который является хранилищем данных, а не кешем как таковой), который становится все больше и больше по мере добавления нового ключа для каждого удаленного элемента. Несмотря на то, что removeData должен удалить эти записи в кеше, ОК, похоже, IE не восстанавливает пространство при delete
ключе от Object.
(В любом случае, это пример такого поведения jQuery, которое я не ценю. Он делает слишком много под капотом для того, что должно быть тривиально простой операцией ... некоторые из которых довольно сомнительны Все, что происходит с расширением и , что jQuery делает с innerHTML
через регулярное выражение, чтобы предотвратить отображение в качестве атрибута в IE , просто сломано и уродливо. И привычка делать метод получения и установки одинаковой функцией сбивает с толку и здесь приводит к ошибке.)
[Странно, но проверка на утечку в течение длительных периодов времени иногда приводила к совершенно ложным ошибкам в jquery.js до того, как память фактически закончилась ... было что-то вроде «неожиданной команды», и я заметил, что «имя_узла null или нет объекта 'в строке 667, который, насколько я вижу, даже не должен был выполняться, не говоря уже о том, что там проверяется, что nodeName имеет значение null! IE не дает мне много уверенности здесь ...]