RSi*_*lva 6 javascript dom object self-destruction
我有这个功能,可以即时创建DIV.但现在,我想在onclick事件中销毁这个对象,但我只是不知道如何.
function creatediv(id) {
var newdiv = document.createElement('div');
newdiv.setAttribute('id', id);
newdiv.onclick=function(){this=null;}; //bad function
document.body.appendChild(newdiv);
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
谢谢
Che*_*try 10
将其设置为null不会破坏它.您需要从文档树中删除它,同时确保没有指向它的引用.
function creatediv(id) {
var newdiv = document.createElement('div');
newdiv.setAttribute('id', id);
newdiv.onclick=function(e) {
this.parentNode.removeChild(this);
};
document.body.appendChild(newdiv);
newdiv = null;//required in IE to prevent memory leak
}
Run Code Online (Sandbox Code Playgroud)
接受的答案对我来说似乎不对.首先,它不考虑包含子节点的newdiv,因此建议的删除例程通过闭包(IE)保持内存泄漏的危险.其次,由于'newdiv = null'的位置,creatediv函数会立即销毁刚刚创建的元素.我建议使用Douglas Crockfords 清除函数作为click处理程序,用d替换d.
function purge(d) {
var a = d.attributes, i, l, n;
if (a) {
l = a.length;
for (i = 0; i < l; i += 1) {
n = a[i].name;
if (typeof d[n] === 'function') {
d[n] = null;
}
}
}
a = d.childNodes;
if (a) {
l = a.length;
for (i = 0; i < l; i += 1) {
purge(d.childNodes[i]);
}
}
}
Run Code Online (Sandbox Code Playgroud)
function removeElement(divNum) {
var d = document.getElementById('myDiv');
var olddiv = document.getElementById(divNum);
d.removeChild(olddiv);
}
Run Code Online (Sandbox Code Playgroud)