2009-02-14 20 views
6

Mam tę funkcję, aby utworzyć DIV "w locie". Ale teraz chcę zniszczyć ten obiekt na wydarzenie onclick, ale po prostu nie wiem jak.W jaki sposób obiekt sam się niszczy w zdarzeniu, w javascript?

function creatediv(id) { 

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

} 

Czego mi brakuje?

Dzięki

Odpowiedz

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

Wystarczy ustawienie to zerowy nie będzie go zniszczyć. Musisz usunąć go z drzewa dokumentu, upewniając się, że nie ma na nim żadnych odniesień.

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

Co? Obiekt zdarzenia mógł być węzłem w newdiv. newdiv jest na pewno zapełniany innymi węzłami w prawdziwym kodzie pytającego. W takim przypadku twój kod usuwa niewłaściwy element z drzewa DOM. –

+0

To prawda. Będę edytować odpowiedź. dzięki. –

5

Przyjęta odpowiedź wydaje mi się błędna. Po pierwsze, nie uwzględnia newdiv zawierających childnodes, więc sugerowana procedura usuwania utrzymuje niebezpieczeństwo wycieków pamięci przez zamknięcia (IE). Po drugie, ze względu na pozycję "newdiv = null" funkcja creatediv natychmiast niszczy właśnie stworzony element. Polecam użycie funkcji Douglas Crockfords purge dla obsługi kliknięcia, zastępując ją 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

Masz rację. Zamierzam poprawić mój scenariusz z twoimi sugestiami. – RSilva

+0

Masz rację co do węzłów childNode, ale nie sądzę, że ustawienie wartości newDiv na wartość null spowoduje jej zniszczenie. Po prostu usuwa odwołanie do zmiennej po jej dodaniu do drzewa DOM. –

+0

@Chetan: zgadza się, div allready dodane do drzewa DOM, mój błąd. Czy podzespół nie zostałby zrezygnowany w żaden sposób po zakończeniu funkcji? – KooiInc