6

我有这个功能,可以即时创建一个 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);

} 

我错过了什么?

谢谢

4

3 回答 3

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
}
于 2009-02-14T00:18:31.960 回答
5

接受的答案对我来说似乎是错误的。首先,它不考虑 newdiv 包含子节点,因此建议的删除例程通过闭包 (IE) 保持内存泄漏的危险。其次,由于 'newdiv = null' 的位置,creatediv 函数会立即销毁刚刚创建的元素。我建议使用 Douglas Crockfords purge函数作为点击处理程序,用这个替换 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]);
        }
    }
}
于 2009-02-14T09:17:16.393 回答
0
function removeElement(divNum) {
  var d = document.getElementById('myDiv');
  var olddiv = document.getElementById(divNum);
  d.removeChild(olddiv);
}
于 2009-02-14T00:12:53.393 回答