Accueil

Traduction

Tutoriel JavaScript & jQuery - sommaire

Tutoriel JavaScript & jQuery - recherche

L'auteur : Patrick Darcheville

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

Générer du HTML ou du SVG via JavaScript

Dans cette page je vais vous montrer comment générer des éléments HTML via JavaScript.
Je vais aussi évoquer deux méthodes qui permettent d'appeler de façon régulière ou différé une fonction.
Je vais aussi vous montrer que l'on peut créer des fonctions récursives en JavaScript.

Générer du HTML

HTML est un langage de balisage et non pas un langage de programmation.
HTML ne connait ni les variables, ni les boucles, ni les fonctions ! Heureusement rien n'interdit d'intégrer du code HTML dans un script.
Cependant il est préférable d'utiliser PHP pour générer du HTML car - comme vous savez - JavaScript peut être désactivé par le navigateur.

Méthode WRITE

Le plus simple pour générer du HTML avec JavaScript est d'utiliser la méthode write de l'objet document.

Exemple 1 : générer un tableau HTML

Le script correspondant ;

La fonction est appelée par un bouton de commande.

Le rendu dans un 'iframe':

Oui, je suis d'accord avec vous, il est pas très joli ce tableau.
Mais l'important n'est pas là. Ce que vous devez retenir c'est que du code HTML a été généré via un script.
Notez aussi que le bouton de commande qui appelle la fonction JS "fgenerer" a disparu ...

Exemple 2 : générer 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)

Le script correspondant :

La fonction est appelée par un bouton de commande.

Le rendu dans un 'iframe':

Le bouton de commande disparait sans qu'on lui demande ...
C'est la faute de la méthode write de document qui supprime tout le code HTML existant lorsqu'elle est utilisée sur un document chargé.

Avec les outils de développement du navigateur (Chrome ou Firefox), on peut observer le code HTML généré par le script. Pour observer le code HTML généré il suffit d'afficher l'onglet "éléments" de la console JS.

Limites de la méthode

Attention, l'exécution de la première instruction document.write provoque l'effacement de la page !!!

Donc si vous voulez rajouter des éléments HTML à une page chargée et sans pour autant effacer les anciens éléments HTML il ne faut surtout pas utiliser cette méthode !

Le rendu dans un 'iframe' de ce qu'il ne faut pas faire :

Le code correspondant :

Les quatre images sont chargées et affichées via HTML.
Un clic sur le bouton de commande exécute une instruction document.write qui efface tous les éléments qui étaient affichés et en particulier les quatre images.
Conclusion : il n'est plus possible d'utiliser document.write une fois que la page est chargée !

La solution ci-dessous :

Dès qu'on clique sur le bouton de commande sa légende change ... et les images restent affichées puisqu'on n'utilise plus "document.write".
Le rendu dans un 'iframe' du code correct :

Méthodes createElement et appendChild

Les méthodes createElement() et appendChild() ont déjà été évoquées dans le chapitre "Manipuler le DOM avec JS".

Pour créer de nouveaux éléments HTML dans une page la solution orthodoxe est d'utiliser deux ces deux méthodes.

Dans l'exemple ci-dessous 36 images choisies de façon aléatoire sont insérées et positionnées de façon tout aussi aléatoire dans une boite de fond "aqua".

Ce script porte non seulement sur les méthodes précitées mais aussi sur la récursivité et sur l'emploi de la méthode setTimeout().

Le code CSS & HTML correspondant

Les nouvelles images sont "enfants" de la boite DIV identifiée "eau" ; elles seront positionnées en absolu par rapport à cette boite en fonction de leurs valeurs pour les propriétés top & left.

Le script correspondant

Attention la largeur du conteneur des images est exprimé en %. Donc le "left" de chaque image doit être aussi en pourcentage !

On crée avec le script un nouvel élément HTML (une image) sans pour autant effacer ceux qui existent déjà (ce que ferait l'instruction document.write argumentée avec "img").

Notez la récursivité : la fonction ajout() s'appelle elle-même toutes les 500 milli-secondes.

Surtout respectez la casse pour les méthodes : un E à createElement et un C à appendChild.

Le rendu dans un 'iframe' de cette page :

Actualisez la page pour relancer le script !

SetTimeout() & setInterval()

Dans le script précédent nous avons utilisé la méthode setTimeout() qui exécute une fonction une fois au bout d'un certain intervalle de temps. Aussi nous avons dû créer une fonction récurvise.

On a fait compliqué alors que l'on peut faire plus simple.
Sachez qu'il existe en effet, la méthode setInterval() qui permet d'exécuter une fonction plusieurs fois et à intervalles réguliers. Il faut alors utiliser la méthode clearInterval() pour mettre fin à cet appel régulier.

Reprenons la thématique précédente et proposons un script alternatif.

Le code HTML

J'ai rajouté un bouton de commande.
Sur clic deux instructions JS sont exécutées : fin de l'appel régulier d'une fonction identifié "routine" et suppression du bouton.

Le script

Je vous communique que des extraits puisque les modifications par rapport à la version précédente sont marginales.

Dans la fonction ajout() l'appel récursif de cette fonction a disparu. le compteur i est inutile. Donc les deux dernières instructions ont disparu.
Pour pouvoir utiliser cleaInterval() il faut identifier l'appel régulier d'une fonction par une variable qui est reprise comme argument de clearInterval().

Le rendu de cette nouvelle version :

Le bouton de commmande disparait après qu'on l'ai cliqué.
Actualisez la page pour relancer le processus.

Générer du code au format SVG via JavaScript

Vous savez que SVG est un format d'image vectorielle. Il s'agit d'un langage XML donc d'un langage de balisage comme le HTML.
On ne peut pas générer du SVG dans une page avec JavaScript de base mais il existe des frameworks SVG !
La plus célèbre de ces librairies JavaScript est Snap SVG. Snap SVG est une bibliothèque JavaScript open source d’Adobe.
Cette librairie a été écrite par Dmitry Baranovskiy qui avait écrit auparavant Raphael.
Si vous êtes intéressé par Snap SVG , sachez qu'il y a dans mon site quelques chapitres sur ce framework
: Initiation à Snap SVG