Vous pouvez me contacter via Facebook pour questions & suggestions :
Page Facebook relative à mon site
Dans cette page je vous montre comment créer de nouveaux éléments HTML via un script JS donc enrichir le DOM de la page.
Avantage par rapport à la génération de HTML via PHP : pas de requête HTPP qui ralentit l'affichage de la page.
Limite : il faut bien sûr que l'interpréteur JS soit activé par le navigateur.
Je vais aussi présenter une innovation interessante de la dernière version de JS : les 'template strings'.
La solution traditionnelle pour générer du code HTML via un script JS est d'utiliser la méthode write de l'objet document. Mais vous allez vite comprendre que cette solution est obsolète.
Générer un tableau HTML de N lignes contenant des littéraux (valeurs fixes).
Le script correspondant ;
Le code est relativement simple car on ne manipule que de littéraux (valeurs fixes) tels "col 1", "col 2", etc.
Notez que le bouton de commande a disparu ainsi que le titre H3 ...
C'est la faute à la méthode document.write qui supprime tout le code HTML existant avant l'appel de cette méthode.
C'est le visiteur qui précise laquelle des tables il veut afficher (table par 1 ou par 2 ... ou par 9).
Comme dans l'exemple précédent je vais utiliser des instructions basées sur "document.write".
Au départ le seul élément de BODY est le bouton de commande.
Le nouveau contenu de BODY est construit dans la variable "tableau". À chaque passage dans la boucle une ligne de contenu
est rajouté dans la cette variable : tableau += "nouvelle ligne"
Notez bien la dernière instruction du script : document.body.innerHTML = tableau
Pour concaténer balises, littéraux et variables la syntaxe dévient délicate.
Il serait préférable d'utiliser les "littéraux de gabarit" (voir exemple suivant) pour éviter justement
les concaténations.
Problème : le bouton de commande disparait mais c'est logique puisque le script réécrit toute la partie BODY de la page donc écrase l'élément initial.
La version 6 de EMACScript propose les "template literals" OU "template strings" ; traduisez en français "littéraux de gabarits".
Grâce à cet outil on evite les fastidieuses concaténations ; on intègre les variables dans une chaine.
Admettez que la deuxième solution est beaucoup plus simple.
Attention les accents graves ne sont pas très visibles ; ne confondez pas avec apostrophe !
Reprenons le thème "affichage d'une table de multiplication" avec utilisation cette fois des "templates strings".
Dans la partie BODY deux éléments initiaux : le bouton de commande et un DIV identifié "affichage" qui est vide.
Le script écrit le DOM pour la boite DIV donc le bouton de commande n'est plus écrasé.
Le bouton de commande ne disparait plus après l'affichage d'une table.
Demandez successivement l'affichage de la table par 2, 3, 4 etc.
Nous voulons qu'un script rajoute des images dans une boite DIV.
Pour ajouter des éléments au DOM rappelons aussi les techniques : createElement() et appendChild().
Dans l'exemple ci-dessous des images choisies de façon aléatoire sont insérées à raison d'une image par seconde afin de constituer un
patchwork sexy.
Pour chaque image nouvelle il faut donner des valeurs aux attributs SRC, top & left.
Pour arrêter le processus d'insertion il suffit de cliquer sur le bouton de commande.
Les nouvelles images sont "enfants" de la boite DIV identifiée "eau" ; elles seront positionnées en absolu dans cette boite en fonction de leurs valeurs pour les propriétés top & left.
Attention la largeur du conteneur des images est exprimé en %. Donc le "left" de chaque image doit être un pourcentage !
On crée avec le script de nouveaux éléments de type IMG.
var routine = setInterval(ajout,1000) : l'appel régulier de la fonction ajout est identifié "routine".
Donc pour mettre fin à cet appel régulier il suffit d'exécuter la commande <clearInterval(routine) (associée à l'élément
BUTTON).
Pensez à afficher la console pour observer le code HTML généré par le script.
Cliquez ici
Ne confondez pas setInterval(fonction, fréquence) avec etTimeOut(fonction, délai).
Dans le premier cas il s'agit d'un appel régulier d'un fonction alors que dans le deuxième cas il s'agit d'un appel unique différé d'un
certain délai.
SetTimeOut() est la solution traditionnelle pour faire en JS un traitement asynchrone (asynchrone : les instructions ne sont plus exécutées en fonction de leur ordre physique dans le programme).