11548 sujets

JavaScript, DOM et API Web HTML5

Salut,

Je voudrais savoir comment supprimer de la mémoire :

1) un élément créé comme ceci :
element = document.createElement('object');

mais qui n'a pas été inséré dans le document à l'aide de :
	parent.appendChild(element);
// ou
	parent.insertBefore(element,autre);
// ou
	parent.replaceChild(element,ancien);


2) un élément retiré du document :
old = element.removeChild(node)


Par exemple dans la fonction ci-dessous...
function createSWF(url,width,height){
	var swfObj,Param;
	try{
		swfObj=document.createElement('object');
		swfObj.setAttribute('type','application/x-shockwave-flash');
		swfObj.setAttribute('data',url);
		swfObj.setAttribute('width',width);
		swfObj.setAttribute('height',height);

		Param=document.createElement('param');
		Param.setAttribute('name','movie');
		Param.setAttribute('value',url);
		swfObj.appendChild(Param);		

		/*	Param=document.createElement('param');
		 *	...
		 *	swfObj.appendChild(Param);		
		 */
		
		return swfObj;

	}catch(e){
		try{
			if(swfObj){
				while(swfObj.hasChildNodes())swfObj.removeChild(swfObj.lastChild);
			}
		}catch(e){}
	}
	return false;
}

Si une erreur survient pendant la création de la balise object, ses éventuels noeuds enfants sont retirés de l'arbre DOM.
while(swfObj.hasChildNodes())swfObj.removeChild(swfObj.lastChild);

Mais ils demeurent en mémoire.

J'ai essayé ceci...
var old;
while(swfObj.hasChildNodes()){
	old=swfObj.removeChild(swfObj.lastChild);
	old=null;
}
swfObj=null;

Mais je ne connais pas le moyen de vérifier si la place occupée par chaque élément est effectivement libérée.
Modifié par Eric2A (15 Aug 2010 - 19:51)
Salut,

Les moteurs d'exécution de JavaScript gèrent automatiquement la mémoire (ramasse-miettes).

Une fois que l'objet représentant un élément a été retiré de son arbre DOM et que toutes les références vers cet objet ont disparu (nul besoin d'écrire old=null), la mémoire est libérée.
Merci Julien,

Je laisserais donc JavaScript gerer automatiquement la mémoire.

Au passage, je voudrais savoir si le code
old=swfObj.removeChild(swfObj.lastChild);
old=null;

Ne créé t-il pas finalement une réference circulaire et donc une fuite de mémoire ?

Edit :
Non, en fait il n'y a pas de risque en l'occurence car il n'y a aucun évenement attaché à mes éléments.
Modifié par Eric2A (15 Aug 2010 - 19:50)