PRÉSENTATION DE JAVASCRIPT 2E PARTIE - OPTION WEB MULTIMÉDIA - PEIP 2E ANNÉE CLAUDE BARRAS () - LIMSI
←
→
Transcription du contenu de la page
Si votre navigateur ne rend pas la page correctement, lisez s'il vous plaît le contenu de la page ci-dessous
Présentation de JavaScript 2e partie Option Web Multimédia - PeiP 2e année Claude Barras (claude.barras@u-psud.fr) Polytech Paris-Sud septembre 2018 C. Barras (LIMSI) 1/29
Le DOM Plan Le DOM Evénements et timers Mise en pratique C. Barras (LIMSI) 2/29
Le DOM Le DOM Représentation du document en mémoire I Le document (X)HTML est structuré de manière arborescente. I Chaque noeud de cet arbre correspond aux balises de début et fin d’un élément. I JavaScript permet d’explorer et modifier la structure du document en mémoire par l’intermédiaire d’objets de type Node représentants les noeuds. I Application du DOM (Document Object Model) Exemple (déjà vu) d’accès à un noeud I HTML: I JavaScript: node = document.getElementById("dessin");` C. Barras (LIMSI) 3/29
Le DOM La classe ‘Node’ Propriétés I nodeType: document, élément, texte, commentaire. . . I nodeName: nom de l’élément (par ex. img) I nodeValue: valeur du contenu d’un élément texte I attributes[] tableau (en lecture) des attributs d’un élément I childNodes[] tableau (en lecture) des noeuds enfants I firstChild: premier enfant du noeud I lastChild: dernier enfant du noeud I parentNode: noeud-père I ownerDocument: document dont dépend le noeud C. Barras (LIMSI) 4/29
Le DOM La classe ‘Node’ (2) Méthodes I appendChild(node): insère un noeud dans l’élément courant. I removeChild(node): retire un noeud des fils de l’élément courant (le noeud n’est pas détruit) I cloneNode(bool): clone le noeud courant (récursivement ou pas) Propriétés-attributs I Les noeuds qui représentent les éléments disposent en plus de propriétés du nom des attributs de la balise: n = document.getElementById("dessin"); n.src = "new.png"; n.style.left = "10px"; C. Barras (LIMSI) 5/29
Le DOM La classe ‘Document’ La classe Document I hérite de la classe Node I représente le noeud racine de l’arborescence d’un document Méthodes I createElement(nom): crée un élément avec le nom de balise I addEventListener(type,callback,bool): ajouter un gestionnaire d’événement au document I getElementById(id): noeud d’attribut id correspondant à la valeur ou null I getElementsByTagName(nom): tableau d’éléments du nom spécifié C. Barras (LIMSI) 6/29
Le DOM Le document HTML La classe HTMLDocument I hérite de la classe. . . Document! Propriétés pour un document HTML I body: raccourci vers le noeud du corps du document HTML I cookie: associés au document I title: titre du document I URL: adresse du document Variable document I par commodité, la variable document représente la racine du document HTML courant en JavaScript: document.body.appendChild(n); C. Barras (LIMSI) 7/29
Le DOM Exemple de création d’un élément Créer une nouvelle image I // Creation de l'objet image (encore invisible) var img = document.createElement("img"); // NB on peut aussi écrire directement var img = new Image(); // // Definition des attributs et style img.src = "figure.png"; img.style.position = "absolute"; img.style.left = "10px"; // // Affichage dans la page document.body.appendChild(img); C. Barras (LIMSI) 8/29
Le DOM Manipulation des images Modifier une image I img = document.getElementById("monImage"); img.src = "nouveauFichier.png"; Positionner et déplacer une image I img.style.position = "absolute"; img.style.left = "40px"; img.style.top = "10px"; I la valeur de style est une chaîne de caractère; attention à bien préciser les unités, sans espace avant. I cela ne donne pas accès aux valeurs définies dans le CSS Pieges I img.style.left += 10; I concaténation de chaine de caractères => valeur: “40px10” I comparaison de chaînes de caractères: “100px” < “40px” !!! C. Barras (LIMSI) 9/29
Le DOM Manipulation des images (2) Faire apparaitre/disparaître un élément I img1.style.visibility = "visible"; img2.style.visibility = "hidden"; Placer une image devant une autre I img1.style.zIndex = 1; img2.style.zIndex = 2; I propriété zIndex: valeur plus élevée placée au-dessus I attention, le nom est différent en HTML/CSS (z-index) C. Barras (LIMSI) 10/29
Le DOM La fenêtre courante La classe Window représente une fenêtre ou un onglet du navigateur I l’objet window de l’onglet courant est le contexte d’exécution JavaScript I nos ‘variables globales’ sont en fait des attributs de cet objet Propriétés I document : document contenu dans la fenêtre I window/self : auto-référence Méthodes I alert()/prompt(): affiche ou lit une chaîne de caractères dans une boîte de dialogue I setInterval()/setTimeout(): programme l’exécution de code C. Barras (LIMSI) 11/29
Evénements et timers Plan Le DOM Evénements et timers Mise en pratique C. Barras (LIMSI) 12/29
Evénements et timers Evénements Interactions avec l’utilisateur I les actions de l’utilisateur déclenchent des événements I le document web peut y réagir au moyen d’écouteurs qui s’ “abonnent” à certains types d’événements I ce sont des fonctions JavaScript qui vont être appelées automatiquement lorsque l’événement se produit Catégories d’événements I touches clavier, boutons et mouvements de souris I actions de formulaires I vie du document ou des images C. Barras (LIMSI) 13/29
Evénements et timers Evénements du document Document ou image I (on)load: après chargement de la page ou de l’image I (on)unload: en quittant la page I (on)abort: chargement de l’image interrompu I (on)error: erreur de chargement (image ou objet) Intégration avec HTML I de nombreux éléments HTML ont des attributs du type onXXX="script" (onload, onerror, onclick, onkeypress. . . ) I associe le lancement d’un script-écouteur à un événement C. Barras (LIMSI) 14/29
Evénements et timers Exécution de code au chargement de la page Enregistrement d’une fonction d’initialisation I var e; // l'element "im1" n'existe pas encore function init() { e = document.getElementById("im1"); } C. Barras (LIMSI) 15/29
Evénements et timers Fonctions de gestion des événements Mieux vaut éviter de mélanger JavaScript et HTML! Equivalent JavaScript de l’attribut HTML onload I Rappel : lancer une fonction après chargement de la page window.onload = function() { ... } Gestionnaire moderne des événements I La méthode addEventListener est la plus générale I elle peut s’appliquer au document ou à des éléments individuels (images. . . ) window.addEventListener('load', init, false); window.addEventListener('keypress', clavier, false); e.addEventListener('click', anime, false); C. Barras (LIMSI) 16/29
Evénements et timers Evénements formulaires Evénements I (on)submit: envoi du formulaire (annulé si retourne ‘false’) I (on)reset: réinitialisation I (on)change: modification d’un champ I (on)select: sélection dans un champ texte Exemple de validation de formulaire I function valider() { if (document.getElementById("nom").value == "") { alert('Vous devez indiquer le nom'); return false; } } HTML I C. Barras (LIMSI) 17/29
Evénements et timers Evénements souris - Principes Bouton de souris I (on)mousedown: pression du bouton de la souris I (on)click: appui et relâchement du bouton souris I (on)dblclick: double-clic de souris (interfère avec onclick) I (on)mouseup: relâchement du bouton de la souris Déplacement de la souris I (on)mouseover: entrée du curseur dans l’élément I (on)mouseout: sortie du curseur de l’élément I (on)mousemove: déplacement de la souris (coûteux!) C. Barras (LIMSI) 18/29
Evénements et timers Evénements souris - Position de la souris Spécificités JavaScript I HTML: I DOM: propriétés ‘clientX/clientY’ avec offset possible Code JavaScript function follow(e) { alert("Clic en "+e.clientX+" " +e.clientY); } C. Barras (LIMSI) 19/29
Evénements et timers Evénements clavier - Principes Séquence des événements I (on)keydown: enfoncement de la touche I (on)keypress: envoi du caractère (à l’enfoncement puis à chaque répétition) I (on)keyup: relâchement de la touche Propriétés de l’événement I type: type de l’événement (‘keypress’. . . ) I keyCode: code de la touche (pour keydown/up) I charCode: code du caractère (pour keypress) I altKey, ctrlKey, shiftKey: modificateurs associés C. Barras (LIMSI) 20/29
Evénements et timers Evénements clavier - Caractères et touches Correspondance entre code et caractère I On peut avoir besoin de convertir le code ASCII en caractère I JavaScript: String.fromCharCode(charCode) Quelques valeurs spéciales de keyCode backspace 8 page haut 33 tabulation 9 page bas 34 entrée 13 fin 35 ∗ I shift 16 début 36 contrôle∗ 17 flèche gauche 37 alt∗ 18 flèche haut 38 bloc. maj.∗ 20 flèche droite 39 échappement 27 flèche bas 40 ∗ ne déclenche pas d’événement keypress C. Barras (LIMSI) 21/29
Evénements et timers Evénements clavier - Filtrage de formulaire Limitation de la saisie aux chiffres I JavaScript function filtreChiffre(e) { if (e.keyCode == 8) return; // autorise backspace if (e.charCode < 48 || e.charCode > 57) return false; } I dans un formulaire HTML C. Barras (LIMSI) 22/29
Evénements et timers Evénements clavier - Gestion dynamique Pas de fonction pour connaître l’état des touches du clavier, il faut enregistrer les changements lorsqu’ils se produisent. . . Savoir à tout moment si une touche est enfoncée I var touche_gauche = false; // function appuie(e) { if (e.keyCode == 37) touche_gauche = true; } window.addEventListener('keydown', appuie, false); // function relache(e) { if (e.keyCode == 37) touche_gauche = false; } window.addEventListener('keyup', relache, false); C. Barras (LIMSI) 23/29
Evénements et timers Propagation des événements Quel est l’ordre de traitement des événements dans le document? I . . . ça dépend! Propagation I Modèle de base: les événements sont attachés à un seul élément I Modèle avancé: les événements se propagent dans la hiérarchie des éléments – en partant de la racine document (Netscape) – en remontant depuis l’élément (Microsoft) – dans les 2 sens (W3C) I Possibilité de bloquer la propagation – e.stopPropagation() C. Barras (LIMSI) 24/29
Evénements et timers Programmer une action Lancer l’exécution (répétitive ou non) d’un script ou d’une fonction Déclenchement après un timer I setTimeout("script",delai) programme l’exécution du script après un délai en millisecondes Action répétitive I var timer = setInterval("script",delai); répète le script avec un intervalle donné I clearInterval(timer); pour l’interrompre (il peut être nécessaire de définir timer en variable globale) Pièges I La fonction connaîtra les variables globales au moment de l’exécution! I Limiter le nombre de timers actifs C. Barras (LIMSI) 25/29
Evénements et timers Programmer une action - un exemple function bip() { alert("bip"); } Ce qui ne marche pas I le nom de la fonction est évalué setTimeout("bip", 1000); I ici, la fonction est exécutée immédiatement setTimeout(bip(), 1000); Ce qui marche I setTimeout(bip, 1000); Conseillé : création d’une fonction anonyme I setTimeout(function() { bip(); }, 1000); C. Barras (LIMSI) 26/29
Evénements et timers Programmer une action avec paramètre function bop(i) { alert(i); } Ce qui ne marche pas I la valeur de i change au moment de l’exécution for (i=1; i
Mise en pratique Plan Le DOM Evénements et timers Mise en pratique C. Barras (LIMSI) 28/29
Mise en pratique TP2 Animation dans un décor I récupérer le fichier perso.limsi.fr/barras/web/tp2.zip qui contient du code et les images d’un pingouin marchant à gauche et à droite, d’un arbre, de décor de forêt, un bloc de glace. . . I reprendre les fichiers tp2-base.html/css/js pour afficher et déplacer le pingouin dans le décor I gérer les déplacements vers la gauche et vers la droite I automatiser l’animation avec un timer I arrêter le déplacement aux extrémités du décor I ajouter des boutons pour contrôler le pingouin (à gauche, à droite, plus vite, stop) I permettre de contrôler le mouvement au clavier C. Barras (LIMSI) 29/29
Vous pouvez aussi lire