2009-02-14 6 views
6

J'ai cette fonction, pour créer un DIV sur la volée. Mais maintenant, je veux détruire cet objet sur onclick événement, mais je ne sais pas comment.Comment un objet peut-il être auto-destructeur sur un événement, en javascript?

function creatediv(id) { 

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

} 

Que manque-t-il?

Merci

Répondre

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

réglage Il suffit nul ne le détruire. Vous devez le supprimer de l'arborescence du document tout en vous assurant qu'il n'y a aucune référence pointant dessus.

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? La cible de l'événement peut avoir été un noeud à l'intérieur de newdiv. newdiv est sûrement peuplé avec d'autres nœuds dans le code réel du demandeur. Dans ce cas, votre code supprime le mauvais élément de l'arborescence DOM. –

+0

c'est vrai. Je vais modifier la réponse. Merci. –

5

La réponse acceptée me semble mal à. Tout d'abord, il ne considère pas newdiv contenant childnodes, donc la routine de suppression suggéré maintient un danger pour les fuites de mémoire via des fermetures (IE). Deuxièmement, en raison de la position de 'newdiv = null', la fonction creatediv détruit immédiatement l'élément nouvellement créé. Je recommande d'utiliser la fonction Douglas Crockfords purge pour le gestionnaire de clic, en remplaçant d avec cela.

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

Vous avez raison. Je vais corriger mon script avec vos suggestions. – RSilva

+0

Vous avez raison sur les childNodes mais je ne pense pas que la mise en nouveauDiv null détruit. Il ne fait que dé-référencer la variable après qu'elle a déjà été ajoutée à l'arborescence DOM. –

+0

@Chetan: c'est vrai, div allready ajouté à l'arbre DOM, mon erreur. Le div ne serait-il pas déréférencé de toute façon à l'achèvement de la fonction? – KooiInc

Questions connexes