[javascript] Si se elimina un elemento DOM, ¿sus oyentes también se eliminan de la memoria?



Answers

con respecto a jQuery:

el método .remove () elimina elementos del DOM. Utilice .remove () cuando desee eliminar el elemento en sí, así como todo lo que contiene. Además de los elementos en sí, todos los eventos enlazados y los datos de jQuery asociados con los elementos se eliminan. Para eliminar los elementos sin eliminar datos y eventos, use .detach () en su lugar.

Referencia: http://api.jquery.com/remove/

jQuery v1.8.2 .remove() código fuente:

remove: function( selector, keepData ) {
    var elem,
        i = 0;

    for ( ; (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;
}

aparentemente jQuery usa node.removeChild()

De acuerdo con esto: https://developer.mozilla.org/en-US/docs/DOM/Node.removeChild ,

The removed child node still exists in memory, but is no longer part of the DOM. You may reuse the removed node later in your code, via the oldChild object reference.

es decir, los detectores de eventos podrían eliminarse, pero el node aún existe en la memoria.

Question

Si se elimina un elemento DOM, ¿sus oyentes también se eliminan de la memoria?




Simplemente extendiendo otras respuestas ...

Los controladores de eventos delegados no se eliminarán al eliminar el elemento.

$('body').on('click', '#someEl', function (event){
  console.log(event);
});

$('#someEL').remove(); // removing the element from DOM

Revisa ahora:

$._data(document.body, 'events');



Sí, el recolector de basura también los eliminará. Sin embargo, puede que no siempre sea el caso con los navegadores heredados.






Related