我使用document.createElement
創建了許多新的頁面元素(在某些任意層次結構中),並一直使用element.removeChild()
擦除我不再需要的元素。我想知道這是否會正確清理所有的子元素,或者如果我應該使用某種遞歸函數。 JavaScript使用垃圾回收器,所以我不需要擔心這個,對吧?是removeChild遞歸?
1
A
回答
2
使用element.removeChild(childElement)
將從您的文檔樹中刪除節點。但是,如果您有元素的引用,則元素將被垃圾回收(GC)而不是。
考慮:
實施例1(可怕實踐):
<body><script>
var d = document.createElement("div");
document.body.appendChild(d);
document.body.removeChild(d);
//The global scope won't disappear. Therefore, the variable d will stay,
// which is a reference to DIV --> The DIV element won't be GC-ed
</script></body>
實施例2(不好的做法):
function foo(){
var s = document.createElement("span");
document.body.appendChild(s);
s.innerHTML = "This could be a huge tree.";
document.body.addEventListener("click", function(ev){
alert(eval(prompt("s will still refer to the element:", "s")));
//Use the provided eval to see that s and s.innerHTML still exist
// Because this event listener is added in the same scope as where
// DIV `d` is created.
}, true);
document.body.removeChild(s);
}
foo();
實施例3(好的做法) :
function main(){
//Functions defined below
addDOM();
addEvent();
remove();
//Zero variables have been leaked to this scope.
function addDOM(){
var d = document.createElement("div");
d.id = "doc-rob";
document.body.appendChild(d);
}
function addEvent(){
var e = document.getElementById("doc-rob");
document.body.addEventListener("click", function(ev){
e && alert(e.tagName);
//Displays alert("DIV") if the element exists, else: nothing happens.
});
}
function remove(){
var f = document.getElementById("doc-rob");
f.parentNode.removeChild(f);
alert(f);//f is still defined in this scope
Function("alert('Typeof f = ' + typeof f);")(); //alert("Typeof f = undefined")
}
}
main();
相關問題
- 1. 是NSMutableArray writeToFile遞歸?
- 2. Java - SubSet和遞歸遞歸遞歸圖
- 3. 嵌套遞歸是可能的還是應該避免遞歸?
- 4. asp.net mvc遞歸html遞歸
- 5. Java中的遞歸遞歸
- 6. 我如何遞歸遞歸?
- 7. 遞歸0s和1s遞歸
- 8. 例子只能是遞歸
- 9. Clojure Koans遞歸是 - 甚至?
- 10. CUDA是否支持遞歸?
- 11. Powershell Get-ADGroup是否遞歸?
- 12. javascript removechild
- 13. 遞歸和類實例遞歸的區別是什麼
- 14. CTE代碼只是抓住錨不遞歸遞歸
- 15. 遞歸
- 16. 遞歸
- 17. 遞歸
- 18. 遞歸
- 19. 如何確定一種語言是遞歸還是遞歸枚舉?
- 20. 遞歸檢查數是否是質數
- 21. 這是否被認爲是遞歸?
- 22. 這個實現是否是遞歸的
- 23. 性能:遞歸 - 非遞歸(IE)
- 24. 尾遞歸與前向遞歸
- 25. 遞歸和非遞歸鎖(互斥鎖)
- 26. 遞歸鎖(Mutex)與非遞歸鎖(Mutex)
- 27. 區分簡單遞歸和多遞歸
- 28. Python遞歸函數不遞歸
- 29. 如何從遞歸遞歸函數
- 30. 將遞歸轉換爲'tail遞歸'
不,你不應該,除非你使用蹩腳的瀏覽器:-) IE的任何人? – Bojangles
好的。是否還有其他更合適的功能可以用來從DOM中刪除整個節點? –
同樣,沒有''element.removeChild()'是好的,除非你使用jQuery或其他庫,但它們只包裝原生JavaScript函數。 – Bojangles