Penso che tu abbia già la risposta, ma ero interessato a come si mostra che questo è vero, almeno in ultima Chrome.
Questa è la section of the D3 code che rimuove i nodi DOM:
d3_selectionPrototype.remove = function() {
return this.each(function() {
var parent = this.parentNode;
if (parent) parent.removeChild(this);
});
};
Così come si può vedere che è in funzione del browser per fare pulizia di tutti i listener associati.
ho creato un semplice test di stress di aggiunta/rimozione di un sacco di nodi cerchio con D3:
var circles = svg.selectAll("circle")
.data(data, function(d) { return d.id; });
circles.exit().remove();
circles.enter().append("circle")
.attr("id", function(d) { return d.id; })
.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; })
.attr({ r: 5, fill: 'blue' })
.on("mouseenter", function(d) { console.log('mouse enter') });
versione dal vivo qui: http://bl.ocks.org/explunit/6413685
- Aprire il sopra con il più recente Chrome
- Aprire il Strumenti per sviluppatori
- Fare clic sulla scheda Linea temporale
- Fare clic su Re pulsante cavo nella parte inferiore
- lasciarlo funzionare per un paio di minuti, quindi nuovamente il tasto per interrompere la registrazione
- trascinare il selettore nella vista dall'alto timeline per coprire vari di garbage collection modelli sawtooth
Si noterà che i conteggi di garbage collection del nodo DOM corrispondono ai conteggi della raccolta di dati inutili del listener di eventi. In realtà, non si può dire davvero loro a parte nello screenshot qui sotto in quanto le linee si sovrappongono:
Si noti che per Internet Explorer, things are a little more complicated.
Vedere anche this article per ulteriori suggerimenti sul monitoraggio dell'utilizzo della memoria negli strumenti di Chrome.
La rimozione degli elementi dovrebbe anche rimuovere i listener di eventi. –
@LarsKotthoff Vuoi dire che lo sviluppatore dovrebbe rimuovere l'evento quando rimuovi l'elemento (manualmente) o che D3 dovrebbe farlo per noi? – Necriis
Non è possibile associare un evento a nulla. Il gestore eventi verrà rimosso automaticamente durante la rimozione dell'elemento. –