PRÉSENTATION DE JAVASCRIPT 2E PARTIE - OPTION WEB MULTIMÉDIA - PEIP 2E ANNÉE CLAUDE BARRAS () - LIMSI

La page est créée Claudine Louis
 
CONTINUER À LIRE
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