Vous êtes sur la page 1sur 37

Sélections Manipulations Evénements Manipuler DOM

Javascript : manipuler l’arbre DOM

Technologies du Web 1

Jean-Christophe Routier
Licence 1 SESI
Université Lille 1

Université Lille 1 - Licence 1 SESI Technologies du Web 1 1


Sélections Manipulations Evénements Manipuler DOM

Sélection d’éléments

Pour manipuler les éléments de la page il faut au préalable les sélectionner.

La sélection d’éléments peut se faire


I par son attribut id
I par son attribut class
I par sa balise
I par un sélecteur CSS

+ sélection par attribut name sur certains éléments

Université Lille 1 - Licence 1 SESI Technologies du Web 1 2


Sélections Manipulations Evénements Manipuler DOM

Sélection par l’identité

getElementById
la méthode getElementById de l’objet document sélectionne l’unique
élément du document dont l’id est fourni en paramètre, ou null si aucun

I le résultat est un objet élément (de type HTMLElement)


var element = document . getElem entById ( " joconde " ) ;

Université Lille 1 - Licence 1 SESI Technologies du Web 1 3


Sélections Manipulations Evénements Manipuler DOM

Sélection par la classe ou la balise

getElementsByClassName
la méthode getElementsByClassName sélectionne les éléments dont la
classe est fournie en paramètre

getElementsByTagName
la méthode getElementsByTagName sélectionne les éléments dont la balise
est fournie en paramètre

Ces 2 méthodes :
I peuvent s’appliquer au document ou à un élément du document, dans
le second cas seuls les éléments descendants sont sélectionnés
I ont pour résultat la liste des éléments sélectionnés
−→ se manipule comme un tableau non mutable
cette liste est dynamique
Université Lille 1 - Licence 1 SESI Technologies du Web 1 4
Sélections Manipulations Evénements Manipuler DOM

// tous les <div > du document


var divList = document . g e t E l e m e n t s B y T a g N a m e ( " div " ) ;
divList . length ; / / −> l e n o m b r e d ’ é l é m e n t s s é l e c t i o n n é s
// toutes les <img > descendants de ’ sec1 ’
var sec1 = document . get ElementBy Id ( " section1 " ) ;
var sec1DivList = sec1 . g e t E l e m e n t s B y T a g N a m e ( " img " ) ;
sec1DivList [0]; / / −> l e p r e m i e r é l é m e n t s é l e c t i o n n é

// tous les é l é m e n t s de classe ’ remarque ’


var classList = document . g e t E l e m e n t B y C l a s s N a m e ( " remarque " ) ;
// é l é m e n t s descendant de ’ unique ’ de classe
’ gauche ’ et ’ encadre ’
var elt = document . get ElementB yId ( " unique " ) ;
var eltList = elt . g e t E l e m e n t s B y C l a s s N a m e ( " gauche encadre " ) ;
// les m ê m e s é l é m e n t s
var eltList2 = elt . g e t E l e m e n t s B y C l a s s N a m e ( " encadre gauche " ) ;

Université Lille 1 - Licence 1 SESI Technologies du Web 1 5


Sélections Manipulations Evénements Manipuler DOM

Sélection par sélecteurs CSS

querySelectorAll
la méthode querySelectorAll sélectionne les éléments retenus par le
sélecteur CSS fourni en paramètre
querySelector est similaire mais ne fournit que le premier élément

I peut s’appliquer à document ou à un élément


dans le cas d’une invocation sur un élément e, le sélecteur est appliqué
à tout le document et seuls les éléments descendants de e sont retenus
I la liste résultat n’est pas dynamique
I certaines pseudo-classes (:link, :visited) et pseudo-éléments
(::first-letter, ::first-line) ne sont pas acceptés

Université Lille 1 - Licence 1 SESI Technologies du Web 1 6


Sélections Manipulations Evénements Manipuler DOM

// tous les é l é m e n t s <img > d u document e m b o i t é s dan un


// é l é m e n t <div > de classe ’ exercice ’
var listElement = document . q u e r y S e l e c t or A l l ( " div . exercice img " ) ;

// le premier de ces é l é m e n t s
var premier = document . querySelector ( " div . exercice img " ) ;

// tous les liens ciblant un ”. pdf ” descendants


// de l ’ é l é m e n t d ’ id ’ exo1 ’
var elmt = document . get ElementBy Id ( " exo1 " ) ;
var listElem = elemt . q u e ry S e l e c t o r A l l ( ’a [ href$ =". pdf "] ’) ;

Université Lille 1 - Licence 1 SESI Technologies du Web 1 7


Sélections Manipulations Evénements Manipuler DOM

Propriétés des éléments

les objets éléments possèdent des propriétés manipulables :


I attributs
I contenu
I style css
une fois un élément sélectionné, on peut agir sur ces propriétés

Université Lille 1 - Licence 1 SESI Technologies du Web 1 8


Sélections Manipulations Evénements Manipuler DOM

Manipuler les attributs

I les atttributs html sont des propriétés


I même nom, en minuscules, avec « conversion camelback »
I l’attribut class devient className
I la valeur peut être string, number ou boolean selon attribut
I on peut également utiliser getAttribute et setAttribute
I dans ce cas la valeur est toujours une chaı̂ne de caractères

Université Lille 1 - Licence 1 SESI Technologies du Web 1 9


Sélections Manipulations Evénements Manipuler DOM

// r é c u p é r a t i o n de l ’ é l é m e n t d ’ id ’ celebre ’
var monImage = document . g etElemen tById ( " celebre " ) ;
// a c c è s à son attribut ’ width ’ : un number
var taille = monImage . width ;
// modification de son attribut ’ width ’
monImage . width = taille + 100;
// modification d ’ autres attributs
monImage . src = " images / joconde . jpg " ;
monImage . alt = " le tableau de la Joconde " ;
monImage . className = " gauche " ;

cf. exemple propriete.html

Université Lille 1 - Licence 1 SESI Technologies du Web 1 10


Sélections Manipulations Evénements Manipuler DOM

Manipuler le contenu

innerHTML
la propriété innerHTML représente le contenu HTML d’un élément

I lorsque la valeur de cette propriété est modifiée, son contenu est


interprété par le navigateur

textContent
la propriété textContent représente le contenu textuel d’un élément

I lorsque cette propriété est lue, elle ne contient pas les balises HTML

Université Lille 1 - Licence 1 SESI Technologies du Web 1 11


Sélections Manipulations Evénements Manipuler DOM

var elemt = document . getElem entById ( " exemple " ) ; ...


var htmlText = element . innerHTML ; < div id = " exemple " >
alert ( htmlText ) ; / / −> ” < p > C e c i e s t < s t r o n g > <p > Ceci est
< strong > mon </ strong >
// m o n </ s t r o n g > c o n t e n u . < / p >”
contenu .
</ p >
var txt = element . textContent ; </ div >
...
alert ( txt ) ; / / −> ” C e c i e s t mon contenu ”

// modifie le contenu HTML de l ’ é l é m e n t et donc son ’ a f f i c h a g e ’.


// La balise <em > est i n t e r p r é t é e .
elemt . innerHTML = " un <em > autre </ em > contenu " ;

// modifie le contenu texte de l ’ é l é m e n t et donc son ’ affichage . ’


// Le texte <strong > N ’ est PAS i n t e r p r é t é .
elemt . textContent = " un contenu < strong > texte </ strong > " ;

cf. exemple text-inner.html

Université Lille 1 - Licence 1 SESI Technologies du Web 1 12


Sélections Manipulations Evénements Manipuler DOM

Agir sur les propriétés CSS

I la propriété style d’un élément permet d’agir sur les propriétés CSS
de cet élément
mais elle ne permet pas d’accéder aux valeurs des propriétés définies
dans une feuille de style, seulement aux propriétés définies dans le
document HTML ou via style
I on utilise directement le nom de la propriété CSS après « conversion
camelback » si nécessaire
−→ font-size fontSize, border-right-style
borderRightStyle, etc.
I les valeurs sont toujours des chaı̂nes de caractères
I les unités doivent être précisées

Université Lille 1 - Licence 1 SESI Technologies du Web 1 13


Sélections Manipulations Evénements Manipuler DOM

// s é l e c t i o n de l ’ é l é m e n t voulu
var elemt = document . getElem entById ( " exemple " ) ;

// modification de certaine p r o p r i é t é s CSS


// ’ l ’ affichage ’ est i m m é d i a t e m e n t i m p a c t é
elemt . style . fontWeight = " bold " ;
elemt . style . fontSize = " 12 px " ; // ne pas o u b l i e r l ’ u n i t é
elemt . style . marginRight = " 10 px " ;
elemt . style . marginTop = " 2% " ;
elemt . style . ba ck gr ou n dC ol or = " rgba (128 ,0 ,0 ,0.5) " ;

var r = element . style . marginRight ; / / / ! \ ’ s t r i n g ’ avec les u n i t é s


var nouveauR = r + 100; / / −> ” 1 0 p x 1 0 0 ” !!!
var valNouvR = parseInt ( r ) +100; / / −> 1 1 0
element . style . marginRight = valNouvR + " px " ; / / n e p a s oublier l ’ u n i t é !

cf. exemple modification-style.html

Université Lille 1 - Licence 1 SESI Technologies du Web 1 14


Sélections Manipulations Evénements Manipuler DOM

Style « calculé »

getComputedStyle
la méthode getComputedStyle de l’objet window permet d’obtenir le
valeurs des propriétés CSS appliquées par le navigateur

I les propriétés CSS ont le même nom que précédemment


pas de « raccourci » autorisé : margin interdit, utiliser marginLeft, ...
I elles sont en lecture seule
I elles s’expriment en unité absolue (px)

Université Lille 1 - Licence 1 SESI Technologies du Web 1 15


Sélections Manipulations Evénements Manipuler DOM

// s é l e c t i o n de l ’ é l é m e n t voulu
var elemt = document . getElem entById ( " exemple " ) ;

// r é c u p é r a t i o n du style c a l c u l é
var computed = window . g e t C o m p u te d S t y l e ( elemt ) ;
var marge = computed . marginLeft ; // a v e c les u n i t é s , en px
var couleur = computed . b ac kg r ou nd Co l or ; // r g b ( . . . , . . . , . . . )

// appliquer un facteur d ’ é c h e l l e de 10% à la largeur :


var largeur = parseInt ( computed . width ) ; / / r é c u p è r e valeur c a l c u l é e
var nvLargeur = Math . floor ( largeur *1.10) ; / / ajoute 10%
elemt . style . width = nvLargeur + " px " ; // modifie style a p p l i q u é

Université Lille 1 - Licence 1 SESI Technologies du Web 1 16


Sélections Manipulations Evénements Manipuler DOM

Evénements

Certaines actions sur des éléments produisent un événement.


Il existe différents types d’événements, ils caractérisent l’action réalisée et
dépendent de l’élément cible (sur lequel porte l’action).
I actions de l’utilisateur via le clavier ou la souris
−→ click, keypress, keyup, mouseover, etc.
I changement d’état
−→ change, focus
I chargement d’un élément
−→ load
I etc.

Université Lille 1 - Licence 1 SESI Technologies du Web 1 17


Sélections Manipulations Evénements Manipuler DOM

Programmation événementielle

programmation événementielle
La programmation événementielle consiste à lier une fonction à
l’occurrence d’un événement sur un élément.
On parle d’abonnement de la fonction à l’élément pour l’événement.
La fonction est déclenchée lorsque l’événement se produit sur cet élément
cible – target.

fonction listener
La fonction attachée à un événement est appelée fonction « gestionnaire
d’événement » – event handler – ou « d’écoute » – event listener .

Université Lille 1 - Licence 1 SESI Technologies du Web 1 18


Sélections Manipulations Evénements Manipuler DOM

Méthode d’abonnement

addEventListener
La méthode addEventListener permet d’abonner à l’objet sur lequel elle
est invoquée une fonction pour l’événement précisé.

objet.addEventListener(eventType, listenerFunction)

I objet : l’objet ciblé : window, ou un élément de la page


I eventType : une chaı̂ne de caractères désignant le type d’événement
"click", "load", "change", "mouseover", "keypress" etc.
I listenerFunction : la fonction listener qui sera appelée lorsque
l’événement se produit

Université Lille 1 - Licence 1 SESI Technologies du Web 1 19


Sélections Manipulations Evénements Manipuler DOM

var action1 = f u n c t i o n () {
window . alert ( " on a cliqué sur le pied de page " ) ;
}

// s é l e c t i o n d ’ un é l é m e n t
var pied = document . getEleme ntById ( " piedDePage " ) ;
// abonnement sur cet é l é m e n t de la fonction ’ action1 ’
// pour un é v é n e m e n t ” click ” => ’ action () ’ d é c l e n c h é e si clic
pied . a d d E v e n t L i s t e n e r ( " click " , action1 ) ;

cf. exemple event1.html

Université Lille 1 - Licence 1 SESI Technologies du Web 1 20


Sélections Manipulations Evénements Manipuler DOM

Un peu de méthodologie

1 placer les fonctions javascript dans un fichier à part de l’html


2 définir une fonction chargée de mettre en place les abonnements :
1 récupérer l’élément ciblé
2 abonner la fonction listener pour l’événement voulu
3 déclencher cette fonction
I doit être fait lorsque la page est complètement chargée pour être sûr
que tous les éléments existent
,→ utiliser l’événement load sur window

Université Lille 1 - Licence 1 SESI Technologies du Web 1 21


Sélections Manipulations Evénements Manipuler DOM

< html >


< head > ...
< script src = " monScript . js " > </ script >
</ head > cf. exemple event2.html
< body > ... cf. temperature.html
< img id = " laJoconde " ... / > ...
< div id = " piedDePage " > ... </ div >
...

avec monscript.js :
// fonction de mise en place des abonnements
var setupEvents = f u n c t i o n () {
// abonnement pour é l é m e n t d ’ id ’ piedDePage ’
var pied = document . get ElementBy Id ( " piedDePage " ) ;
pied . a d d E v e n t L i s t e n e r ( " click " , action1 ) ;
// abonnement pour é l é m e n t d ’ id ’ laJoconde ’
var joconde = document . getElem entById ( " laJoconde " ) ;
joconde . a d d E v e n t L i s t e n e r ( " mouseover " , action2 ) ;
}

// on provoque l ’ e x é c u t i o n de ” setupEvents ” à la fin du


// chargement du document
window . a d d E v e n t L i s t e n e r ( " load " , setupEvents ) ;

// d é f i n i t i o n des fonctions l i s t e n e r
var action1 = f u n c t i o n () { ... }
var action2 = f u n c t i o n () { ... }
Université Lille 1 - Licence 1 SESI Technologies du Web 1 22
Sélections Manipulations Evénements Manipuler DOM

Sur un élément donné on peut avoir


I plusieurs abonnements pour différents événements
I plusieurs abonnements pour le même événement

removeEventListener
la méthode removeEventListener permet de désabonner de l’objet sur
lequel elle est invoquée une fonction pour un événement
objet.removeEventListener(eventType, listenerFunction)

cf. exemple event3.html

Université Lille 1 - Licence 1 SESI Technologies du Web 1 23


Sélections Manipulations Evénements Manipuler DOM

Complément sur fonctions d’écoute

I dans une fonction listener, la variable this est définie et désigne


l’objet qui a déclenché l’événement
typiquement l’élément du document
I un objet event est créé pour chaque événement. Cet objet est passé
en paramètre lors du déclenchement de la fonction listener associée.
Le type d’objet event varie selon l’événement.
Un objet event possède des propriétés qui informent sur l’événement.

Université Lille 1 - Licence 1 SESI Technologies du Web 1 24


Sélections Manipulations Evénements Manipuler DOM

L’objet event

Quelques propriétés (selon les types d’événements) :


I clientX, clientY/ screenX, screenY/ pageX, pageY coordonnées
de l’événement par rapport au “navigateur”/l’écran/la page
I altKey, ctrKey, shiftKey l’une des touches Alt, Ctrl ou Shift était
pressée lors de l’événement ?
I keyCode information sur la touche appuyée
à combiner avec String.fromCharCode()
I target la cible de l’événement (== this)
I etc.
cf. exemple event4.html – exemple target.html

Université Lille 1 - Licence 1 SESI Technologies du Web 1 25


Sélections Manipulations Evénements Manipuler DOM

Versions précédentes
I DOM niveau 0 :
I les gestionnaires d’événements s’appellent onevent :
onclick, onload, onmmouseover, etc.
I un gestionnaire d’événement peut être placé en ligne en tant qu’attribut
d’un élément, la valeur associée est le code exécuté
<img src="..." onclick="var i = 2; action();"/>
I on peut aussi créer l’abonnement dans le code javascript :
element.onclick = maFonction;
I défauts :
I code javascript dans le code HTML
I un seul abonnement possible par type d’événement

Conclusion
utiliser le modèle addEventListener

I attachEvent(...) dans IE < 8 (+ autres différences)


Université Lille 1 - Licence 1 SESI Technologies du Web 1 26
Sélections Manipulations Evénements Manipuler DOM

Le type Node
type Node
Les nœuds de l’arbre DOM sélectionnés par getElementById,
getElementsByClassName, ..., sont de type Node.

Un objet Node propose les propriétés :


I nodeName : le nom du nœud (balise en majuscules)
I nodeType : type du nœud défini par des constantes nommées
prédéfinies, Node.ELEMENT NODE (= 1), Node.TEXT NODE (= 3)
I nodeValue : null si le nœud est un élément, le contenu pour une
nœud texte
I parentNode le nœud parent du nœud courant
I childNodes la liste (NodeList) des fils du nœud courant
I fitstChild, lastChild : le premier et dernier des nœuds fils
I previouSibling, nextSibling : le nœud frère précédent/suivant
I etc. cf. exemple dom3.html
Université Lille 1 - Licence 1 SESI Technologies du Web 1 27
Sélections Manipulations Evénements Manipuler DOM

Création

I document.createElement(balise) : crée un nouveau nœud avec la


balise donnée
I document.createTextNode(texte) : crée un nouveau nœud texte
avec le contenu texte fourni (non interprété)

NB : existe aussi
I node.cloneNode qui a pour résultat un nouveau nœud copie de node

Université Lille 1 - Licence 1 SESI Technologies du Web 1 28


Sélections Manipulations Evénements Manipuler DOM

Insertion

I noeudParent.insertBefore(noeudInséré,noeudRéférence) :
insère noeudInséré avant noeudRéférence comme fils de
noeudParent
I parent.appendChild(noeudAjouté) : le nœud noeudAjouté est
ajouté à la fin des fils de parent

NB : si le nœud inséré ou ajouté existe dans le document, il est alors


déplacé (donc supprimé de la position existante et inséré/ajouté à la
position demandée).

cf. exemple dom3.html

Université Lille 1 - Licence 1 SESI Technologies du Web 1 29


Sélections Manipulations Evénements Manipuler DOM

Suppression et remplacement

I parent.removeChild(noeud) : noeud est supprimé des fils de


parent
I parent.replaceChild(remplaçant,remplacé) : remplaçant
prend la place de remplacé comme fils de parent

cf. exemple dom3.html

Université Lille 1 - Licence 1 SESI Technologies du Web 1 30


Sélections Manipulations Evénements Manipuler DOM

Fonction listener et paramètres

I le second paramètre de addEventListener est la fonction d’écoute,


il s’agit d’une valeur de type fonction et pas d’un appel de
fonction !

Problème
Comment faire pour que la listener function soit paramétrée ?

Par exemple :
I on dispose d’un document avec des images
I lors du clic sur une image on veut déclencher une action
I les actions sont similaires pour toutes les images mais dépendent du
« numéro » de l’image

cf. exemple fonction param.html


Université Lille 1 - Licence 1 SESI Technologies du Web 1 31
Sélections Manipulations Evénements Manipuler DOM

Une solution ?
var setu pListene rs = f u n c t i o n () {
var elements = document . g e t E l e m e n t s B y T a g N a m e ( " img " ) ;

elements [0]. a d d E v e n t L i s t e n e r ( " click " , listener1 ) ;


elements [1]. a d d E v e n t L i s t e n e r ( " click " , listener2 ) ;
elements [2]. a d d E v e n t L i s t e n e r ( " click " , listener3 ) ;
elements [3]. a d d E v e n t L i s t e n e r ( " click " , listener4 ) ;
}
window . a d d E v e n t L i s t e n e r ( " load " , set upListen ers ) ;
// les fonctions ” event l i s t e n e r ” : ICI une par image . . .
var listener1 = f u n c t i o n () {
var sourceDisplay = document . ge tElement ById ( " source " ) ;
sourceDisplay . innerHTML = " image 1 " ;
};
var listener2 = f u n c t i o n () {
var sourceDisplay = document . ge tElement ById ( " source " ) ;
sourceDisplay . innerHTML = " image 2 " ;
};
var listener3 = f u n c t i o n () { ... " image 3 "
var listener4 = f u n c t i o n () { ... " image 4 "

cf. exemple fonction param mauvais.html


Université Lille 1 - Licence 1 SESI Technologies du Web 1 32
Sélections Manipulations Evénements Manipuler DOM

Problème
et si on a plus de 4 images ?

I les listener diffèrent peu...


I on aurait pu résoudre le problème avec cette fonction
1 var listener = f u n c t i o n ( numero ) {
2 var sourceDisplay = document . get ElementB yId ( " source " ) ;
3 sourceDisplay . innerHTML = " image " + numero ;
4 };

I mais il y a un paramètre... on peut alors écrire cela


1 var numero = NNN ; / / NNN = v a l e u r à c h a n g e r à c h a q u e fois
2 var listener = f u n c t i o n () {
3 var sourceDisplay = document . get ElementB yId ( " source " ) ;
4 sourceDisplay . innerHTML = " image " + numero ;
5 };

mais il faut changer NNN à chaque fois...

Université Lille 1 - Licence 1 SESI Technologies du Web 1 33


Sélections Manipulations Evénements Manipuler DOM

Fonction qui calcule une fonction

I une fonction peut calculer une variable et la fournir en résultat


1 var exemple = f u n c t i o n () {
2 var result = 10;
3 return result *10+ 5;
4 };

I c’est aussi possible avec les variables dont le résultat est une fonction
1 var creeFonction = f u n c t i o n () {
2 var func = f u n c t i o n ( i ) {
3 return 2* i ;
4 } ;
5 return func ;
6 }
7
8 var f = creeFonction (2) ; // le r é s u l t a t est une fonction
9 f; // f u n c t i o n ( ) { return 2∗ i ; }
10 f (12) ; / / −> 2 4

Université Lille 1 - Licence 1 SESI Technologies du Web 1 34


Sélections Manipulations Evénements Manipuler DOM

Fonction qui calcule une fonction (2)

I la fonction « créatrice » peut être paramétrée


1 var c r e e F o n c t i o n M u t i p l e = f u n c t i o n ( facteur ) {
2 var func = f u n c t i o n ( i ) {
3 return facteur * i ;
4 } ;
5 return func ;
6 }
7
8 fois2 = c r e e F o n c t i o n M u l t i p l e (2) ;
9 fois2 (7) ; / / −> 14
10
11 fois5 = c r e e F o n c t i o n M u l t i p l e (5) ;
12 fois5 (7) ; / / −> 35

Université Lille 1 - Licence 1 SESI Technologies du Web 1 35


Sélections Manipulations Evénements Manipuler DOM

Une fonction qui calcule les listeners

var crea teListen er = f u n c t i o n ( numero ) {


var listener = f u n c t i o n () {
var sourceDisplay = document . ge tElement ById ( " source " ) ;
sourceDisplay . innerHTML = " image " + numero ;
};
return listener ;
}

Université Lille 1 - Licence 1 SESI Technologies du Web 1 36


Sélections Manipulations Evénements Manipuler DOM

La solution
var setu pListene rs = f u n c t i o n () {
var elements = document . g e t E l e m e n t s B y T a g N a m e ( " img " ) ;
for ( var i =0; i < elements . length ; i ++) {
elements [ i ]. a d d E v e n t L i s t e n e r ( " click " , creat eListene r ( i +1) ) ;
}
}

window . a d d E v e n t L i s t e n e r ( " load " , set upListen ers ) ;

var crea teListen er = f u n c t i o n ( numero ) {


var listener = f u n c t i o n () {
var sourceDisplay = document . ge tElement ById ( " source " ) ;
sourceDisplay . innerHTML = " image " + numero ;
};
return listener ;
}

Si plus de 4 images ? Pas de problème !

cf. exemple fonction param.html


Université Lille 1 - Licence 1 SESI Technologies du Web 1 37