11548 sujets

JavaScript, DOM et API Web HTML5

Salut à tous,

Une petite question, je me demandait si on pouvait récupérer un élément tel qu'il se trouve dans le HTML original, même si on l'a détruit par un removeChild lors d'un appel d'une autre fonction.

Aprés avoir cherché dans toute la doc de gecko, j'ai rien trouver de tel. On est obligé de recréer manuellement tous les noeuds précedemment détruits?
Modifié par coccimaster (04 Aug 2006 - 08:37)
J'ai touvé une pseudo solution, c'est de faire un reload de la page mais toujours pas moyen de récupérer mes éléments morts... Smiley bawling Smiley bawling
salut,

removeChild te renvoie normalement une reférence au noeud qui été détruit.

oldNode = parent.removeChild(enfant);


si tu gardes en mémoire oldNode
parent.cloneNode(oldNode, true)

te recree ton element avec ses petits nenfants, ou sans si tu mets le 2ème argument à false

c'est bien ca?
Oui, mais en fait le souci c'est qu'une fois que tu ressort de la fonction, ton oldNode n'existe plus. Or je supprime dans une fonction et je voudrais revenir à la normal lors d'un autre appel de cette fonction. Donc soit je reload, soit je doit reconstruire l'arbre par des createElement. Mais étant donné que je supprime un gros morceay, ça me fait pas mal de ligne rien que pour tous les appendChild et les setAttribute, donc à l'affichage, on voit les éléments se créer un par un et avec des flottants en css, c'est plutot hideux...
je viens de faire un test en utilisant une variable globale et cela fonctionne
par contre je me suis trompé dans la syntaxe de mon post précédent (la mémoire flanche..)

disons que oldNode est une variable globale

var t = document.getElementById(ton_id);
oldOne = t.parentNode.removeChild(t);


dans une autre fonction tu peux avoir

pclone = oldOne.cloneNode(true);
document.getElementById(id_que_tu_veux).appendChild(pclone);


mais bon, je connais pas ton code et je ne sais pas si tu peux l'appliquer..
J'ai pensé à ce que tu m'as dit et j'ai tenté une autre approche

bozo = document.getElementById('bozo')
backup = bozo.cloneNode(true)
bozo.parentNode.removeChild(bozo);
document.getElementsByTagName('body')[0].setAttribute('backup',backup)
machin =  document.getElementsByTagName('body')[0].getAttribute('backup')

L'astuce, c'était de créer un attribut backup sur mon body, et d'y placer l'objet à récupérer. Mais quand je fais un appendChild, j'ai une exception (message du genre BAD CONVERT) pourtant, l'explorateur DOM me donne bien un attribut backup sur body, avec une valeur [object HTMLParagraphElement]

C'est la méthode qui ne va pas (je pensais pas de toute façon que ça soit génial d'appliquer un objet en attribut) ou il y a atre chose?
Smiley biggol Smiley biggol Smiley biggol
dunjl a écrit :
t'as pas essayé avec une variable globale?

Les variable globale, c'est LE DIABLE!!!!

Non, en fait, je suis plutot phpien, et j'aurais jamais pensé à des variables globales en javaScript.
<Perte de cheveux>Merci, c'est reparti... </Chauve>
Smiley biggol Smiley biggol Smiley biggol
a écrit :
Les variable globale, c'est LE DIABLE!!!!

pour une résurrection, il peut aider Smiley cligne

Sinon, j'ai testé ta solution en effet j'ai la meme erreur sur Mozilla, mais cela marche sur IE ...
pour IE, machin est bien de type object
mais pour moz machin est de type string, donc appendChild n'apprécie pas
Modifié par dunjl (03 Aug 2006 - 17:38)
dunjl a écrit :

Sinon, j'ai testé ta solution en effet j'ai la meme erreur sur Mozilla, mais cela marche sur IE ...


Faut dire que IE aussi, c'es le DIABLE!!!
Blague à part, j'avais pas pu essayer hier (faut bien que la journée se termine), mais là, ça marche sans problème.
Reste juste à pas s'emmeler les pinceau avec les noms de variables pour pas détruire mes objets.

Si quelqu'un connait une autre solution sans variables globales, je reste preneur..

Merci dunjl, et a+
Depuis mes premier cours de C, on m'a toujours dit que ça existe, mais que sauf, le dos au mur, face au peloton d'execution, lorsqu'on est en train de machouiller le filtre de la cigarette du condamnée, on devait les éviter.

En javascript, en l'occurence, quand je nomme un objet du DOM, j'ai tendance à l'appeler par le nom de la balise, donc dans le cas présent, si je rajoute du script dans six mois sur une page ou j'ai déja une globale que j'ai oublié, je vais tester, tout va marcher et je n'aurais pas forcément vu que cette fonction va bouffer ma globale...

Mais aprés c'est vrai que correctement utilisé, il n' y a pas dde souci, c'est juste que je trouve ça un peu plus "dangereux" et aussi une source de recherche de bug assez desagréable...