- · Niveau : INTERMÉDIAIRE
- · Compatibilité : IE 4+, NS 4+ et Netscape 6
- · Voir l’exemple
Modifier les propriétés d’un objet ou « layer » sur une page HTML est pratique mais imaginez le dynamisme d’une page qui permet aux visiteurs de modifiant le contenu de l’objet. Déclarer un objet avec la balise « DIV » et modifier son contenu avec n’importe quel code HTML, des images, des tables, du texte ou même d’autres objets.
Le principe est très simple si vous utilisez un positionnement " absolute ". Il peut devenir plus complexe avec un positionnement " relative " à cause de Netscape 4.x. Plus de 500 erreurs ont été répertoriés avec Netscape 4.x ! Pour plus d’information, lisez le tutoriel "Bugs et compatibilité du DHTML", et pour utiliser le positionnement "relative" voir le tutoriel "Régler le problème de position relative avec Netscape 4.x"
Dans cet exemple, j’initialise les propriétés de départ dans une feuille de style (CSS) externe. En anglais " ex-doc " contrairement à " in-line ". Initialisé avec un positionnement " absolute ", c’est à dire par rapport au coin supérieur gauche de la Window.
Exemple
<head> <style> .monObjet { position: absolute; top: 50; left: 50 } </style> </head>
Dans le body j’ajoute mon objet
<div class="monObjet" id="monObjet">Le DIV</div>
Pour modifier le contenu se fait exactement comme si vous désiriez modifier une propriété. Vous pouvez passer du code HTML directement ou initialiser une variable qui contient le code.
Avec Internet Explorer 4+
monObjet.innerHTML = Contenu;
Avec Netscpae 4.x
document.monObjet.document.write(Contenu); document.eval(nObjet).document.close(); (pour règler un bug)
Et Netscape 6
document.getElementById(%27monObjet%27).innerHTML = Contenu;
Quand à la position x/y de l’objet
Avec Internet Explorer 4+
monObjet.style.pixelLeft= position x; monObjet.style.pixelTop= position y;
Avec Netscpae 4.x
document.monObjet.left = position x; document.monObjet.top = position y;
Et Netscape 6
document.getElementById(%27monObjet%27).style.left= position x; document.getElementById(%27monObjet%27).style.top = position y;
Le but de cet exercice est de délacer les objets tout en modifiant leur contenu. Une fonction statique fera l’affaire mais pourquoi ne pas coder une fonction dynamique qui pourrait, à l’aide de paramètre, exécuter le tout pour n’importe quel objet. Une fonction portable à ajouter sur tous vos sites. L’exemple suivant est complet, portable et dynamique. Associé à l’initialisation des variables pour la détection du DOM, il fonctionne sans aucune modification.
Initialisation
var ns4=document.layers var ie4=document.all var ns6=document.getElementById&&!document.all
Fonction " Change_objet "
function Change_objet(nObjet,nContenu,nLeft,nTop) { // nObjet = le nom de l’objet // nContenu = Le contenu affiché dans l’objet // nLeft = La position x (de: haut gauche) // nTop = La position y (de: haut gauche) if (ns4) { document.eval(nObjet).document.write(nContenu); document.eval(nObjet).top =nTop; document.eval(nObjet).left =nLeft; document.eval(nObjet).document.close(); } else if (ns6) { document.getElementById(nObjet).innerHTML = nContenu; document.getElementById(nObjet).style.left=nLeft; document.getElementById(nObjet).style.top =nTop; } else if (ie4) { eval(nObjet).innerHTML = nContenu; eval(nObjet).style.pixelLeft=nLeft; eval(nObjet).style.pixelTop=nTop; } }
Exemple d’utilisation avec lien URL et initialisation de variable pour le contenu. Les deux variables " txt1 " et " txt2 " démontrent que l’objet peut non seulement contenir du texte mais aussi une table par exemple.
Initialisation du contenu dynamique
var txt1 = %27<table><tr><td> Autre code…</td></tr></table>%27; var txt2 = %27<table><tr><td> Autre code…</td></tr></table>%27;
Dans le body j’ajoute mon objet
<div class="monObjet" id="monObjet">Le DIV</div>
Liens d’appel de la fonction " Change_objet "
<a href="#" onMouseOver="Change_objet(%27monObjet%27,txt1,1,1)" onMouseOut="Change_objet(%27monObjet%27,%27Le DIV%27,1,1)"> Lien 1 </a> <br> <a href="#" onMouseOver="Change_objet(%27monObjet%27,txt2,75,20)" onMouseOut="Change_objet(%27monObjet%27,%27Le DIV%27,1,1)"> Lien 2 </a>
Code complet Vous n’avez qu’à modifier le contenu des variables "txt1" et "txt2" ou même d’ajouter des variables. Et d’ajuster les paramètres des liens URL (Change_objet(%27monObjet%27,%27txt1%27,1,1)). Vous pouvez aussi ajouter un objet, ex: Change_objet(%27monObjet2%27,%27txt1%27,1,1) sans oublier de déclarer ce deuxième objet (DIV). ATTENTION, copier coller ce code peut causer des problèmes à cause de la justification, utiliser le code de l’exemple (bouton en haut).
<html> <head> <title>Modifier le contenu</title> <style> .monObjet { position: absolute; top: 1; left: 1 } </style> <script type="text/javascript" language="javascript"> <!-- var ns4=document.layers var ie4=document.all var ns6=document.getElementById&&!document.all var txt1 = %27contenu ou code html 1%27; var txt2 = %27contenu ou code html 2%27 function Change_objet(nObjet,nContenu,nLeft,nTop) { // nObjet = le nom de l’objet // nContenu = Le contenu affiché dans l’objet // nLeft = La position x (de: haut gauche) // nTop = La position y (de: haut gauche) if (ns4) { document.eval(nObjet).document.write(nContenu); document.eval(nObjet).top =nTop; document.eval(nObjet).left =nLeft; document.eval(nObjet).document.close(); } else if (ns6) { document.getElementById(nObjet).innerHTML = nContenu; document.getElementById(nObjet).style.left=nLeft; document.getElementById(nObjet).style.top =nTop; } else if (ie4) { eval(nObjet).innerHTML = nContenu; eval(nObjet).style.pixelLeft=nLeft; eval(nObjet).style.pixelTop=nTop; } } // --> </script> </head> <body> <div class="monObjet" id="monObjet">Le DIV</div> <br><br><br> <a href="#" onMouseOver="Change_objet(%27monObjet%27,txt1,1,1)" onMouseOut="Change_objet(%27monObjet%27,%27Le DIV%27,1,1)"> Lien</a><br> <a href="#" onMouseOver="Change_objet(%27monObjet%27,txt2,75,20)" onMouseOut="Change_objet(%27monObjet%27,%27Le DIV%27,1,1)"> Lien</a> </body> </html>