En utilisant les méthodes de l'objet node du DOM.
Notamment appendChild, insertBefore, cloneNode etc
edit : je n'avais pas eu le temps de détailler tout à l'heure, c'est chose faite :
Dans ce cas précis, la technique la plus "lisible" va consister à créer l'élément div, cloner l'élément input, remplacer l'input original par le "wrapper" (c'est quoi au juste un wrapper d'ailleurs ? ) et enfin insérer le clone de l'input dans l'élément div.
Comme pour toutes les manipulations de l'objet node, il existe plusieurs manières de faire les même traitements (l'implémentation de l'objet node est à ce sujet très souple et très riche) soit en naviguant dans la structure de l'arbre soit en utilisant des positions de référence parent-enfant valides et utilisables.
Pour le remplacement il te faudras disposer d'une référence valide et utilisable à l'un des parents de l'élément input.
Une représentation de l'arbre du DOM te sera donc indispensable pour travailler avec l'objet node et en la matière le
dom inspector de mozilla sera ton ami
Imaginons donc une structure simple :
<form id="form" ...>
<fieldset id="fieldset">
<legend>mon formulaire</legend>
<input id="input" ... />
</fieldset>
</form>
La référence valide sera donc le fieldset, la cible sera adressée d'une part par l'id 'input' pour le clonage et d'autre part par l'id 'fieldset" pour le remplacement de l'input original.
L'élément div nouvellement créé n'à pas besoin d'avoir un id tant qu'il est un objet en cours d'utilisation par le traitement EcmaScript.
Néanmoins si tu à besoin de lui affecter un id ou une référence de classe CSS tu devras utiliser la méthode setAttribute (attribut, valeur) au moment de sa création.
Ton traitement se résume donc à quelquechose comme :
function createWrapper(){
//On cree
newDiv=document.createElement("div");
//On clone
newInput=document.getElementById('input').cloneNode(true);
//On remplace
document.getElementById("fieldset").replaceChild(newDiv,document.getElementById('input'));
//On insere
newDiv.appendChild(newInput);
//On affecte (si besoin)
newDiv.setAttribute('id','idDiv');
newDiv.setAttribute('class','nomClasse');
}
Cet exemple est très décomposé, il est sans doute possible de faire la même chose de manière plus concise (je n'ai pas cherché) mais pour débuter avec l'objet node et la navigation dans l'arbre du dom tu à intérêt à décomposer et optimiser ensuite faute de quoi tu seras vite comme Thésée dans le labyrinthe.
L'exemple ci-dessus est fonctionnel car on utilise des id, la même opération sans le recours à des id en se fondant uniquement sur l'arbre lui-même demanderais certainement de devoir garantir que l'élément traité lors du remplacement soit bien l'input cible, compte tenu du statut particulier des retours chariots insérés dans le code (pas les br mais les "retour à ligne" du code) que notre ami IE refuse obstinément de considérer alors même qu'ils sont des nodes valides (pourquoi tant de haine bilou ?).
A noter enfin que le paramètre true de la méthode cloneNode permets de cloner l'élément avec sa descendance, il faut utiliser false pour cloner un exemplaire vide.
En revanche les attributs natifs (id, class...) seront systématiquement clonés.
L'objet node est l'élément central du DOM, sa plus petite expression, et ses méthodes sont extrèmement riches et offrent bien souvent des alternatives de traitement et de manipulation des objets d'une rare élégance.
En revanche sa syntaxe est un peut verbeuse et demande un peut d'expérience mais y gouter c'est l'adopter
Pour l'objet node, l'essentiel est ici :
Self HTML - l'objet Node
JP
PS: A propos des "retours à la ligne" inséré dans le code, je ne suis jamais parvenus à comprendre si il s'agissait d'un élément des spécifications de l'API du DOM EcmaScript ou un comportement lié au navigateur.
Le fait est que le dom inspector les valide en tant qu'élément #text et qu'apparemment seul IE refuse de les prendre en compte.
Les éléments impactés par ce "bug" (???) d'IE sont les propriétés du genre nextSibling ou les méthodes du genre childNodes[n] qui donnent des résultats différents IE/Reste du monde fonction de ces fameux "retour à la ligne" du code.
Si Gilles auteur d'un remarquable
cours sur le DOM traine dans le coin, ou un autre afficionado (bobe ?) se serait gentil d'éclairer ma lanterne à ce sujet.
Ca me permettrais de pas mourir idiot et d'avoir enfin une raison vraiment irréfutable de proposer à bilou une gentille propriété dans un node perdus au find fond de l'hyper-espace
Merci d'avance...
Modifié par jpv (26 May 2005 - 04:23)