Accueil

Traduction

Tutoriel sur JS natif, Vue.js, jQuery.js & Node.js

Tutoriel JavaScript - recherche

L'auteur : Patrick Darcheville

Vous pouvez me contacter via Facebook pour questions & suggestions : Page Facebook relative à mon site

Générer du HTML via JavaScript

Dans cette page je vous montrerai comment créer de nouveaux éléments HTML via un script JS donc enrichir le DOM de la page.
Gros avantage par rapport à la génération de HTML via PHP : pas de requête HTPP qui ralentit l'affichage.

Je vais aussi présenter une innovation interessante de la dernière version de JS : les 'template strings'.

Générer du HTML avec "document.write"

La solution traditionnelle pour générer du code HTML via un script est d'utiliser la méthode write de l'objet document. Mais vous allez vite comprendre que cette solution est obsolète.

Exemple

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.

Le rendu

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 lorsqu'elle est utilisée une première fois.

Afficher une table de multiplication


C'est le visiteur qui précise laquelle des tables il veut afficher (table par 1 ou par 2 ... ou par 9).

Solution traditionnelle

Comme dans l'exemple précédent je vais utiliser des instructions basées sur "document.write".

Le code

La partie BODY ne comprend initialement qu'un seul élément : le bouton de commande.

Script : cette fois il faut manipuler des littéraux ("fois", "donne") mais aussi des variables (i, entier, produit).
Comme il faut concaténer des balises avec des littéraux et des variables, le script devient délicat à écrire.

Le rendu

Le titre général de la page ainsi que le bouton de commande disparaissent car écrasés par le premier "document.write()".

Deuxième solution

Principe : bâtir dans une variable un chaine tout le code HTML à générer.
Puis la partie BODY de la page récupère ce contenu en guise de DOM via la propriété innerHTML. Donc on n'utilise plus de document.write() .

Le code

Au départ le seul élément de BODY est le bouton de commande.
Le nouveau DOM est construit dans la variable tableau.
Pour concaténer balises, littéraux et variables la syntaxe dévient délicate ...
Notez bien la dernière instruction du script : document.body.innerHTML = tableau qui réécrit le DOM.

Le rendu

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.

Troisième solution : utiliser les 'template strings'

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 evité les fastidieuses concaténations ; on intègre les variables dans la chaine.

Admettez que c'est beaucoup plus simple.

Attention les accents graves ne sont pas très visibles. Ne confondez pas avec apostrophe !

Le code avec littéraux de gabarit

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 rendu

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.

Remarque concernant les littéraux de gabarit

Avec la syntaxe ${...} vous pouvez intégrer dans le code HTML non seulement des variables mais aussi des expressions complexes, appeler des fonctions.
Utilisez la console JS pour tester les commmandes suivantes :

Let prix = 10
const TVA =.2
`Total: ${(prix * (1 + TVA)).toFixed(2)}`
'Total: 12.00'

Calcul de montant TTC à partir du prix HT et du taux de TVA.
Notez qu'à l'intérieur de ${} j'ai indiqué une expression complexe. J'aurai pu aussi appeler une fonction.

Génération d'images dans une page

Nous voulons qu'un script rajoute des images dans une boite DIV.

Les méthodes createElement() et appendChild()

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.

Le code CSS & HTML correspondant

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.

Le script

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).

Le rendu dans un nouvel onglet

Pensez à afficher la console pour observer le code HTML généré par le script.
Cliquez ici

Rappel sur SetTimeout() & setInterval()

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).