pictogram Auteur : Patrick Biker
Date : 17 mars 2015
Version : 1.0
Révision : aucune

Table des matières

Installer la mise à jour sur les galeries existantes

La fonction "diaporama" a été rajoutée dans les galeries sans toucher au code HTML. Ainsi les galeries déjà publiées bénéficieront-elles aussi de la nouvelle fonctionnalité.

WDGalerie, vous le savez, se met à jour tout seul. Avec la mise à jour, toute nouvelle galerie bénéficiera du "diaporama". Mais qu'en est-il pour les galeries existantes ?

Deux cas se présentent :

Le fichier ZIP de mise à jour

La mise à jour des galeries déjà publiées se réalise en copiant sur le site les fichiers de script (javascript) et les nouvelles feuilles de style. Tous ces fichiers ont été regroupés dans un zip à télécharger.

Le fichier ZIP de mise à jour pour les galeries existantes.

Décompressez ce fichier sur votre disque dur, puis transférez les fichiers par FTP sur votre site. J'utilise personnellement Total Commander pour réaliser ce transfert, mais il existe beaucoup d'autres logiciels gratuits pour faire du transfert FTP.

Le site de Total Commander, formidable outil de gestion de fichiers et de transfert par FTP

Le Making-Of : Javascript et APIs DOM

Ajouter le diaporama aux galeries existantes a été une vraie gageure. En effet, cela voulait dire qu'on ne touchait pas au code HTML des galeries déjà créées. Il a fallu sortir les grands moyens : Javascript, CSS, DOM ...

Javascript

Chaque page de la galerie utilisait un petit script en javascript : photo.js. Ce script a été modifié. Il contient maintenant en plus :

CSS

Toutes les feuilles de style ont été modifiées pour prendre en compte le nouveau DIV créé pour gérer les liens du diaporama (id="diaporama").

DOM

Les APIS DOM permettent de modifier la structure de la page HTML. Ici on a utilisé ces APIs pour ajouter une nouvelle division (div) contenant un paragraphe de texte et plusieurs liens.

Le code HTML généré est le suivant :

<div id='diaporama'>
<p>Diaporama
<a href='javascript:slide(1);'>1</a>
<a href='javascript:slide(2);'>2</a>
<a href='javascript:slide(3);'>3</a>
sec
<a href='javascript:slide(0);'>stop</a></p>
</div>

On y dénombre 4 liens appelant la même routine javascript "slide()" en lui passant un paramètre différent qui correspond à la durée de la pause entre chaque photo.

 Les liens générés dynamiquement sur la galerie

Le résultat final sur la page ressemble à ceci :

Le code DOM en détail

Pour les APIs DOM, la page HTML est organisée comme un arbre avec des ramifications. Au départ de l'arbre, il y a l'élément <html>. Dans cet élement, une branche correspond à l'élément <body>. L'élément <body> contient plusieurs éléments <div>. Chaque bifurcation s'appelle un noeud (en anglais node).

Voici en détails, comme le <div id="diaporama"> est ajouté dans la galerie.

Le navigateur doit supporter les fonctions getElementById et createElement. Dans le cas contraire, on ne fait rien. Ainsi dans les vieux navigateurs, ou bien si le javascript est bloqué, il ne se passe rien. L'utilisateur ne sera donc pas perturbé par des liens inactifs dans la page.

function createDIV() {
    if (document.getElementById && document.createElement) 
    {

On recherche tous les tag <body>. On récupère une collection (équivalent d'un tableau en WLangage, par exemple).

myDocumentElements=document.getElementsByTagName("body");

En javascript, les indices démarrent à zéro. Le premier désigne le body.

myBody=myDocumentElements.item(0);

On recherche le <div> dont l'Id est "footer". C'est le bas de page. On veut placer le nouveau <div> juste avant.

footerDIV = document.getElementById("footer");

On démarre la construction par la création de noeuds avec CreateElement. Le premier élément est le nouveau <div>.

diaporamaDIV = document.createElement("div");

L'Id du <div> est un attribut.

diaporamaDIV.setAttribute("id", "diaporama");

Création du nouveau paragraphe.

myP = document.createElement("p");

Pour le texte, il faut utiliser createTextNode.

myText = document.createTextNode("Diaporama ");

Les noeuds sont attachés les uns aux autres avec appendChild. Ajout du texte dans le paragraphe.

myP.appendChild(myText);

Création du lien a = 1.

myLink = document.createElement("a");
// Le href est un attribut
myLink.setAttribute("href","javascript:slide(1);");
// Le texte du lien est créé par createTextNode
myText = document.createTextNode("1 ");
// On assemble le texte sur le lien
myLink.appendChild(myText);
// On assemble le texte sur le paragraphe
myP.appendChild(myLink);

"\u00a0" est une valeur unicode spéciale représentant un caractère insécable. Indispensable ici car sinon tous les liens seraient collés les uns aux autres.

// création de nodes d'espacement
myP.appendChild(document.createTextNode("\u00a0\u00a0"));

Création du lien a = 2, on procéde exactement de la même manière.

myLink = document.createElement("a");
myLink.setAttribute("href","javascript:slide(2);");
myText = document.createTextNode("2 ");
myLink.appendChild(myText);
myP.appendChild(myLink);
myP.appendChild(document.createTextNode("\u00a0\u00a0"));

Création du lien a = 3.

myLink = document.createElement("a");
myLink.setAttribute("href","javascript:slide(3);");
myText = document.createTextNode("3 ");
myLink.appendChild(myText);
myP.appendChild(myLink);
myP.appendChild(document.createTextNode("\u00a0\u00a0"));

Création du texte "sec" pour secondes.

myText = document.createTextNode("sec ");
myP.appendChild(myText);
myP.appendChild(document.createTextNode("\u00a0\u00a0"));

Création du lien a = stop.

myLink = document.createElement("a");
myLink.setAttribute("href","javascript:slide(0);");
myText = document.createTextNode("stop");
myLink.appendChild(myText);
myP.appendChild(myLink);

Le paragraphe est terminé. Il reste à le placer dans le <div>.

diaporamaDIV.appendChild(myP);

Enfin, le nouveau <div> est inséré dans le body juste avant le <div> "footer".

myBody.insertBefore(diaporamaDIV, footerDIV);
}
}

Les outils indispensables : Firefox, console Javascript, Aardwark

Les navigateurs sont tellement habitués à trouver du code javascript mal écrit qu'ils ne signalent même plus les erreurs. Le débogage devient alors très difficile, voire quasi impossible. Heureusement il y a Firefox.

Firefox et sa console javascript

Quiconque décide de créer une page Web doit installer et utiliser ce navigateur, quitte à faire de la peine à Bill Gates.

Firefox dispose en effet d'une console javascript qui affichera les erreurs. C'est le minimum quand on veut tester une page.

Aardwark

 Aardwark dans le menu contextuel de Firefox

Ce plugin pour Firefox est un petit bijou au nom imprononçable. En effet, il permet de voir les éléments créés par les APIs DOM. Vous pensiez peut-être que "Afficher le code source" suffisait. Il n'en est rien. "Afficher le code source" montre le code de la page, tel qu'il est dans le fichier html.

Une fois installé, Aardwark apparait dans le menu contextuel de Firefox.

 Cadre rouge affiché par Aardwark avec le type de l'élément et son Id.

Une fois Aardwark activé, le survol de la page fait apparaître un cadre rouge qui délimite l'élément survolé. En appuyant sur la touche "v" (comme voir), Aardwark affiche le code HTML de l'élément, y compris le code HTML généré par programmation. Alors, allez vite télécharger Aardwark ici http://www.karmatics.com/Aardwark/ et, comme moi, vous ne pourrez plus vous en passer.

; commentaire

Les bons liens

Internet est une vraie jungle. Trouver le bon site peut faire gagner des heures de travail.

Références sur DOM

Si vous souhaitez utiliser les APIs DOM, voici quelques bons sites pour bien commencer :

Une introduction au DOM (en anglais)

Un exemple pratique de manipulation d'éléments HTML avec le DOM niveau 1 (en anglais).

En français (enfin) l'exemple d'Alsacréation qui a inspiré WDGalerie.

Javascript

Javascript est un langage très puissant mais pourtant méconnu ou abordé superficiellement. Pour programmer le diaporama de WDGalerie je me suis aidé dans les sites suivants :

Programmation orientée objet (en anglais)

Création dynamique de fonctions en javascript (en anglais)

Les "closures" en javascrip - encapsulation d'une fonction dans une fonction (en anglais)

CSS

Alsacréation : l'incontournable site en français sur le CSS (très bon forum !)

Des tutoriaux sur XHTML et CSS (en français)

La référence : http://www.w3.org/Style/CSS/