2009-02-14 1 views
6

У меня есть эта функция, чтобы создать DIV на лету. Но теперь я хочу уничтожить этот объект по событию onclick, но я просто не знаю, как это сделать.Как объект может разрушить событие, в javascript?

function creatediv(id) { 

    var newdiv = document.createElement('div'); 
    newdiv.setAttribute('id', id); 
    newdiv.onclick=function(){this=null;}; //bad function 
    document.body.appendChild(newdiv); 

} 

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

Благодаря

ответ

0
function removeElement(divNum) { 
    var d = document.getElementById('myDiv'); 
    var olddiv = document.getElementById(divNum); 
    d.removeChild(olddiv); 
} 
10

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

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 
} 
+0

Wha? Целью мероприятия может быть узел внутри newdiv. Newdiv, безусловно, заполняется другими узлами в реальном коде. В этом случае ваш код удаляет неправильный элемент из дерева DOM. –

+0

это правда. Я отредактирую ответ. Благодарю. –

5

Принятый ответ кажется неправильным для меня. Во-первых, он не учитывает newdiv, содержащий дочерние элементы, поэтому предлагаемая процедура удаления предотвращает утечку памяти через блокировки (IE). Во-вторых, из-за позиции «newdiv = null» созданная функция немедленно уничтожает только что созданный элемент. Я бы рекомендовал использовать 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]); 
     } 
    } 
} 
+0

Вы правы. Я исправлю свой сценарий с вашими предложениями. – RSilva

+0

Вы правы в отношении childNodes, но я не думаю, что установка newDiv на null уничтожает его. Он просто отменяет ссылки на переменную после того, как она уже добавлена ​​в дерево DOM. –

+0

@Chetan: это правильно, div allready добавлен в дерево DOM, моя ошибка. Разве div не будет разыменован в любом случае после завершения функции? – KooiInc

 Смежные вопросы

  • Нет связанных вопросов^_^