Вот ответ из другой ветки:
Я думал, что Дэвид может быть на что-то с предполагаемой утечкой removeChild, но я не могу воспроизвести это в IE8 ... это может случиться в более ранних браузерах, ноэто не то, что мы имеем здесь.Если я удаляю вручную div'ы, утечки нет;если я изменю jQuery, чтобы использовать externalHTML = '' (или move-to-bin, а затем bin.innerHTML) вместо removeChild, все равно будет утечка.
В процессе устранения я начал взламывать биты удаленияв jQuery.строка 1244 в 1.3.2:
//jQuery.event.remove(this);
jQuery.removeData(this);
Закомментирование этой строки не привело к утечке.
Итак, давайте посмотрим на event.remove, он вызывает данные («события»), чтобы увидетьесли есть какие-либо события, связанные с элементом.Что делают данные?
// 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 Iне ценю. Он делает слишком много под капотом для того, что должно быть тривиально простой операцией ... некоторые из которых довольно сомнительны. Все это с расширением и тем, что jQuery делает с innerHTML через регулярное выражение, чтобы предотвратить это.показ в качестве атрибута в IE просто испорчен и уродлив. А привычка делать геттер и сеттер одной и той же функцией сбивает с толку и, в данном случае, приводит к ошибке.)
[Странно, оставляя утечку для расширенногопериоды времени заканчивались тем, что время от времени приводили к совершенно ложным ошибкам в jquery.js до того, как память фактически закончилась ... было что-то вроде «неожиданной команды», и я заметил, что «имя_узла ноль или нет объекта» в строке 667,насколько я вижу, не следовало даже бежать, не говоря уже о том, что есть чеck там для nodeName, являющегося нулевым!IE не дает мне много уверенности здесь ...]