DOM. Michel Gagnon École Polytechnique de Montréal

Documents pareils
TP JAVASCRIPT OMI4 TP5 SRC

Document Object Model (DOM)

DOM - Document Object Model

HTML, CSS, JS et CGI. Elanore Elessar Dimar

NFA016 : Introduction. Pour naviguer sur le Web, il faut : Naviguer: dialoguer avec un serveur web

.. CSS. Damien Nouvel. Damien Nouvel (Inalco) CSS 1 / 15

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

RAPPORT AUDIT SEO. Élaboré à l'attention de : Monsieur Greber Élaboré par : Cédric Peinado

Intégrateur Web HTML5 CSS3

Formation HTML / CSS. ar dionoea

Tutoriel : Feuille de style externe

Séance d ED n 5 : HTML et JavaScript

LES GRANDES ETAPES DE CREATION D UN WEB DESIGN

Travaux dirigés n 10

SYSTÈMES D INFORMATIONS

Présentation du Framework BootstrapTwitter

CRÉER, ROUTER ET GÉRER UNE NEWSLETTER, UN ING

Formation : WEbMaster

RESPONSIVE WEB DESIGN

Ajax, RIA et HTML Prise en charge d Ajax

UN SITE WEB RESPONSIVE EN UNE HEURE?

Normes techniques 2011

Guide de réalisation d une campagne marketing

{less} Guide de démarrage

Pack Fifty+ Normes Techniques 2013

1. La notion de cascade

Démonstration de la mise en cache via HTML 5 sur iphone

Google Tag Manager v2 v1 dispo sur GTM pour les nuls dispo sur

Optimiser pour les appareils mobiles

Manuel d utilisation du module Liste de cadeaux PRO par Alize Web

Initiation aux techniques du Web. Cours L2 sciences cognitives séance 2 Charif HAYDAR: alchiekc@loria.fr

INTRODUCTION AU CMS MODX

Devenez un véritable développeur web en 3 mois!

Programmation Web. Madalina Croitoru IUT Montpellier

Introduction aux concepts d ez Publish

AWS avancé. Surveiller votre utilisation d EC2

GUIDE DE DEMARRAGE V1.02

KompoZer. Composition du site : _ une page d'accueil : index.html. _ une page pour la théorie : theorie.html. _ une page pour les photos : photos.

ING & NEWSLETTER NEWSLETTER RESPONSIVE

Optimiser les s marketing Les points essentiels

Flex. Lire les données de manière contrôlée. Programmation Flex 4 Aurélien VANNIEUWENHUYZE

Bernard Lecomte. Débuter avec HTML

Grille fluide. Une grille fluide sert à structurer la mise en page, la rendre harmonieuse et faciliter le passage au responsive web design

Utilisation de l éditeur.

Manuel d installation de Business Objects Web Intelligence Rich Client.

HTML. Notions générales

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Optimiser les performances d un site web. Nicolas Chevallier Camille Roux

Cours. Cours 8 : Révisions. Importance. Interface homme-machine

BIRT (Business Intelligence and Reporting Tools)

L envoi d un formulaire par courriel. Configuration requise Mail Texte Mail HTML Check-list

FORMATION / CREATION DE SITE WEB / 4 JOURNEES Sessions Octobre 2006

Un jour, une question Réponse à une problématique issue de la liste GTA *

ENDNOTE X2 SOMMAIRE. 1. La bibliothèque EndNote 1.1. Créer une nouvelle bibliothèque 1.2. Ouvrir une bibliothèque EndNote 1.3. Fermer une bibliothèque

Module Com231A - Web et Bases de Données Notion 5 : Formulaires et utilisation des Bases de Données avec PHP

L'API DOM : Document Object Model

Introduction à Expression Web 2

Principales failles de sécurité des applications Web Principes, parades et bonnes pratiques de développement

Module BD et sites WEB

SPIP. Gestion de la performance dans SPIP. Préoccupa)on historique

< Atelier 1 /> Démarrer une application web

Gestion de stock pour un magasin

145A, avenue de Port Royal, Bonaventure (Québec) G0C 1E0 Sans frais :

2 LES BASES DU HTML 19 Qu est-ce que le HTML? 20 De quand date le HTML? 20 Écrire son propre code HTML 22

INTERNET est un RESEAU D ORDINATEURS RELIES ENTRE EUX A L ECHELLE PLANETAIRE. Internet : interconnexion de réseaux (anglais : net = réseau)

Sage 100 CRM - Guide de la Fusion Avancée Version 8. Mise à jour : 2015 version 8

Créer un site Web : mode d emploi Sous SPIP, avec le squelette «établissement» de l académie de Versailles

Tutoriel de formation SurveyMonkey

Tous les autres noms de produits ou appellations sont des marques déposées ou des noms commerciaux appartenant à leurs propriétaires respectifs.

Programmation Internet Cours 4

INCORPORER EXCEL EN LIGNE DANS UN FICHIER CRÉÉ AVEC L ÉDITEUR DE TEXTE 15 avril 2015

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Manuel utilisateur du CMS Anan6

Attaques de type. Brandon Petty

Spétechs Mobile. D e r n i è r e m i s e à j o u r : a o û t 2014

WEB & DÉVELOPPEMENT LES BASES DU WEB LE LANGAGE HTML FEUILLES DE STYLES CSS HISTORIQUE D INTERNET ET DU WEB LES DIFFÉRENTS LANGAGES

pas à pas prise en main du service sur le web Le Cloud

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

SPÉCIFICATIONS TECHNIQUES DES FORMATS PUBLICITAIRES

Des outils numériques simples et conviviaux!

Spécificités Techniques créations publicitaires

Notes pour l utilisation d Expression Web

Tutoriel Prise en Main de la Plateforme MetaTrader 4. Mise à jour : 7/09/

Création d un site Internet

TIC. Réseau informatique. Historique - 1. Historique - 2. TC - IUT Montpellier Internet et le Web

TD HTML AVEC CORRECTION

Modélisation PHP Orientée Objet pour les Projets Modèle MVC (Modèle Vue Contrôleur) Mini Framework

Nouveautés de la version moodle 2.7

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

Soyez accessible. Manuel d utilisation du CMS

Dans nos locaux au 98 Route de Sauve NÎMES. Un ordinateur PC par stagiaire, scanner, imprimante/copieur laser couleur

FTP : File TRansfer Protocol => permets d envoyer des gros fichiers sur un serveur (ou de télécharger depuis le serveur)

Mallette Métrologie Contrôle des spectrophotomètres

MAILING KOMPOZER... 2 CREEZ UNE PAGE... 2 FORMAT DE LA PAGE... 2 AJOUTER DU TEXTE SUR UNE PAGE... 4

guide d utilisation de showtime

Guide de démarrage Tradedoubler. Manuel éditeur / affilié

Failles XSS : Principes, Catégories Démonstrations, Contre mesures

Transcription:

DOM Michel Gagnon École Polytechnique de Montréal 1

Ce qui se passe lorsqu un document HTML est chargé 1. Déclenchement du processus de construction du DOM (Document Objet Model) 2. Quand une balise <script> est rencontrée, la construction du DOM est interrompue pour charger et exécuter le script (sauf s il y a présence de l attribut async ou defer) 3. Les scripts asynchrones (avec l attribut async) sont téléchargés et exécutés dès que possible, mais en attendant on continue la construction du DOM 4. Quand le DOM est construit, les scripts déclarés avec l attribut defer sont exécutés 5. Il se peut, à ce stage, qu il reste encore des éléments à télécharger, comme des images. Quand tout est téléchargé, le navigateur déclenche un événement load 2

DOM Fournit une représentation structurée (sous forme d objets) d un document HTML Le DOM contient les items suivants: Nœuds (classe Node): tous les items qui forment l arborescence du document HTML (chaque nœud, sauf la racine, a donc un parent) Événements (classe Event) 3

DOM Les nœuds qui composent le DOM implémentent une des interfaces suivantes: Element: il s agit d un élément du document, correspondant à une balise HTML Text: il s agit du texte délimité par une balise Les nœuds forment un arbre dont la racine est l objet document 4

Exemple d arbre DOM <html> <head> <title>un document </title> </head> <body> <h1>titre</h1> Allo <p>bla <strong>bla</strong> bla</p> </body> </html> document <Element> tagname: html <Element> tagname: head <Element> tagname: body <Element> tagname: title <Element> tagname: h1 <Text> nodevalue : Allo <Element> tagname: p <Text> nodevalue : Un document <Text> nodevalue : Titre <Text> nodevalue : Bla <Element> tagname: strong <Text> nodevalue : bla <Text> nodevalue : bla 5

Hiérarchie des interfaces du DOM Node Attr CharacterData Element Document Text Comment HTMLElement HTMLDocument HTMLHeadElementª HTMLBodyElementª HTMLTitleElementª HTMLInputElementª ETC. 6

Hiérarchie des interfaces du DOM Node Attr CharacterData Element Document Text Comment HTMLElement HTMLDocument HTMLHeadElementª HTMLBodyElementª HTMLTitleElementª HTMLInputElementª textcontent ETC. Note: les propriétés en rouge sont accessibles seulement en lecture 7

Hiérarchie des interfaces du DOM Node Attr CharacterData Element Document Text Comment HTMLElement HTMLDocument HTMLHeadElementª HTMLBodyElementª HTMLTitleElementª HTMLInputElementª ETC. 8

DOM (API par nœuds) document previoussibling <Element> tagname: html textcontent = "Titre Ballo la bla bla" nodename = "body" nodetype = 1 <Element> tagname: head <Element> tagname: body parentnode <Element> tagname: title <Element> tagname: h1 <Text> nodevalue : Allo <Element> tagname: p lastchild firstchild <Text> nodevalue : Un document <Text> nodevalue : Titre <Text> nodevalue : Bla <Element> tagname: strong <Text> nodevalue : bla nextsibling <Text> nodevalue : bla nextsibling 9

Hiérarchie des interfaces du DOM Node Attr CharacterData Element childelementcount children Document firstelementchild id innerhtml lastelementchild nextelementsibling previouselementsibling tagname Text Comment HTMLElement HTMLDocument HTMLHeadElementª HTMLBodyElementª HTMLTitleElementª HTMLInputElementª ETC. Note: les propriétés en rouge sont accessibles seulement en lecture 10

Hiérarchie des interfaces du DOM Node Attr CharacterData Element Document Text Comment HTMLElement HTMLDocument HTMLHeadElementª HTMLBodyElementª HTMLTitleElementª HTMLInputElementª ETC. 11

DOM (API par éléments) document <Element> tagname: html innerhtml = <h1>titre</h1> Allo <p> </p>" tagname = "body" childelementcount = 2 <Element> tagname: head previouselemntsibling <Element> tagname: body <Element> tagname: title <Element> tagname: h1 <Text> nodevalue : Allo <Element> tagname: p lastelementchild firstelementchild <Text> nodevalue : Un document <Text> nodevalue : Titre <Text> nodevalue : Bla <Element> tagname: strong <Text> nodevalue : bla <Text> nodevalue : bla 12

Hiérarchie des interfaces du DOM Attr CharacterData Node Element contenteditable dataset draggable hidden lang style Document title Text Comment HTMLElement HTMLDocument HTMLHeadElementª HTMLBodyElementª HTMLTitleElementª HTMLInputElementª ETC. 13

Hiérarchie des interfaces du DOM Node Attr CharacterData Element Document Text Comment HTMLElement HTMLDocument HTMLHeadElementª HTMLBodyElementª HTMLTitleElementª HTMLInputElementª ETC. 14

Propriété style Cette propriété est associée à des déclarations enligne CSS qui indiquent la présentation de l élément Si on utilise cet attribut pour fixer des valeurs de propriété, elles seront au niveau «en-ligne» dans la cascade CSS Ce n est pas cette propriété qu il faut utiliser pour connaître le style d un élément, puisqu elle ne concerne que les déclarations en-ligne (utiliser plutôt la méthode getcomputedstyle() de l objet window) 15

Propriété dataset Il s agit d un objet qui contient tous les attributs fixés par la forme data-*, dans la balise correspondant à l élément Pour chacune des occurrences, il y a une propriété associée à dataset, dont le nom correspond à tout ce qui vient après «data-», sans les tirets, et où tout caractère qui succède à un tiret est mis en majuscule 16

Propriété dataset - exemple <div id="user" data-ident="123456" data-user="mg" data-date-of-birth> Michel Gagnon </div> var el = document.queryselector('#user'); // Fixer la date de naissance el.dataset.dateofbirth = '1999-01-01'; // On ajoute une nouvelle propriété el.dataset.autresdonnees = mesdonnées ; document.write('<ul>'); document.write('<li>' + el.dataset.ident + '</li>'); document.write('<li>' + el.dataset.user + '</li>'); document.write('<li>' + el.dataset.dateofbirth + '</li>'); document.write('<li>' + el.dataset.autresdonnees + '</li>'); document.write('</ul>'); el.dataset.ident = '123456 el.dataset.user = mg el.dataset.dateofbirth = 17

Hiérarchie des interfaces du DOM Node Attr CharacterData Element Document Text Comment HTMLElement HTMLDocument stylesheets HTMLHeadElementª HTMLBodyElementª HTMLTitleElementª HTMLInputElementª ETC. Note: les propriétés en rouge sont accessibles seulement en lecture 18

Hiérarchie des interfaces du DOM Node Attr CharacterData createattribute() createcomment() createdocumentfragment() createelement() Element Document Text Comment HTMLElement HTMLDocument createtextnode() HTMLHeadElementª HTMLBodyElementª HTMLTitleElementª HTMLInputElementª ETC. 19

Hiérarchie des interfaces du DOM Node Attr CharacterData Element Document Text Comment HTMLElement HTMLDocument HTMLHeadElementª HTMLBodyElementª HTMLTitleElementª HTMLInputElementª ETC. 20

Hiérarchie des interfaces du DOM Node Attr CharacterData Element Document Text Comment HTMLElement HTMLDocument HTMLHeadElementª HTMLBodyElementª HTMLTitleElementª HTMLInputElementª ETC. 21

Objet window Propriétés: console fullscreen history Méthodes: alert() close() confirm() getcomputedstyle() 22

Objet History Contient les URL visitée par l utilisateur durant la session Attributs: Length Méthodes: back() et forward() go() pushstate() et replacestate() 23

Manipulation du DOM Exemple <html> <script> // lancer cette fonction quand le document est chargé window.onload = function() { // crée quelques éléments dans // une page HTML pour l'instant vide heading = document.createelement("h1"); heading_text = document.createtextnode("grand titre"); heading.appendchild(heading_text); document.body.appendchild(heading); } </script> </html> 24

Interface NodeList Certaines méthodes, comme getelementsbyclass(), retournent une collection d éléments, qui sont contenus dans un objet de type NodeList On peut accéder à chaque élément contenu individuellement, avec l opérateur [], comme si c était un tableau Attention: très souvent ce conteneur est «vivant», c est-àdire que des changements dans le DOM seront reflétés dans la collection Le conteneur retourné par queryselectorall() n est pas «vivant» 25

Exemple de NodeList vivant <!doctype html> <html> <head> <meta charset="utf-8"> <title>exemple simple DOM</title> <script> window.onload = function() { paragraphes = document.getelementsbytagname('p'); alert(paragraphes.length); nouveauparagraphe = document.createelement('p'); nouveauparagraphe.textcontent = "Dernier paragraphe"; document.body.appendchild(nouveauparagraphe); alert(paragraphes.length); } </script> </head> <body> <p> Premier paragraphe</p> <p> Deuxième paragraphe</p> <p> Troisième paragraphe</p> </body> </html> 26

Exemple de NodeList vivant <!doctype html> <html> <head> <meta charset="utf-8"> <title>exemple simple DOM</title> <script> window.onload = function() { paragraphes = document.getelementsbytagname('p'); alert(paragraphes.length); nouveauparagraphe = document.createelement('p'); nouveauparagraphe.textcontent = "Dernier paragraphe"; document.body.appendchild(nouveauparagraphe); alert(paragraphes.length); } </script> </head> <body> <p> Premier paragraphe</p> <p> Deuxième paragraphe</p> <p> Troisième paragraphe</p> </body> </html> 27

Exemple de NodeList vivant <!doctype html> <html> <head> <meta charset="utf-8"> <title>exemple simple DOM</title> <script> window.onload = function() { paragraphes = document.queryselectorall('p'); alert(paragraphes.length); nouveauparagraphe = document.createelement('p'); nouveauparagraphe.textcontent = "Dernier paragraphe"; document.body.appendchild(nouveauparagraphe); alert(paragraphes.length); } </script> </head> <body> <p> Premier paragraphe</p> <p> Deuxième paragraphe</p> <p> Troisième paragraphe</p> </body> </html> 28

Exemple de NodeList vivant <!doctype html> <html> <head> <meta charset="utf-8"> <title>exemple simple DOM</title> <script> window.onload = function() { paragraphes = document.queryselectorall('p'); alert(paragraphes.length); nouveauparagraphe = document.createelement('p'); nouveauparagraphe.textcontent = "Dernier paragraphe"; document.body.appendchild(nouveauparagraphe); alert(paragraphes.length); } </script> </head> <body> <p> Premier paragraphe</p> <p> Deuxième paragraphe</p> <p> Troisième paragraphe</p> </body> </html> 29

Événements Chaque événement a un nom: click, change, load, mouseover, etc. Chaque événement a une cible (target), soit l élément sur lequel il a été déclenché Il faut associer à chaque événement une fonction qui sera appelée lorsque celui-ci sera déclenché (gestionnaire d événement) Trois manières d associer un gestionnaire d événement à un élément: Le spécifier directement dans la balise (déconseillé) L associer à un attribut de l élément (onclick, onchange, onload, onmouseover, etc) (pas très conseillé) Utiliser la méthode addeventlistener() qui, contrairement à la méthode précédente, permet d ajouter plusieurs gestionnaires à un événement 30

Événements (suite) Le gestionnaire reçoit en paramètre un objet de type Event qui fournit de l information sur l événement (notamment, la cible) L événement est propagé dans les éléments englobant celui qui l a déclenché Certains événements ont une action par défaut qui leur est associée: Clic sur un hyperlien: se déplacer à l URL indiquée Clic sur bouton de type submit: envoyer au serveur les données d un formulaire 31

Interface Event Propriétés: bubbles : indique si l événement doit être propagé target : l élément sur lequel l événement a été déclenché type : le nom de l événement Méthodes: preventdefault(): annule l événement stoppropagation(): interrompt la propagation de l événement Certains événements ont aussi une propriété relatedtarget, qui identifie un élément secondaire (par exemple, pour un événement mouseover, ce sera l élément d où provient la souris) Selon le type spécifique d événement, d autres propriétés peuvent apparaître 32

Sources d événements Événements définis par DOM niveau 3 (W3C spec) Événements associés à des API de HTML5 Manipulation tactile d appareils mobiles 33

Événements de formulaires submit et reset Différents types d événement selon le type d input inputevent lancé chaque fois que le contenu d un input textarea est modifié 34

Événements de fenêtre Le plus important est load, lancé quand toute la page et ses ressources additionnelles sont chargées et affichées Autres événements: unload, beforeunload focus, blur resize, scroll 35

Événements de souris Déclenchés par l élément le plus imbriqué parmi ceux qui se trouvent sous la souris Contiennent des propriétés supplémentaires indiquant la position de la souris et l état des boutons Exemples: mousemove, mousedown, mouseup, click, dblclick, mouseover, mouseout Remarques sur mouseout et mouseover: L événement a une propriété relatedtarget pour indiquer l élément d où on vient (ou celui où l on va) La propagation nous oblige à vérifier si l élément en question est réellement celui qui nous intéresse 36

Événements de clavier Ils sont associés à l élément qui a le focus et ils sont propagés aux objets document et window Événements de bas niveau: keydown et keyup Si la touche de clavier correspond à un caractère, on a en plus un événement keypress, qui spécifie le caractère en question 37

Événements du DOM (niveau 3) focusin et focusout, sont des alternatives à focus et blur, mais qui se propagent mouseenter et mouseleave sont des alternatives à mouseover et mouseout, mais qui ne se propagent pas keypress a les attributs supplémentaires key et char Événement textinput, qui contient les propriétés suivantes: data, qui contient le texte entré inputmethod, qui identifie la manière dont le texte a été entré (clavier, copier/coller, drop, etc.) 38

Événements de HTML5 Événements associés aux balises <audio> et <video>: canplay, playing, pause, etc. Événements associés à l API drag and drop: dragstart, drag, dragenter, dragend, drop, ended, etc. Gestion de l historique: hashchange, popstate Applications hors-ligne: cached, checking, downloading, progress, etc. Gestion du stockage local: storage 39

CAPTURE Propagation d événements Le gestionnaire d événement est attaché ici 1 2 3 inclus dans inclus dans 4 5 PROPAGATION 40

Assignation d un gestionnaire d événement element.addeventlistener(événement,gestionnaire,capture) 41

Assignation d un gestionnaire d événement element.addeventlistener(événement,gestionnaire,capture) Élément du DOM auquel on veut assigner le gestionnnaire 42

Assignation d un gestionnaire d événement element.addeventlistener(événement,gestionnaire,capture) type d événement (click, mouseover, etc.) 43

Assignation d un gestionnaire d événement element.addeventlistener(événement,gestionnaire,capture) Une fonction qui représente le gestionnaire d événement (qui sera exécutée chaque fois que l événement sera déclenché 44

Assignation d un gestionnaire d événement element.addeventlistener(événement,gestionnaire,capture) true si on on veut que le gestionnaire soit exécuté lors de la phase de capture, false s il doit être exécuté lors de la phase de propagation 45

Gestionnaire associé à un attribut on* Un seul gestionnaire peut être associé à un élément par cette méthode Si le gestionnaire retourne false, quand il est appelé, le comportement par défaut sera annulé 46

Exemple - événement click img { border: solid red 1px; } function fixerlargeur(largeur) { document.getelementbyid("img1").style.borderwidth = largeur + "px"; } var boutonagrandir = document.queryselector('#boutonagrandir'); var boutonreduire = document.queryselector('#boutonreduire'); boutonagrandir.addeventlistener('click', function(event){ fixerlargeur(20); }, false); boutonreduire.addeventlistener('click', function(event){ fixerlargeur(5); }, false); <body> <p> <img id="img1" src="logopoly.jpeg" width="480" height="240" alt="logo Poly"> </p> <form name="unformulaire"> <input id="boutonagrandir" type="button" value="agrandir la bordure à 20px" /> <input id="boutonreduire" type="button" value="réduire la bordure à 5px" /> </form> </body> 47

Exemple - événement click img { border: solid red 1px; } function fixerlargeur(largeur) { document.getelementbyid("img1").style.borderwidth = largeur + "px"; } var boutonagrandir = document.queryselector('#boutonagrandir'); var boutonreduire = document.queryselector('#boutonreduire'); boutonagrandir.addeventlistener('click', function(event){ fixerlargeur(20); }, false); boutonreduire.addeventlistener('click', function(event){ fixerlargeur(5); }, false); <body> <p> <img id="img1" src="logopoly.jpeg" width="480" height="240" alt="logo Poly"> </p> <form name="unformulaire"> <input id="boutonagrandir" type="button" value="agrandir la bordure à 20px" /> <input id="boutonreduire" type="button" value="réduire la bordure à 5px" /> </form> </body> 48

Exemple -propagation table { border: 1px solid red; font-size: xx-large; } #col1 { background-color: pink; } function gestionnaire(e) { col2 = document.getelementbyid("col2"); col2.innerhtml = "Allo"; e.stoppropagation(); alert("propagation de l'événement interrompue"); } window.onload = function () { elem = document.getelementbyid("ligne1"); elem.addeventlistener("click",gestionnaire, false); elem = document.getelementbyid("tableau"); elem.addeventlistener("click",function(e) {alert('coucou!');}, false); } <body> <table id="tableau"> <tr id="ligne1"><td id="col1">cliquez ICI</td></tr> <tr id="ligne2"><td id="col2">cliquez ICI AUSSI</td></tr> </table> </body> 49

Exemple -propagation table { border: 1px solid red; font-size: xx-large; } #col1 { background-color: pink; } function gestionnaire(e) { col2 = document.getelementbyid("col2"); col2.innerhtml = "Allo"; e.stoppropagation(); alert("propagation de l'événement interrompue"); } window.onload = function () { elem = document.getelementbyid("ligne1"); elem.addeventlistener("click",gestionnaire, false); elem = document.getelementbyid("tableau"); elem.addeventlistener("click",function(e) {alert('coucou!');}, false); } <body> <table id="tableau"> <tr id="ligne1"><td id="col1">cliquez ICI</td></tr> <tr id="ligne2"><td id="col2">cliquez ICI AUSSI</td></tr> </table> </body> 50

Exemple -propagation table { border: 1px solid red; font-size: xx-large; } #col1 { background-color: pink; } function gestionnaire(e) { col2 = document.getelementbyid("col2"); col2.innerhtml = "Allo"; e.stoppropagation(); alert("propagation de l'événement interrompue"); } window.onload = function () { elem = document.getelementbyid("ligne1"); elem.addeventlistener("click",gestionnaire, false); elem = document.getelementbyid("tableau"); elem.addeventlistener("click",function(e) {alert('coucou!');}, false); } <body> <table id="tableau"> <tr id="ligne1"><td id="col1">cliquez ICI</td></tr> <tr id="ligne2"><td id="col2">cliquez ICI AUSSI</td></tr> </table> </body> 51

Exemple -propagation table { border: 1px solid red; font-size: xx-large; } #col1 { background-color: pink; } function gestionnaire(e) { col2 = document.getelementbyid("col2"); col2.innerhtml = "Allo"; e.stoppropagation(); alert("propagation de l'événement interrompue"); } window.onload = function () { elem = document.getelementbyid("ligne1"); elem.addeventlistener("click",gestionnaire, false); elem = document.getelementbyid("tableau"); elem.addeventlistener("click",function(e) {alert('coucou!');}, false); } <body> <table id="tableau"> <tr id="ligne1"><td id="col1">cliquez ICI</td></tr> <tr id="ligne2"><td id="col2">cliquez ICI AUSSI</td></tr> </table> </body> 52

Exemple fenêtre modale function ouvrirmodale() { document.getelementbyid('fermermodale').onclick = fermermodale; document.getelementbyid('modale').style.display = 'inline-block'; document.getelementbyid('ouvrirmodale').onclick = null; } function fermermodale() { document.getelementbyid('ouvrirmodale').onclick = ouvrirmodale; document.getelementbyid('modale').style.display = 'none'; document.getelementbyid('fermermodale').onclick = null; } window.onload = function() { document.getelementbyid('ouvrirmodale').onclick = ouvrirmodale; } <body> <div><p>lorem.</p></div> <input type="button" value="montrer" id="ouvrirmodale"> <div id="modale"> <div id="modalecontenu"> <p>ceci est le contenu de la fenêtre modale.</p> <input type="button" id="fermermodale" value="fermer"> </div> </div> <div><p>lorem.</p></div> </body> Adapté de Larry Ullman, Modern JavaScript: Develop and Design 53

Exemple fenêtre modale #modale { display: none; position: absolute; left: 0px; top: 0px; width: 100%; height: 100%; background-color: rgba(160,160,160,0.9); } #modalecontenu { position: relative; width: 300px; margin: 15px auto; padding: 15px; background-color: #fff; border:1px solid #000; text-align: center; } <body> <div><p>lorem.</p></div> <input type="button" value="montrer" id="ouvrirmodale"> <div id="modale"> <div id="modalecontenu"> <p>ceci est le contenu de la fenêtre modale.</p> <input type="button" id="fermermodale" value="fermer"> </div> </div> <div><p>lorem.</p></div> </body> Adapté de Larry Ullman, Modern JavaScript: Develop and Design 54

function createpopup(e) { if (typeof e == 'undefined') { var e = window.event; } Exemple fenêtre contextuelle var target = e.target var popup = window.open(target.href, 'PopUp', 'height=200,width=300,top=100,left=100, location=no,resizable=yes,scrollbars=yes'); if ( (popup!== null) &&!popup.closed) { popup.focus(); return false; // Annule le comportement par défaut } else return true; } window.onload = function() { for (var i = 0, count = document.links.length; i < count; i++) { document.links[i].onclick = createpopup; } }; <body> <p><a href="popupa.html" id="link" target="popup">lien A</a> (S'ouvrira dans une nouvelle fenêtre)</p> <p><a href="popupb.html" id="link" target="popup">lien B</a> (S'ouvrira dans une nouvelle fenêtre)</p> </body> 55

function createpopup(e) { if (typeof e == 'undefined') { var e = window.event; } Exemple fenêtre contextuelle var target = e.target var popup = window.open(target.href, 'PopUp', 'height=200,width=300,top=100,left=100, location=no,resizable=yes,scrollbars=yes'); if ( (popup!== null) &&!popup.closed) { popup.focus(); return false; // Annule le comportement par défaut } else return true; } window.onload = function() { for (var i = 0, count = document.links.length; i < count; i++) { document.links[i].onclick = createpopup; } }; <body> <p><a href="popupa.html" id="link" target="popup">lien A</a> (S'ouvrira dans une nouvelle fenêtre)</p> <p><a href="popupb.html" id="link" target="popup">lien B</a> (S'ouvrira dans une nouvelle fenêtre)</p> </body> 56

jquery Bibliothèque Javascript pour simplifier la manipulation du DOM (entre autres) Grand avantage: le code devient automatiquement adapté à tous les navigateurs (IE8 inclus) Principe de base: des requêtes pour extraire les éléments qu on désire manipuler Ajoute aussi certaines fonctionnalités qui n existent pas dans le DOM 57

La fonction jquery() ou $() Elle est fondamentale: elle prend un argument et retourne un objet jquery sur lequel un grand nombre de manipulations peuvent être réalisées Très souvent, lorsque la requête correspond à plusieurs éléments, cet objet est une collection d items, qui se manipule comme un tableau On peut aussi exécuter une méthode sur cette collection d items, ce qui aura pour effet de l appliquer à chaque item de cette collection Exemples: Pour changer la couleur de fond de tous les paragraphes, on pourrait écrire ceci (ne faites pas ça dans votre application!): $( p ).css( background-color, #ccc ) Pour ajouter un gestionnaire de l événement click à tous les éléments ayant la classe cliquerpourcacher: $(.cliquerpourcacher ).click(function() { $(this).hide(); }); 58

Comment invoquer la fonction jquery() 1. On lui passe un sélecteur CSS Si on lui passe un élément comme second argument, la recherche se fera seulement dans cet élément et ses descendants 2. On lui passe un élément, l objet document ou l objet window: dans ce cas, il retourne un objet jquery qui englobe celui qui est passé en paramètre 3. On lui passe du code HTML On peut lui passer en second argument un objet qui indique les valeurs de certaines propriétés On peut aussi lui passer comme second argument un élément qui servira de contexte 4. On lui passe une fonction: celle-ci est exécutée lorsque la construction du DOM est terminée (on lui passe en argument le document) http://api.jquery.com/jquery/ 59

Comment itérer sur une collection d items Méthode each(): reçoit en paramètre une fonction qui sera appelée pour chaque item de la collection La fonction reçoit l indice de l item comme premier argument et l élément concerné comme second argument this représente aussi l élément concerné Si la fonction retourne false, l itération s arrête Itération implicite: beaucoup de méthodes itèrent de manière implicite sur tous les items: $( button ).click(function() { }) 60

Méthode map() Comme each(), elle reçoit en paramètre une fonction qui sera appelée sur tous les items de la collection Retourne une nouvelle collection qui contient tous les résultats obtenus par l application de la fonction à chaque item Exemple: $( div ).map(function() {return this.id; }).toarray().sort() 61

Méthode index() Si elle reçoit un élément DOM en paramètre, elle retourne l indice de cet élément Si elle reçoit un sélecteur CSS qui représente une collection jquery, elle retourne l indice du premier élément qui correspond à ce sélecteur 62

Méthode is() Prend un sélecteur CSS comme argument Retourne true si au moins un item de la collection correspond à ce sélecteur Exemple: $( div ).each(function() { if ($(this).is( :hidden )) return;}); :hidden est un sélecteur jquery 63

Manipulation des attributs La même méthode est utilisée pour lire la valeur courante et pour fixer une nouvelle valeur Lorsqu il s agit d une collection, l opération est appliquée à tous les items de la collection, s il s agit de fixer une nouvelle valeur S il s agit de lire la valeur courante, cela sera appliqué seulement sur le premier item On peut passer comme argument un objet pour fixer la valeur de plusieurs attributs Souvent, on peut aussi passer une fonction qui retournera la nouvelle valeur désirée: dans ce cas, elle sera appliquée à l item et recevra deux arguments (l indice de l item et sa valeur courante) 64

Méthodes de manipulation des attributs attr() css() addclass(), removeclass(), toggleclass() val() text() et html() width(), height(), innerwidth(), outerwidth(), data(), removedata() 65

Modification de la structure du document Ajout d éléments: append(), prepend(), before(), after(), replacewith() appendto(), prependto(), insertbefore(), insertafter(), replaceall() Copie d éléments: clone() Par défaut, ne copie pas les gestionnaires d événements attachés Enrobage: wrap(), wrapinner(), wrapall() Retrait d éléments: empty(), remove(), detach(), unwrap() 66

Événements en jquery Pour chaque événement du DOM, il y a une méthode (par exemple: click click() ) Ajouts: hover(): prend deux fonctions en argument, soit une pour mouseenter et une autre pour mouseleave toggle(): pour chaque clic, retire ou affiche l item en alternance toggleclass(): pour chaque clic, retire ou ajoute la classe en alternance Le gestionnaire reçoit en paramètre un objet correspondant à l événement (attributs de l objet: target, relatedtarget, which, type, pagex, pagey etc. ; méthodes: preventdefault(), stoppropagation() Si un gestionnaire retourne false, la propagation et le comportement par défaut sont éliminés 67

Événements «vivant» Supposons que le code suivant s exécute: $( a ).click(gestionnaire) Si d autres éléments <a> s ajoutent par la suite, le gestionnaire n y sera pas attaché Pour obtenir ce comportement, il faut utiliser la méthode delegate(): $(document).delegate( a, click,gestionnaire) Principe: lorsque la propagation atteint l élément sur lequel delegate() est appelé (le document, dans l exemple précédent), on détermine si la cible correspond au sélecteur et si c est le cas on exécute le gestionnaire sur cette cible 68

Animations en jquery Toute animation a une durée, spécifiée en ms L appel à une méthode d animation est asynchrone Souvent, on peut passer en second paramètre une fonction qui sera appelée lorsque l animation sera terminée 69

Animations Effets simples: fadein(), fadeout(), fadeto(), show(), hide(), toggle(), slidedown(), slideup(), slidetoggle() Méthode générique: animate() Reçoit comme premier paramètre un objet qui indique les valeurs finales désirées pour certaines propriétés CSS On peut préfixer les valeurs par "+=" ou "-=» pour spécifier une valeur relative 70

Méthodes de sélection On peut utiliser les sélecteurs CSS Ajout de pseudo-classes: :animated, :button, :checkbox, :contains(text), :eq(n), :even, :file, :first (ne pas confondre avec :first-child) :gt(n), :has(sel), :header, :hidden, :image, :input, :last, :lt(n), :odd, :parent, :password, :radio, :reset, :selected :submit, :text, :visible Exemple: $( p:nth-child(3):not(:has(a)) ) 71

Méthodes de sélection On peut aussi utiliser des méthodes de sélection définies par jquery Méthode slice(m,n): sélectionne les items des indices m à n Méthode filter(): sélectionne les items correspondant au critère passé en paramètre: Un sélecteur CSS Une autre collection jquery Une fonction prédicat (qui retourne une valeur booléenne) Méthode not() Méthode has() 72

Méthodes de sélection Méthode find(): cherche parmi les descendants de l item concerné Exemple: $( div ).find( a ) pour obtenir tous les éléments <a> inclus dans un <div> Méthodes children(), contents(), next(), prev(), nextall(), prevall(), siblings(), parents() 73

Méthodes de sélection Méthode end(): pour revenir à niveau précédent dans la chaîne Exemple: var divs = $( div ); var paras = divs.find( p ); paras.addclass( important ); divs.css( border, solid black 1pt ) est équivalent à ceci: $( div ).find( p ).addclass( important ).end().css( ) ou encore: $( div ).css( ).find( p ).addclass( important ) 74