Как объект может самоуничтожиться на событии в JavaScript? - PullRequest
6 голосов
/ 14 февраля 2009

У меня есть эта функция, для создания 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);

} 

Чего мне не хватает?

Спасибо

Ответы [ 3 ]

10 голосов
/ 14 февраля 2009

Просто установив его в ноль, он не будет уничтожен. Вам необходимо удалить его из дерева документов, убедившись, что на него нет ссылок, указывающих на него.

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
}
5 голосов
/ 14 февраля 2009

Принятый ответ кажется мне неправильным. Во-первых, он не учитывает newdiv, содержащий дочерние узлы, поэтому предлагаемая процедура удаления поддерживает опасность утечек памяти через замыкания (IE). Во-вторых, из-за позиции 'newdiv = null' созданная функция немедленно уничтожает только что созданный элемент. Я бы порекомендовал использовать функцию Дугласа Крокфорда 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]);
        }
    }
}
0 голосов
/ 14 февраля 2009
function removeElement(divNum) {
  var d = document.getElementById('myDiv');
  var olddiv = document.getElementById(divNum);
  d.removeChild(olddiv);
}
...