La funzione removeChild
elimina veramente completamente il nodo figlio? O rimuove solo l'elemento che è figlio del nodo parente specificato? Se in realtà non elimina l'elemento, c'è un modo per eliminare completamente l'elemento?removeChild elimina davvero l'elemento?
risposta
Il metodo removeChild
semplicemente lo rimuove dal suo genitore. Se è un elemento visibile della pagina, verrà rimosso dalla pagina.
Ma Javascript ha garbage collection. Ciò significa che l'oggetto nodo stesso rimarrà in esistenza fintanto che qualsiasi variabile si riferisca ad esso. Quindi puoi assegnare un nodo a una variabile, usare removeChild
per "sfoltirlo" dal suo nodo genitore, e in seguito, inserirlo o aggiungerlo ad un altro nodo, quindi spostarlo efficacemente sulla pagina.
Il codice seguente rimuove un nodo, e attendere 10 secondi prima di aggiungerlo alla struttura (e quindi, alla pagina):
var oldNode = someNode.removeChild(...);
setTimeout(function() {
document.documentElement.appendChild(oldNode);
}, 10000);
Ciò significa che l'oggetto nodo non e 'stato cancellato dalla memoria, perché c'è ancora una variabile che punta ad esso (vale a dire, oldNode
).
Un altro caso:
var node = document.getElementById('test');
// ... do stuff
node.parentElement.removeChild(node);
// 'node' still exists, but has been removed from the page
// ... do some more stuff
node = document.getElementById('hello');
// The variable 'node' now points to something else;
// this means the original node will be deleted from memory
Se, d'altra parte, è non lo fanno riassegnare il nodo rimosso a un'altra variabile, non è possibile accedere più (non tramite l'albero del documento, in quanto è stato rimosso da lì e non tramite una variabile JS); così Javascript eliminerà automaticamente dalla memoria:
someNode.removeChild(...);
Assegnazione del nodo rimosso a una variabile, e assegnando null
(o qualsiasi altra cosa) per quella variabile - come Marc B suggerisce nella sua risposta - è del tutto inutile e, IMHO, sciocco.
removeChild rimuove l'elemento dal dom, ma viene anche restituito dalla funzione nel caso in cui si stia effettuando la rimozione per reinserirlo altrove. Dovreste uccidere quel valore di ritorno per ottenere davvero liberarsi del nodo rimosso:
oldNode = someNode.removeChild(...);
oldNode = null;
Questo sarà completamente eliminare il nodo:
someNode.removeChild(...);
Questo eliminerà il nodo dal DOM quindi non è visibile ma salverà in modo che è possibile inserire altrove:
oldNode = someNode.removeChild(...);
Il primo esempio è corretto, ma avevo una situazione in cui non sembrava funzionare, ad es.'var aChild = document.createElement (...); someNode.appendChild (aChild); ... someNode.removeChild (aChild); 'Il nodo rimane a causa del riferimento alla variabile aChild. In tal caso è necessario "eliminare una bambina" per completare il lavoro. – CyberFonic
Da un altro contesto (in cui potresti non sapere se ci sono altri riferimenti al nodo rimosso), puoi controllare per vedere in quale stato si trova il nodo rimosso 'node.parentElement == null' –
Questo non tiene conto altri riferimenti al nodo. Significato se il nodo è referenziato altrove, 'removeChild' non cancellerà completamente il nodo. –
Se si desidera eliminare veramente un elemento dom. removeChild da solo non è abbastanza. Questo è come Steve Sounders che è l'autore di YSlow. È necessario utilizzare eliminare
- 1. removeChild(): come rimuovere anche il rientro?
- 2. Elimina QTreeWidgetItem in PyQt?
- 3. HTML Agility pacchetto RemoveChild - non comportarsi come previsto
- 4. Perché removeChild ha bisogno di un nodo genitore?
- 5. elimina riga indietro (Emacs)
- 6. elimina trigger in quarzo
- 7. Come funziona davvero volatile?
- 8. MVVM è davvero utile?
- 9. Stopwatch è davvero rotto?
- 10. KillTimer è davvero necessario?
- 11. "Alert is bad" - davvero?
- 12. SQLite è davvero multipiattaforma?
- 13. Come funziona davvero "biosdevname"?
- 14. Flash10 + p2p funziona davvero?
- 15. WebClient.DownloadFileAsync è davvero lento?
- 16. AngularJS è davvero MVC?
- 17. Questo è davvero DDD?
- 18. È davvero deprecato window.navigator.userAgent?
- 19. Admob, davvero cattivo fillrate
- 20. Quanto pesa davvero QObject?
- 21. virtualenv rilocabile - funziona davvero
- 22. Elimina vs operatore elimina (e puntatore void)
- 23. Elimina Funzione
- 24. controllo Elimina non funziona
- 25. WCF sostituisce davvero .NET Remoting?
- 26. Come funziona davvero lo smartphone?
- 27. Come * davvero * scrivere cardinalità UML?
- 28. È davvero rand() così male?
- 29. AJAX è davvero SEO friendly?
- 30. FastCall è davvero più veloce?
Oh, grazie :) –
Non semplicemente non assegnando il valore restituito a qualcosa ha lo stesso effetto? – awm
Null è conveniente e rende evidente che stai rovinando il valore. facendo 'oldNode = 'cancella questo nodo per favore';' sembra solo uno spreco di caratteri. –