Alain Barraud Mémento informatique  
 
Accueil Logithèque - SE Photo - vidéo Internet - protocoles Site Web PC - Réseau Archives
Page ouverte le 02/06/2009

JavaScript - Les objets HTML

Voyons le JS dans la page HTML.
Pour JS, tous les éléments HTML sont des objets (images, liens, etc.) : on va donc pouvoir s'en servir pour en connaître ou en modifier les caractéristiques (comme l'adresse de l'image ou ses dimensions).
Cela se révèlera particulièrement pratique, notamment dans le cas des formulaires, qui nous serviront à communiquer avec notre cher utilisateur.

On va voir, au fil de ce chapitre, comment accéder à ces objets issus de notre page, et comment les exploiter.

Retour accueil JS


Sommaire partie 10

Au sommet de la hiérarchie…

L'objet window
On va rapidement voir qu'en JS, la plupart des fonctions qu'on utilise sont en fait… des méthodes de certains objets !

Prenons nos trois fonctions qui font apparaître des boîtes de dialogues, alert(), prompt() et confirm().
question Ce ne sont pas des méthodes, car on ne retrouve pas la syntaxe objet.methode() !?
En fait, si on voulait tout écrire, il faudrait employer window.alert(), window.prompt() et window.confirm()… ce sont donc bel et bien des méthodes, d'un certain objet appelé "window" !

alt L'objet window "représente" la fenêtre du navigateur. Ce sera un objet très utilisé, car il possède de nombreux sous-objets.

On l'utilisera souvent, car c'est un objet de base, pour ne pas dire l'objet de base : c'est pour cela qu'il est facultatif de préciser son nom, comme on l'a toujours fait en écrivant alert() (le programmeur est un animal très fainéant).
Mais, c'est le seul objet qu'on peut ne pas écrire quand on l'utilise.
alt Toutes les fonctions ne sont pas des méthodes de window !
En fait, parmi les fonctions qu'on a vues, seules les trois citées plus haut en sont.
Par exemple, isNaN() est une fonction qui n'appartient à aucun objet.
L'objet document
L'objet document est un sous-objet de window. Cet objet représente la page HTML affichée dans le navigateur. C'est un objet assez important, qu'il est impératif d'écrire ! On ne peut pas l'omettre comme window.

Nous allons passer par ses méthodes pour accéder aux éléments de la page.

Les objets du document

Atteindre les objets

Il est possible d'atteindre (comprendre accéder à) tous les éléments de la page HTML avec deux méthodes de l'objet document :
  • document.getElementById("id");
  • document.getElementsByTagName("balise");
getElementById("id")
Cette méthode permet d'accéder très facilement à l'élément dont l'id est id. Rappel : dans une page html, deux éléments différents doivent avoir des ids différents. Cette fonction nous donne donc bien un élément.
getElementsByTagName("balise")
Cette méthode retourne sous forme de tableau tous les éléments HTML dont on donne la balise en argument.
Code : JavaScript
1     document.getElementsByTagName('textarea');

Cet exemple va retourner un tableau contenant tous les éléments <textarea> de la page.

Puisque la méthode retourne un tableau, il est bien sûr possible d'accéder à chacun des éléments. Si on veut accéder au second <textarea> de la page, on procédera donc ainsi (rappel, on commence à compter à partir de 0) :
Code : JavaScript
1     document.getElementsByTagName('textarea')[1];

question Mais, à quoi peut bien servir cette méthode ? On ne doit pas utiliser ça tous les jours !

Effectivement ! Cela dit, le tableau retourné peut astucieusement être utilisé avec une boucle, de manière à récupérer des éléments particuliers repérés par exemple par leur attribut class ; on pourra ainsi appliquer des changements (comme les masquer) uniquement à ces éléments là.

alt On écrit getElementsByTagName, car on récupère un tableau d'éléments.
Avec getElementById, on récupère un élément unique, donc pas de s.
Compatibilité
Ces deux méthodes font partie du JS depuis sa version 1.5.
Supportée par les version 5 et supérieures de Internet Explorer : seuls les très vieux navigateurs seront incompatibles…

Il existe un moyen de savoir si la méthode "getElementById" fonctionne sur le navigateur qui exécute le script.
On effectue pour cela ce test :
Code : JavaScript
1     if(!document.getElementById) // si la méthode n'existe pas (le ! indique la négation)
2         alert("Sympa ta charette…\nVa donc télécharger un vrai navigateur :p");
Comprendre ce code ainsi : si document.getElementById n'est pas défini, alors […].

Les attributs

Nous n'allons pas étudier tous les attributs de tous les objets, il faut savoir qu'on retrouve presque toujours les mêmes attributs qu'en HTML.
On peut citer les attributs id (encore lui) et className (qui correspond à l'attribut HTML "class").
alt Ce dernier est l'un des rares attributs dont le nom n'est pas le même qu'en HTML.
La cause : le mot-clé "class" est réservé en JS (on n'a pas le droit de l'utiliser pour des noms de variables ou autres). Donc il a fallu trouver un autre nom, d'où className.

Voici quelques exemples…

Modifier l'adresse d'une image et ses dimensions :
Code : JavaScript
1     monImage = document.getElementsByTagName("img") [0];
2     monImage.src = "banniere.jpg";
3     monImage.width = "800";
3     monImage.height = "200";

Afficher la destination d'un lien :
Code : JavaScript
1     alert( document.getElementById("idLien").href );

alt Il existe une autre façon de modifier un attribut d'un objet HTML, en utilisant un truc nommé DOM, mais on en reparlera en temps voulu.

Les évènements

Quelques évènements passe-partout
Voici une liste d'évènements qui s'appliquent à la plupart des objets.
Pour les évènements plus spécifiques, ils seront cités lorsqu'on abordera l'objet en question, dans les chapitres qui suivent.
alt Rappel : les évènements doivent se noter en minuscule, même si on les écrit onEvent pour plus de lisibilité.
  • onClick et onDblClick : lors d'un clic / double clic sur l'élément en question
  • onKeyPress : lorsqu'on appuie sur une touche avec cet élément sélectionné
  • onKeyDown et onKeyUp : lorsqu'une touche est enfoncée / relâchée avec cet élément sélectionné
  • onMouseOver et onMouseOut : lorsque le pointeur de la souris arrive sur l'élément / sort de cet élément
  • onMouseMove : lors d'un déplacement de la souris au-dessus de cet élément
  • onMouseDown et onMouseUp : lorsque le bouton de la souris est enfoncé / relâché sur cet élément
Leur utilisation
La première façon de déclencher un script lors d'un évènement, c'est d'utiliser l'attribut HTML, comme nous l'avons vu dans l'un des premiers chapitres :
Code : JavaScript
1     <img src="azerty.png" alt="" onclick="alert('Oui ?');" />

Mais il est également possible d'indiquer cet évènement directement en JS.
Voici une image (qu'on va repérer grâce à son id) :
Code : HTML
1     <img src="azerty.png" alt="" id="uneImage" />
Et voici le même exemple que ci-dessus, mais directement en JS :
Code : JavaScript
1     document.getElementById("uneImage") .onclick = function()
2     {
3         alert("Oui ?");
4     }

erreur Ce code JS doit être placé dans la page, après l'image !
S'il se trouve dans l'en-tête de la page, l'image n'aura pas encore été créée lors de son exécution (qui se fait au fil du chargement de la page), et JS ne pourra donc pas lui associer un évènement.

Voir Test 11

alt On associe bien une fonction à l'évènement !
On peut également le faire de cette manière :
Code : JavaScript
1     function quoi()
2     {
3         alert("Oui ?");
4     };
5     document.getElementById("uneImage") .onclick = quoi; // on parle de la fonction elle-meme : pas de parentheses

Voir Test 12


erreur En revanche, ceci est faux :
Code : JavaScript
1     document.getElementById("uneImage") .onclick = alert("Oui ?");

Un traitement de faveur pour les formulaires

Accéder aux éléments d'un formulaire

En partant d'un formulaire (balise form), il est possible d'accéder à chacun des champs en utilisant leur attribut name.
Regardons le code HTML suivant :
Code : HTML
1     <form id="monFormulaire" method="post" action="demo.php">
2         <p>
3             <label for="pseudo">Pseudo :</label>
4             <input id="pseudo" name="pseudo" type="text" />
5         </p>
6         <p>
7             <label for="modepasse">Mot de passe :</label>
8             <input id="modepasse" name="motdepasse" type="password" />
9         </p>
10         <p>
11             <textarea name="contenu" cols="100" rows="15"></textarea><br />
12             <input type="submit" value="Envoyer" />
13         </p>
14     </form>

Admettons que nous voulons agir sur le champ de texte qui s'appelle pseudo.
On va commencer par accéder au formulaire comme nous l'avons vu, par son id :
Code : JavaScript
1     var monForm = document.getElementById("monFormulaire");

Voyons maintenant comment accéder au champ nommé "pseudo" à partir de notre formulaire, sans utiliser son id.

Première façon de faire

On utilise directement pseudo, qui est en fait un sous-objet de notre formulaire :
Code : JavaScript
1     var champPseudo = monForm.pseudo;

Dans le cas des éléments de formulaires, on accède donc aux sous-objets directement par leur nom (l'attribut name).

Seconde manière : un tableau, des indices

On peut également accéder aux éléments du formulaire en sachant que notre formulaire contient un tableau elements regroupant justement tous ses éléments.

Ainsi, pour accéder au premier champ du formulaire :
Code : JavaScript
1     var champ1 = monForm.elements[0];

alt Cette façon d'accéder aux éléments est déconseillé : si on insére un champ, les indices (les numéros) changent, et il faut modifier le script en conséquence.

Troisième manière : un tableau associatif

Cette façon d'accéder aux éléments est semblable à la précédente, sauf qu'on utilise pour les indices non pas les numéros, mais les noms.
Code : JavaScript
1     monForm.elements["pseudo"];

C'est un peu plus long que la première façon de faire, mais on comprend lors de la lecture que pseudo est un élément de formulaire.

Attributs, méthodes et évènements

L'utilisation des formulaires : c'est un excellent moyen de communiquer avec le visiteur (plus agréable que les boîtes de dialogue).
Voir prochain chapitre qui y est entièrement consacré.

Récapitulatif

Pour accéder à un élément, on va généralement utiliser la méthode getElemementById de l'objet document.
Code : JavaScript
1     var monForm = document.getElementById("idForm");

Si on veut récupérer un tableau contenant toutes les balises ayant un nom donné (toutes les images, par exemple),
on va utiliser la méthode getElementsByTagName.
Code : JavaScript
1     var images = document.getElementByTagName("img");

Pour les éléments de formulaires : on peut utiliser le tableau elements du formulaire lui-même, ou bien directement le nom de l'élément.
Par exemple, pour accéder au champ nommé "pseudo" de notre formulaire d'id "idForm" :
Code : JavaScript
1     var champPseudo = monForm.pseudo;

ou bien :
Code : JavaScript
1     var champPseudo = monForm.elements["pseudo"];

Complément : le mot-clé "this"

Il existe cependant un cas où accéder à un élément est particulièrement simple : c'est lorsque le code se trouve dans la balise HTML de l'objet en question. On utilise dans ce cas le mot-clé this, qui désigne cet élément (d'où son nom).

Exemple, changer d'image lorsqu'on clique dessus :
Code : HTML
1     <img src="photo.jpg" alt="" onclick="this.src='image.jpg'" />

Ici, l'utilisation de this nous évite d'avoir à repérer l'image par son id.

Autre exemple, en utilisant une fonction avec un argument :
Code : JavaScript
1     function afficherDestination(lien)
2     {
3         alert("Ce lien mene ici : " + lien.href);
4     }

Code : HTML
1     <a href="page.html" onclick="afficherDestination(this);">Cliquez ici</a>

Ce qui donne : Cliquer ici
Annotation : le code function a été mis dans le <head>

Quand on cliquera sur le lien, une boîte de dialogue nous en affichera la destination.