Este es el método .remove
en la versión actual de jQuery (1.6.2). Observe que se llama .cleanData
:
// keepData is for internal use only--do not document
remove: function(selector, keepData) {
for (var i = 0, elem; (elem = this[i]) != null; i++) {
if (!selector || jQuery.filter(selector, [ elem ]).length) {
if (!keepData && elem.nodeType === 1) {
jQuery.cleanData(elem.getElementsByTagName("*"));
jQuery.cleanData([ elem ]);
}
if (elem.parentNode) {
elem.parentNode.removeChild(elem);
}
}
}
return this;
},
Y el método .cleanData
que llama, que menciona un número de ticket y supuestamente evita esa horrible fugas (de acuerdo con uno de los comentarios):
cleanData: function(elems) {
var data, id, cache = jQuery.cache, internalKey = jQuery.expando, special = jQuery.event.special,
deleteExpando = jQuery.support.deleteExpando;
for (var i = 0, elem; (elem = elems[i]) != null; i++) {
if (elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) {
continue;
}
id = elem[ jQuery.expando ];
if (id) {
data = cache[ id ] && cache[ id ][ internalKey ];
if (data && data.events) {
for (var type in data.events) {
if (special[ type ]) {
jQuery.event.remove(elem, type);
// This is a shortcut to avoid jQuery.event.remove's overhead
} else {
jQuery.removeEvent(elem, type, data.handle);
}
}
// Null the DOM reference to avoid IE6/7/8 leak (#7054)
if (data.handle) {
data.handle.elem = null;
}
}
if (deleteExpando) {
delete elem[ jQuery.expando ];
} else if (elem.removeAttribute) {
elem.removeAttribute(jQuery.expando);
}
delete cache[ id ];
}
}
}
Y aquí es el boleto mencionado en el comentario. Al parecer, se fijó hace ocho meses:
http://bugs.jquery.com/ticket/7054#comment:10
Según Dave Methvin la solución parece ser la de Asegúrese de que el árbitro elemento DOM en un controlador de eventos se elimina por CleanData para evitar un IE6/7/8 pérdida de memoria.
En otras palabras, establecer referencias a elementos DOM dentro de controladores de eventos a null
de lo contrario algunos navegadores impresionante, sin mencionar nombres tos IE tos perderá memoria.
discardElement
(de su enlace) inserta el elemento en un contenedor, y luego vacía el contenedor, por lo tanto anulando cualquier referencia a ese elemento.
Teniendo esto en cuenta, le sugiero actualizar jQuery. El artículo que señala es de 2009, y dos años equivale aproximadamente a cuatrocientos trillones de horas hombre de tiempo de desarrollo de jQuery.
Por último, aquí es una lectura interesante (y ridículamente largo) en los patrones de fugas en Internet Explorer:
Por desgracia, no puede ir razonablemente a través de toda la base de código en busca de controladores de eventos anular Por eso esta intrincada solución me intriga. Hasta el momento se ha demostrado que es algo así como una bala de plata que no requiere el ajuste manual de los manejadores para anular. – JPRO
@JPRO - no controladores de eventos, elementos DOM dentro de controladores de eventos, y no tienes que hacer eso si estás dispuesto a actualizar jQuery a una versión más reciente. – karim79
Ciertamente, el código incorrecto ha sido uno de los principales contribuyentes al problema, y podría revisarlo todo y corregirlo, pero tomaría mucho más tiempo de lo que he asignado para esta tarea. Actualmente estamos usando jQuery 1.6.2. Dicho esto, creo que has respondido la pregunta de por qué funciona esto (yo mismo llegué a la misma conclusión, pero quería más información). Gracias por la info! – JPRO