Il ne s'agit pas à proprement parler d'un langage, mais de la combinaison de feuilles de styles (CSS), d'objets (DOM) et de scripts (pour la plupart en JavaScript). L'ensemble de ces trois outils permet de définir des pages dynamiques sans avoir recours à des langages tels que le Flash. DHTML est antérieur aux spécifications XHTML mais j'ai choisi de ne le présenter que maintenant afin de pouvoir exposer des exemples de pages dynamiques qui respectent les derniers standards du W3C.
span et div et la propriété innerHTML
span et divCes deux balises sont les alliées incontournables des CSS et du DHTML. Elles permettent de définir des groupes sémantiques à l'intérieur d'un document et de centaliser les définitions de style pour les éléments du groupe ainsi formé. Les zones qu'elles définissent peuvent être manipulées à l'aide du JavaScript, et plus particulièrement avec les fonctions proposées ci-dessous afin d'ajouter de la dynamique aux pages XHTML du côté client (d'où le nom de Dynamic HTML).
Hormis pour la gestion des styles (cf CSS), ces balises ne
sont intéressantes que si elles sont utilisées avec un argument
id qui permet d'identifier chaque instance, et donc de les
manipuler.
Leur utilisation classique est donc :
<div id="nomdiv"> <!-- gros code XHTML --> </div>
<span id="nomdiv"> <!-- petit contenu --> </span>.
Bien que rien n'empêche d'utiliser indifféremment div
et span, il est fortement conseillé (par le W3C) de n'utiliser
span que pour identifier de petites zones, par exemple un bout de texte.
Au contraire, div permet de définir des zones sémantiques
aussi grosses qu'on le désire, une utilisation pratique en est d'ailleurs
l'identification d'une partie div id="content" qui comprend la zone principale
d'une page XHTML, alors que les menus seront dans une zone div id="menu", ...
Nous reviendrons, après avoir vu les CSS, sur les
utilisations des divs pour une mise en forme dynamique des pages XHTML.
Pour l'instant, nous allons nous intéresser à leur propriété
innerHTML qui permet de modifier interactivement le contenu même
d'une page sans avoir à recharger quoi que ce soit.
innerHTMLToutes les balises ont une propriété innerHTML qui
représente leur contenu.
Ainsi, si on considère le code XHTML <p>bla bli blou</p>,
la propriété innerHTML de cette instance de p
vaut bla bli blou.
Quel est l'intérêt ?
Et bien tout simplement de pouvoir modifier interactivement le contenu de la page
comme le montre l'exemple ci-dessous :
voici une zone de texte non modifiable : "non modifiable"
tapez un texte court :
puis cliquez .
Il est donc possible de faire varier le contenu d'une zone selon les interactions avec l'utilisateur et les possibilités dynamiques côté client en deviennent quasi infinies : afficher ou pas la solution d'une énigme, ...
En théorie, pour obtenir en JavaScript une référence
sur un objet d'identifiant id (toutes les balises peuvent avoir un
argument id="nom_instance_balise"), on devrait utiliser
la fonction getElementById(id) définie par le W3C.
De même, pour obtenir une référence à partir d'un
nom (argument name), par exemple pour un champ de formulaire, on devrait
utiliser la fonction getElementByName(name).
Malheureusement, les standards ne sont pas très bien respectés
par les différents navigateurs qui cherchent à imposer leur
vison des choses.
A titre d'exemple, (certaines versions d')Internet Explorer©
utilise(nt) un tableau associatif nommé all contenant tous les objets
de la page ; on accède donc à l'objet recherché par la commande
document.all[id].
A contrario, Netscape©, qui est à la base de
la notion de calque, utilisait la balise layer (devenue div
après standardisation), et à réservé un tableau particulier
à ces calques : document.layers[idcalque].
Ces exemples montrent bien le besoin de standardisation afin que chaque Internaute
ait accès à tous les sites quel que soit son "choix" de navigateur.
En attendant que les recommandations du W3c soient toutes adoptées par les
différents navigateurs (on peut rêver), une fonction telle que la fonction
findObj présentée ci-dessous permet une programmation transparente
sans avoir à se préoccuper des problèmes de compatibilité.
Attention, les
fonctions présentées ci-dessous ne font pas partie du JavaScript et ne
sont pas connues des navigateurs.
Pour les utiliser il faut télécharger le fichier standards.js
et l'inclure en tant que script externe dans
la partie head de vos pages qui en ont besoin (ce fichier de script contient
également des fonctions d'ouverture de fenêtres, de préchargement d'images, ...).
|
Cette fonction permet de retrouver tout objet (instance d'une balise)
identifié par un argument Les paramètres de la fonction sont l'identifiant Sans rentrer dans le détail du code, on peut voir que cette fonction
teste l'existence des différents tableaux possibles puis recherche dans
ces tableaux lorsqu'ils existent ; et seulement en dernier ressort utilise la
fonction standardisée Quelles que soient vos habitudes de codage, je vous incite fortement à
abandonner les notations spécifiques telles que |
|
|
|
Tout cela peut paraître compliqué mais la compatibilité avec l'ensemble des navigateurs actuels est à ce prix. D'aute part, leur utilisation s'avère en fait assez simple comme l'illustre l'exemple suivant.
Ainsi on déplacera par exemple N zones obj1 à
objN toutes les 40ms par la fonction JavaScript suivante :
function BougeMesObjets() { moveLayers('obj1', Math.floor(positionX++), Math.floor(positionY--),..., 'objN', Math.floor(positionX--), Math.floor(positionY++)); setTimeout('BougeMesObjets()', 40); }
Le DOM interprète chaque élément qui constitue une page web. Cet élément est considéré comme un objet. Ce procédé a été mis au point par le W3C, afin d'établir une norme pour assurer une compatibilité parfaite (lors de la lecture d'une page XHTML Dynamique) entre les principaux navigateurs du marché.
Comme nous l'avons vu (plus haut), la pratique ne rejoint malheureusement pas encore tout à fait la théorie. Aussi, le Document Object Model présenté ci-dessous montre des éléments du standard du W3C, mais également des objets spécifiques à telle ou telle version de navigateur. Dans ce cas, le nom du navigateur et de sa version est indiqué à côté.
Les principaux objets sont :
navigatorscreenwindowlocationhistorydocumentheadbodyall (IE4)layers, images, ... (NN4)Le détail des propriétés et des méthodes de ces objets dépasse très largement la cadre de ce cours, mais une liste exhaustive est disponible sur le site de développement de Microsoft®. Notons que comme en C++ c'est le point qui est l'opérateur d'appartenance.
Néammoins, voici les propriétés qui pourront vous intéresser en tout premier lieu :
screen.width, screen.height : résolution de l'écranA partir de ce cours et de celui sur le JavaScript (et de ses exercices corrigés), vous devez être capables de réaliser :