Javascript

Masquer apartés
Notions abordées dans cette page
  • le type de donnée des "éléments de page"
  • la mise en place d'événement
  • manipulations dynamique de la page
Les codes fournis ici ne fonctionneront sans doute pas avec Internet Explorer. l'interprète Javascript de ce navigateur diffèrent un peu de ce qui est présenté ici. Le nom des fonctions utilisées changent mais les principes restent exactement les mêmes. Ainsi les fonctions addEventlistener et removeEventListener qui sont introduites dans la suite s'appellent attachEvent et detachEvent pour Internet Explorer.
Il en sera de même avec des navigateurs "un peu anciens" (on devient très vite "ancien" en informatique). Il faut donc continuer à tester ces codes avec un navigateur Firefox "récent" (version > 6 par exemple).

Des pages plus dynamiques

Des données pour représenter les éléments d'une page

La langage Javascript offre la possibilité de manipuler une page HTML. Il est possible par l'exécution de code Javascript d'agir directement sur une page affichée par un navigateur et de la modifier dynamiquement. Il s'agit en fait d'agir sur les données qui représentent les contenus de la page. Vous savez maintenant qu'une page HTML respecte une syntaxe précise et qu'elle est composée d'éléments structurés par des balises. Chacun des éléments qui apparaît dans la page peut être représenté par une donnée Javascript. Nous avons déjà rencontré la donnée document qui représente le document dans son ensemble. Javascript propose le type Element qui représente les éléments au sein d'une page HTML, c'est-à-dire les blocs correspondant à des balises, et offre des fonctionnalités pour les manipuler. On peut ainsi définir une variable représentant un élément <img>, un titre <h2>, un paragraphe <p>, un bloc <div>, etc., et manipuler ces variables. Par exemple, il est possible de modifier l'apparence ou le contenu d'un élément. Ces opérations permettent de créer des effets dynamiques qui enrichissent les possibilités offertes par l'usage du seul couple HTML/CSS .

A nouveau, la présentation faite ici est partielle. Les possibilités offertes par Javascript pour l'accès et la manipulation des données représentant les éléments d'une page HTML sont beaucoup plus larges.

La première méthode d'accès aux données représentant un élément de la page HTML que nous allons utiliser consiste à exploiter la possibilité de nommer en HTML un élément de la page grâce à l'attribut id (on pourra parler d'élément identifié). En effet la fonction getElementById qui s'applique sur la donnée document permet de récupérer la donnée de type Element dont l'attribut id correspond à la valeur passée en paramètre de l'appel de fonction.

Ainsi considérons la portion de code HTML suivante :

<h1> Un exemple avec des id </h1>
  <div>
    Un premier bloc div
  </div>  
  <div id="important">
    Ceci est un texte important.
  </div>
  <img id="monImage" class="encadree" src="exemple.png"></img> 

Il est possible d'associer une variable Javascript pour chacun des éléments identifiés par un attribut id de la manière suivante :

var divImportant = document.getElementById("important"); 
var lImage = document.getElementById("monImage"); 

Les éléments qui ne possèdent pas d'attribut id ne sont pas accessibles par cette méthode.

Evénements

D'une manière générale vous pouvez considérer qu'il ne faut plus utiliser document.writeln dès lors qu'il s'agira de manipuler dynamiquement des éléments de la page.

L'interaction sur des éléments d'une page nécessite d'aborder des manipulations un peu différentes de celles étudiées jusque maintenant. L'approche à adopter va différer de ce que nous faisions jusque maintenant car nous agissions sur le contenu de la page au moment de son chargement. Ainsi les document.writeln utilisées étaient interprétées par la navigateur au fur et à mesure de la mise en place de la construction des éléments comme nous avons pu l'observer lors du chargement de la page affichant les momuments. Cela ne convient plus pour ce que nous voulons faire maintenant. Enfonçons les portes ouvertes : pour agir sur les éléments d'une page il faut que ces éléments existent... Il faut donc que la page ait été chargée complètement par le navigateur. Les traitements agissent donc sur une page déjà "existante". Il faut donc trouver un moyen pour déclencher ces traitements alors que la page a fini d'être chargée. Cela est possible grâce à la programmation événementielle.

On appelle événement :

  • une action de l'utilisateur sur un élément de la page via la souris ou le clavier
  • ou le chargement d'une donnée, page ou image par exemple.

Le principe est de permettre le déclenchement d'un traitement lorsqu'un événement particulier se produit sur un élément de la page. Il existe différents types d'événements. Ils caractérisent l'action réalisée et dépendent de l'élément sur lequel porte l'action, tous les types d'événements ne sont pas disponibles pour toutes les sortes d'éléments. Chaque type d'événement à un nom :

  • un événement click est déclenché lors d'un clic souris
  • un événement load est déclenché à la fin du chargement d'un élément
  • un événement mouseover est déclenché lorsque la souris passe au-dessus d'un élément
  • un événement keypress est déclenché lors de l'appui d'une touche
  • un événement change est déclenché lorsque le contenu d'un élément change,
  • etc.
La programmation événementielle consiste à lier une fonction à un type d'événement pour un élément donné.
La fonction est exécutée lorsque l'événement se produit sur cet objet.

La liaison d'une fonction à un événement pour un élément donnée se réalise grâce à la fonction addEventListener du type Element :

La syntaxe d'un appel sur un élément ressemble donc à :

element.addEventListener(typeEvenement,fonctionDeclenchee)

On rencontrera (et utilisera) donc souvent le schéma typique de code suivant, où action est une fonction supposée définie par ailleurs :

var unElement = document.getElementById("lElementQueJeVeux");
unElement.addEventListener("click",action);

qui aura pour conséquence que la méthode action sera appelée à chaque fois que l'utilisateur cliquera sur l'élément de la page dont l'id est lElementQueJeVeux.

Attention Il est important de noter que le second paramètre de addEventListener est un nom de fonction (identificateur) et pas une chaîne de caractères représentant ce nom.

On utilise le terme d'abonnement de la fonction à l'événement sur l'objet. La fonction est elle appelée fonction écouteur, listener en anglais.

Mise en place des abonnements

Il nous reste une petite difficulté technique à franchir pour pouvoir exploiter ces événements sur les éléments de notre page mais elle n'est pas très compliquée à comprendre et facile à résoudre avec un peu de méthode. Et les exemples clarifieront tout cela.

Ce "problème" concerne la mise en place des abonnements pour ces événements. On retrouve un problème similaire à celui rencontré précédemment : pour réaliser un abonnement il est nécessaire de disposer de la donnée le représentant. Il faut donc que cet élément existe. On ne peut donc pas réaliser l'abonnement tant que la page n'a pas été chargée par le navigateur. Or le code Javascript est a priori exécuté pendant le chargement de la page, pas après...

Pour résoudre ce paradoxe apparant nous allons utiliser le mécanisme événementiel et un événement en particulier : l'événement load qui permet de déclencher un appel de fonction (donc un traitement) après qu'un élément ait été complètement chargé.

Il faut créer une fonction qui réalise tous les abonnements et abonner cette fonction à l'élément window, qui est l'élément qui représente la page dans son ensemble, pour l'événement load. Ainsi la mise en place des abonnements sera réalisée après que la page ait été chargée, on a donc l'assurance que les éléments impliqués existent.

Passons à la pratique, il "suffit" de suivre étape par étape la démarche suivante :

  1. créer un fichier dans lequel va être placé le code Javascript correspondant à la gestion des événements, appelons-le pour l'exemple mesEvenements.js,
  2. ajouter dans la partie head du document HTML concerné le lien vers ce fichier de script
  3. définir dans ce fichier les fonctions listeners dont on a besoin, comme c'était la cas de la fonction action précédemment,
  4. en début de fichier, placer une fonction que nous appellerons setupEvents qui aura pour responsabilité de mettre en place les abonnements souhaités en respectant le schéma type vu ci-dessus,
  5. provoquer l'appel de cette fonction quand la page a fini son chargement, ce qui est réaliser en abonnant cette fonction sur l'élément window pour l'événement load

Le fichier mesEvenements.js ressemblera donc à ceci  :

/* fonction de mise en place des abonnements
 */
var setupEvents = function ()  {

  // abonnement de la fonction action pour l'élément d'id lElementQueJeVeux en réaction à un click
  var unElement = document.getElementById("lElementQueJeVeux");
  unElement.addEventListener("click",action);

  // ... on répète le même schéma ici si on veut mettre en place d'autres abonnements
}

// pour appeler la fonction ci-dessus quans la page est chargée
window.addEventListener("load",setupEvents);

// ----------------------------------------
/* Documentation de la fonction action
 */
var action = function () {
   ... // ce que action doit faire
}

// ... et d'autres définitions éventuellement

alors que le fichier HTML ressemble à :

<html ...>
  <head>
    <script type="text/javascript" src="mesEvenements.js"></script>   
    ...
  </head>
  <body>
    ...
    <div id="lElementQueJeVeux">
      ...
    </div>
    ...
  </body>
</html>

Manipulation sur les éléments

Cette page propose une table des équivalences de nom entre les propriétés CSS et Javascript.

On eut ainsi accéder ou modifier une valeur de style d'un élément présent dans la page. Le navigateur interprétant en continu toute modification de la page on obtient des effets dynamiques. Pour modifier le style d’un élément ayant comme id monElement et donner la valeur laValeur à sa propriété laPropriete il faut utiliser la syntaxe suivante :

var monElement = document.getElementById(monElement);
monElement.style.laPropriete = "laValeur";

On note que les valeurs des propriétés sont des chaînes de caractères.

  1. Définissez une page HTML contenant un élément de balise div d'identifiant zoneTravail et une feuille CSS qui définit pour cette balise un texte de couleur red et une couleur de fond #EEEEEE.
  2. Ecrivez un code Javascript qui permet lorsque l'on clique dessus de modifier cet élément en lui attribuant la couleur de texte blue et la couleur de fond yellow.
  3. Complétez le code HTML pour y ajouter un autre élément div et ajoutez dans le code Javascript pour qu'un clic sur ce nouvel élément permette de modifier l'élément zoneTravail en lui attribuant la couleur de texte black, la couleur de fond #77FF77 et une bordure d'épaisseur 2px, en trait plein et de couleur #00FF00.
  4. A nouveau complétez l'HTML avec une balise div et le Javascript pour que cette fois, un clic sur l'élément ajouté provoque l'inversion des couleurs de texte et de fond de zoneTravail, quelles que soient ces couleurs.
  5. Modifiez la feuille de style pour donner une apparence plus "type bouton" aux 2 derniers éléments ajoutés (largeur limitée, bordure, changement de couleur lorsque la souris passe au-dessus, etc.)
 

Articles

Vidéos