interface
Transcription
interface
Intervention de Javascript grâce aux "événements" • Dans la perspective purement html, tout le travail d'interprétation d'un formulaire (y compris la détection d'erreurs et d'incohérences) est confiée au script CGI, lequel tourne sur le serveur et échappe donc au client. • Grâce à un système d'événements, on va pouvoir coupler le mécanisme des formulaires avec du code Javascript tournant chez le client. • L'intervention de Javascript va pemettre de garder une partie du contrôle des opérations au client : Par exemple, vérifier la validité du contenu d'un formulaire avant de l'envoyer au serveur. • Dans certains cas, on pourra se passer complètement du serveur... Evénements Constantine 2005 J.-F. Perrot 1 Événements en html/Javascript • D'une manière analogue aux événements de Windows exploités en Visual Basic et en Visual J++, on associe à différentes zones d'une page Web des événements exploitables par Javascript. Quelles zones ? Quels événements ? --> La plupart (mais pas toutes !) vont être des zones correspondant aux différents champs d'un formulaire... • La spécification d'une action sur événement s'écrit – à l'intérieur de la balise ouvrant la zone – sous la forme onévénement = "code Javascript" – le code en question peut renvoyer une valeur logique (vrai par défaut) qui conditionne la suite du calcul. Exemple : onclick = "alert('Gare aux coups !'); return true;" Evénements Constantine 2005 J.-F. Perrot 2 Nomenclature des événements html/Javascript • • • • Click MouseOver MouseOut Focus • • Blur select • • Submit Change • • Load UnLoad Evénements l'utilisateur clique dans la zone la souris entre dans la zone la souris sort de la zone pour un champ de formulaire, il devient activable id. devient inactivable pour un champ de formulaire un de ses éléments a été choisi pour un formulaire, on l'envoie pour un champ de formulaire, on a modifié son contenu une page vient d'être chargée une page vient d'être quittée Constantine 2005 J.-F. Perrot 3 Événements associés aux liens (links) • Les zones de lien sont le théâtre de trois événements : Click, MouseOver et MouseOut, traités par trois handlers onclick, onmouseover et onmouseout. • Si la valeur logique renvoyée par le handler onclick est faux, le lien n'est pas ouvert par le clic. Si la valeur logique renvoyée par le handler onmouseover est vrai, le lien n'est pas affiché au bas de la fenêtre. • Exemple : EssaiLink.html <a href="date.html" onmouseover = "return !confirm('Vraiment ?');" onmouseout= "return confirm('Vous renoncez ?');" onclick="return confirm('De\'cide\'ment ?');"> Saut dans l'inconnu</a> Evénements Constantine 2005 J.-F. Perrot 4 Lien 1 Pour répondre "non" à la première question (posée par onmouseover), il a fallu que la souris quitte la zone du lien. D'où la seconde question (posée par onmouseout) ... Evénements Constantine 2005 J.-F. Perrot 5 Lien 2 Cette fois, on a répondu "oui", en tapant "retour-chariot", donc sans bouger la souris de la zone du lien. La valeur renvoyée par le handler onmouseover est donc faux, ce qui provoque l'apparition de l'URL du lien dans la zone inférieure de la fenêtre. Evénements Constantine 2005 J.-F. Perrot 6 Lien 3 La souris restant sur la zone du lien, on clique, ce qui déclenche le handler onclick. Si dans la fenêtre de dialogue on clique sur "Annuler", la fenêtre questionnante disparaît, et rien d'autre ne se produit, puisque le handler a renvoyé faux, ce qui inhibe l'ouverture du lien - mais la zone du lien reste en rouge, car elle a été activée... Evénements Constantine 2005 J.-F. Perrot 7 Lien 4 Cette fois on a cliqué "OK" dans la fenêtre de dialogue lancée par le handler onclick, et le lien "date.html" a été dûment ouvert. Evénements Constantine 2005 J.-F. Perrot 8 Représentation de la page comme objet • La clé de la mise en œuvre de Javascript réside dans la représentation de la page et de ses composants comme "objets" Javascript. • Exemple 1 : quand on écrit document.write("bla...bla...") on envoie en fait un ordre write (méthode) à l'objet document • Exemple 2 : la ligne au bas de la fenêtre est connue de Javascript comme la propriété status de l'objet window. On peut donc la modifier depuis Javascript par une simple affectation : window.status = "bla...bla..." Evénements Constantine 2005 J.-F. Perrot 9 Désigner les "objets" par leur nom • Pour pouvoir agir sur les "objets" qui composent la page, il faut pouvoir les désigner. – Le cas des "objets standard" document et window est particulier. • La plupart des "objets" sont connus par un nom, qui leur est attribué sous la clé name dans la balise ouvrante. • Exemple avec des images : Le nom du fichier-source d'une image est une propriété ".src" de l'objet image, donc directement affectable - à condition de savoir désigner l'objet en question ! <a href = "" onmouseover='flip.src = "flip2.gif";' vert/noir onmouseout='flip.src = "flip1.gif";'> rouge/blanc <img name="flip" src="flip1.gif" width = "30" height = "30" alt = "" /> </a> Evénements Constantine 2005 J.-F. Perrot EssaiImg1.html 10 Représentation des formulaires comme "objets" Javascript noms des éléments • Un formulaire est constitué d'éléments dont chacun est à son tour un"objet". • Chaque élément est doté d'un nom (name), qui permet de l'identifier dans le formulaire. Sauf dans le cas des boutons radio, chaque élément du formulaire porte un nom différent des autres. Ne pas confondrce nom avec le texte "cosmétique" entourant l'élement ! • Syntaxe : Ce nom apparaît comme une propriété parmi d'autres dans le texte html de la balise qui crée l'élement : <input type="text" name="Entree" value="xxx" /> Il est accessible au code Javascript sous l'identificateur name. Il ne faut pas le modifier par programme ! Hélas Javascript ne fait que peu de contrôles à l'exécution... Evénements Constantine 2005 J.-F. Perrot 11 Représentation des formulaires comme "objets" Javascript propriétés des éléments • Chaque élément est doté d'un certain nombr /e de propriétés, (les variables d'instance de Java) dont – la plupart ont pour valeurs des chaînes de caractères – certaines sont à valeurs booléennes ou entières • Toutes ces propriétés sont accessibles au code Javascript (à condition de savoir désigner l'élément). • Certaines de ces propriétés sont modifiables par programme (affectationd'une valeur) ou par action de l'utilisateur : Click. • Les autres sont fixées dans le texte html de la balise créant l'élément : les tentatives de modification resteront sans effet. Si elles ne sont pas fournies, elles prennent une valeur par défaut ("" pour les chaînes). Evénements Constantine 2005 J.-F. Perrot 12 Représentation des formulaires comme "objets" Javascript événements et méthodes • Chaque élément est le siège de certains événements, (cf. la liste vue précédemment) auxquels il réagit comme indiqué dans les handlers correspondants. • En outre, chaque élément est capable d'exécuter certaines méthodes, qui ont pour effet de déclencher (simuler) certains des événements auxquels réagit l'élément en question. • On a ainsi deux manières d'activer un élément de formulaire : – par "action directe" (événement --> handler) – par programme (appel de méthode --> handler) Evénements Constantine 2005 J.-F. Perrot 13 Rappel : Les trois grande catégories d'éléments de formulaires Les éléments de formulaire se répartissent en trois catégories : • les input qui peuvent prendre des formes ("types") multiples ; <input type="..." name="nnn"...> • les select qui permettent de choisir dans une liste d'options ; <select name="nnn"> <option value="aaa">1</option> <option value="bbb">2</option> ... </select> • les textarea qui autorisent l'utilisateur à fournir un texte de plusieurs lignes. <textareaname="nnn" rows="rr" cols="cc"> texte par défaut </textarea> Evénements Constantine 2005 J.-F. Perrot 14 Rappel : Les différentes espèces ("types") d'éléments input • Les champs-texte (text fields) type="text" et leur variante les mots de passe type="password" • Les "boutons" (buttons) type="button" et leurs deux sous-espèces particulières – les réinitialiseurs (reset) type="reset" – les envoyeurs (submit) type="submit" • Les "boutons radio" (radio buttons) type="radio" • Les cases à cocher (checkboxes) type="checkbox" • Les champs cachés (hidden) type="hidden" Evénements Constantine 2005 J.-F. Perrot 15 <input type="text"...> alias "champ-texte" ou text field • Rappel : Propriétés (chaînes) : – name fixée dans la balise <input...name="leNom"...> – defaultvalue fixée dans la balise <input...value="laValeurInitiale"...> – value modifiable par affectation ! • handlers d'événements : onblur, onfocus, onchange, onselect • Méthodes : simulent trois des quatre événements ci-dessus – focus() – blur() – select() Evénements Constantine 2005 J.-F. Perrot 16 Exemple avec des champs texte <html> <head> <title>EssaiText</title> </head> <body> <p>Debut</p> <form> <p> Tapez ici : <input type= "text" name="Entree" onfocus='this.value = ""; Sortie1.value=""; Sortie2.value="";' onchange="Sortie1.value = this.value;" onselect="Sortie2.value = this.value;" /> </p> <p> Mais lisez ici ... <input type= "text" name="Sortie1" onfocus="this.blur();" /> </p> <p> ou ici : <input type= "text" name="Sortie2" onfocus="this.blur();" /> </p> </form> <p>Fin</p> </body> </html> L'effet de onfocus="this.blur();" est de protéger le champ contre l'écriture. Evénements Constantine 2005 J.-F. Perrot 17 Exemple avec des champs texte : essai Combien de clics... entre ces deux images ? Evénements Constantine 2005 J.-F. Perrot 18 <input type="password"...> alias "mot de passe" ou password • Propriétés, événements & méthodes :comme le champ texte, mais sans le handler onchange • Comportement : au lieu d'afficher la chaîne tapée par l'utilisateur, chaque caractère est remplacé par une étoile (ou par tout autre caractère anomyme). • Exemple : comme dans l'exemple précédent, avec : <input type= "password" name="Entree" onfocus='this.value = ""; Sortie1.value = ""; Sortie2.value ="";' onblur="Sortie1.value = this.value;" onselect="Sortie2.value = this.value;" /> • L'événement Blur pour un champ texte est assez voisin de Change... Evénements Constantine 2005 J.-F. Perrot 19 Essai de mot de passe Pouvez-vous reconstituer la séquence d'actions qui a conduit à cette situation, sachant qu'aucun caractère n'a été effacé ? Evénements Constantine 2005 J.-F. Perrot 20 <input type="button"...> alias "bouton" ou push button • Les champs-texte peuvent déclencher des actions via les événements Focus, Blur, Change et select. Mais ces déclenchements sont des sous-produits d'autres phénomènes, ce qui peut nuire à la clarté du code. • On peut donc préférer des instruments qui ne servent qu'à déclencher des actions : les boutons ! • Propriétés : – name (chaîne) fixée dans la balise <input...name="leNom"...> – value (chaîne) fixée dans la balise (apparaît sur le bouton) <input...value="uneChaine"...> • handlers d'événements : un seul onclick • Méthodes : une seule click() simulant l'événement Click. Evénements Constantine 2005 J.-F. Perrot 21 Exemple avec push button <html> <head> <title>EssaiBouton</title> </head> <body> <p>Debut</p> <form> <p> Ne tapez pas ici : <input type= "text" name="Entree" onfocus='value=""; this.blur(); Go.click()' /> </p> <p> Cliquez ... <input type= "button" name="Go" value="ici" onclick='Entree.value = prompt("Que voulez-vous dire ?",""); '></p> </form> <p>Fin</p> </body> </html> Evénements Constantine 2005 J.-F. Perrot 22 Essai de push button Cliquer dans le champ-texte ou sur le bouton donne le même résultat. Evénements Constantine 2005 J.-F. Perrot 23 <input type="reset"...> alias "bouton reset" • Rappel : Un bouton reset a en principe pour fonction de remettre l'ensemble du formulaire dans son état initial. • Il a les mêmes propriétés et fonctionnalités qu'un push button ordinaire : c'est un bouton avec un handler onclick par défaut qui réinitialise le formulaire. • Il est donc normalement unique dans le formulaire. • Mais on peut également redéfinir onclick pour déclencher d'autres actions, et utiliser plusieurs boutons reset ... Si les actions en question renvoient false, la réinitialisation standard est inhibée, et les reset deviennent alors indistinguables de push button ordinaires. Evénements Constantine 2005 J.-F. Perrot 24 Exemple avec reset <form> <p>Tapez ici : <input type= "text" name="Entree" onchange="Sortie1.value = this.value;" onselect="Sortie2.value = this.value;"/> </p> <p> Mais lisez ici ... <input type= "text" name="Sortie1" onfocus="this.blur();" /> </p> <p> ou ici : <input type= "text" name="Sortie2" onfocus="this.blur();" /> </p> <p> <input type= "reset" value="raz"> <input type= "reset" value="normaliser" onclick="Sortie1.value =Entree.value; Sortie2.value = Entree.value; return false;" > </p> </form> Evénements Constantine 2005 J.-F. Perrot 25 Exemple avec reset (essais) Evénements Constantine 2005 J.-F. Perrot 26 <input type="submit"...> alias "bouton submit" • Rappel : Un bouton submit a en principe pour fonction d'envoyer le contenu courant du formulaire au script CGI chargé de son exploitation. • Il a les mêmes propriétés et fonctionnalités qu'un push button ordinaire : c'est un bouton avec un handler onclick par défaut qui envoie le contenu du formulaire. • Il est donc normalement unique dans le formulaire. • Mais on peut également redéfinir onclick pour déclencher d'autres actions (vérifications...), et utiliser plusieurs boutons submit ... Il est plus difficile d'inhiber l'expédition standard est, et de rendre ainsi les submit (comme les reset) indistinguables de push button ordinaires (voir les objets formulaires). Evénements Constantine 2005 J.-F. Perrot 27