Vous pouvez me contacter via Facebook pour questions & suggestions : Page Facebook relative à mon site
Ce chapitre est relativement long mais c'est logique car la modification du DOM est l'une des principales missions assignée à JavaScript. En effet des effets basiques (déplacements, agrandissements, masquage/démasquage, etc.) sont désormais confiées à CSS grâce à toutes les nouveautés de se version 3.
Grâce à un script vous pouvez modifier l'aspect initial d'une page sans rechargement de celle-ci (donc sans requête HTTP).
On dit que l'on "dynamise" la page. On parlait avant de DHTML (dynamic HTML) mais le terme n'est plus à la mode.
On dit désormais que l'on modifie le DOM de la page.
Le DOM est une interface de programmation qui nous permet de manipuler le code HTML & CSS d’une page web de façon dynamique
en utilisant le langage JavaScript.
Le DOM est créé automatiquement lors du chargement d’une page web par le navigateur.
Désormais tous les navigateurs génèrent le même DOM, ce qui n'était pas le cas à l'origine (d'où l'invention du framework jQuery ...)
Donc le code pour manipuler dynamiquement le HTML & CSS est désormais
indépendant du navigateur : bel effort de normalisation effectué par le W3C.
On peut donc manipuler désormais le DOM en JS pur (sans recourir à jQuery). C'est ce que nous faisons dans ce chapitre.
Tout dans une page web doit être considéré comme un noeud ("node" en anglais).
Le document HTML est un noeud, chaque élément HTML est un noeud, les attributs des balises sont des noeuds, le texte de chaque balise est aussi un noeud.
Sachez aussi qu’il existe plusieurs types de nœuds : le type ELEMENT (pour les balises HTML), le type de nœud TEXTE, etc.
Le DOM de cette page va être construit comme une hiérarchie de nœuds. On peut le représenter sous forme d'un arbre.
Sachez que la page HTML est le noeud le plus haut hiérarchiquement et appelé : DOCUMENT.
Toutes les balises doubles ou simples de la page constituent des noeuds de type ELEMENT (ou plus simplement élements).
Ainsi la balise double HTML est un noeud de type ELEMENT.
Le noeud HTML comprend deux "enfants" : HEAD et BODY. Pour ces deux "enfants" HTML est l'élément "parent".
L'élément HEAD contient à son tour deux enfants : TITLE et META. On peut dire aussi que TITLE et META ont pour "parent" HEAD.
L'élément BODY contient quatre enfants : H1 et trois balises P.
La structure DOM d'une page apparait dans l'onglet "éléments" de la console du navigateur.
L'interface DOM va nous permettre de manipuler les éléments du document pour le rendre dynamique.
Dans la suite de ce chapitre nous allons voir comment cibler un élément pour ensuite récupérer voire modifier ses paramètres :
contenu, attributs, propriétés de style.
Avant de manipuler en JavaScript un élément HTML (une balise donc) il faut pouvoir le cibler.
Il existe plusieurs méthodes pour accéder à un élément HTML mais toutes ont un point commun : elles retournent un objet !
Donc la syntaxe générique est : variable = méthode de ciblage d'un élément HTML
Après cette instruction la variable créée n'est pas une variable simple (qui stocke une primitive) mais une variable objet qui référence dans le
script un élément HTML du document.
Il faut utiliser le DOM et en particulier les méthodes de l'objet document. Il faut distinguer les anciennes méthodes et les nouvelles introduites par HTML 5.
Ces deux nouvelles méthodes ont pour argument un sélecteur CSS.
Attention la première méthode retourne le premier élément répondant au sélecteur CSS passé en paramètre.
La deuxième méthode retourne tous les éléments répondant au sélecteur CSS.
Donc dans le cadre de la deuxième méthode il faut parfois rajouter un indice ...
Et si vous voulez cibler la troisième balise P de la page et que cet élément n'a ni l'attribut ID ni l'attribut class comment faire ? Il suffit d'écrire : document.querySelectorAll('p')[2] . En effet le premier élément P à l'indice 0 donc le troisième a l'indice 2 !
Dans une page il y a trois images miniatures et presque transparentes. Si clic sur l'une d'elle, celle-ci s'agrandit et devient opaque.
Voyons comment cibler ces images dans un script avec deux solutions.
Utilisation de la méthode getElementById ce qui suppose que chaque élément HTML manipulable soit affecté de l'attribut ID.
Code CSS & HTML :
Grâce au CSS les images chargées sont par défaut masquées : img{display : none ; }
Donc pour les démasquer il faut que pour chaque image la valeur de la propriété display passe à inline !
Il s'agit donc d'un changement de valeur d'une propriété de style pour une collection d'objets.
Il faut donc associer à chaque bouton de commande une fonction qui consiste en une boucle qui traite toute la collection d'images de la page.
Je ne vous communique qu'une fonction anonyme sur les deux ; à vous de trouver le code de la seconde.
Vous devez entre autre sélectionner le deuxième bouton de commande (indice de rang 1 dans la collection des boutons).
La structure FOR (... IN ...) est très utile pour traiter toute une collection d'objets.
Comme je l'ai déjà fait remarquer, l'usage direct aux propriétés de style n'est pas la solution la plus simple pour mettre en forme les éléments.
Il est préférable de jouer sur les classes : ajout, suppression, substitution,etc.
Notez que la classe "image" est déjà attribuée aux images. C'est elle qui redimensionne et positionne les images.
Nous voulons que le script rajoute la classe "cadre" (bordure + ombrage + coins arrondis) aux
différentes images.
La nouvelle version de JavaScript a ajouté l'objet classList qui comprend plusieurs méthodes pour manipuler les classes.
Le script est donc le suivant :
Le rendu :
Sachez que l'on peut encore aller plus loin dans la modification du DOM via JS. On peut en effet ajouter de nouveaux éléments voire supprimer des
éléments existants.
Il faut d'abord créer un élément avec la méthode createElement() puis insérer le nouvel élément dans la page avec la méthode appendChild().
Plutôt que de créer un nouvel élément, il est possible de cloner un élément existant : clonerNode().
Théme : insertion dans une page d'un lien vers une feuille de style externe puis d'une image et enfin suppression des boutons d'insertion.
La page est très moche car il n'y a aucune mise en forme.
Si clic sur le premier bouton il y a alors insertion d'une balise LINK dans la partie HEAD. Cet élément charge une feuille de style.
Si clic sur deuxième bouton il y a alors insertion dans la boite SECTION d'une belle image.
Dans les deux cas il faut d'abord créer un nouvel élément avec la méthode createElement(type de balise)
puis il faut donner des attributs à cet élément et enfin il faut insérer l'élément avec la méthode parent.appendChild(enfant)
Après avoir été cliqué chaque bouton est supprimé via la méthode parent.removeChild(enfant)
Le rendu du code :
Plutôt que de créer un nouvel élément de toute pièce on peut cloner un élément existant.
Testez ce code !
Actualisez la page pour réafficher les images effacées !
Dans ce deuxième exemple un bouton de commande permet par simple clic de supprimer toutes les images !
Rendu du code !
Actualisez la page pour réafficher toutes les images !