Professional Documents
Culture Documents
Squence 3
Contenu
1. Campons le dcor 2. Code javascript entre <body> et </body> 3. Code javascript entre <head> et </head> 4. Code javascript dans un fichier spar 5. La gestion des vnements utilisateur 6. Utilisation des valeurs contenues dans les contrles 7. Modification des lments dun document HTML 8. Syntaxe du langage javascript 9. La gestion des cookies 10. Et si on compltait notre site avec ce quon a appris ? 11. Conclusion
1.Campons le dcor
Voici ci-dessous, ce que vous avez pu lire, dans la squence 1, dans la partie traitant des scripts clients.
8 3950 TG PA 00
Squence 3
Initiation Javascript
Rappel : les sites dynamiques sont des sites dont les pages sont construites au moment de la visualisation laide dun programme sexcutant sur le serveur. Disons que les sites dont les pages contiennent du javascript sont plus anims que sils taient uniquement dcrits avec du HTML, et disons galement que les langages de script client permettent de dporter une partie des traitements sur le poste de linternaute. Lorsquon souhaite enrichir une page HTML laide dinstructions en javascript, les instructions sont dans le code de la page. Cest le navigateur de linternaute qui se charge dexcuter les instructions.
8 3950 TG PA 00
Squence 3
Initiation Javascript
Remarque
Dans ces deux premiers cas, on peut, mme lintrieur des balises <head> et </head> dune part, ainsi que des balises <body> et </body> dautre part, trouver plusieurs couples de balises <script language= "javascript"> et </script>. Il existe une troisime possibilit pour intgrer du code javascript dans un document HTML. En effet, on peut aussi crire du code javascript dans un fichier spar (dextension .js) et intgrer ce fichier dans le document HTML. On va aborder ces diffrentes possibilits ci-dessous.
<html> <head> <title>Structure gnrale dune page utilisant du javascript </title> </head> <body> <--Partie HTML de la page --> <script language="javascript"> <-- dclarations et instructions javascript --> </script> <--Suite de la description HTML de la page --> </body> </html>
83
8 3950 TG PA 00
Squence 3
Initiation Javascript
Si les instructions javascript sont places dans la partie <body>...</body> du document HTML, le navigateur excute les instructions javascript ds quil les rencontre.
Remarque
Lattribut language de la balise script sert indiquer quel est le langage de script utilis. Ce langage peut tre, entre autres, du javascript, du vbscript. Dans le cas o le langage de script utilis est le javascript, lattribut language est optionnel car le langage de script par dfaut est le javascript.
<html> <head> <title>essais javascript </title> </head> <body> <!--Partie HTML de la page --> Cette premire phrase fait partie de la description en HTML de la page.<br> <script language="javascript"> <!-- dclarations et instructions javascript --> alert (a par contre); alert ("cest du javascript"); document.write("Fin de la partie javascript.<br>"); </script> <!--Suite de la description HTML de la page --> Ce texte est aussi dans la partie HTML de la page. </body> </html>
Et hop! Ouvrez votre page dans votre navigateur. Waow!
8 3950 TG PA 00
84
Squence 3
Initiation Javascript
<html> <head> <title>essais javascript </title> </head> <body> <!--Partie HTML de la page --> Cette premire phrase fait partie de la description en HTML de la page.<br> <script language="javascript"> <!-- dclarations et instructions javascript --> var monNombre ; monNombre = 4 ; alert (monNombre vaut + monNombre); </script> <!--Suite de la description HTML de la page --> Ce texte est aussi dans la partie HTML de la page. </body> </html>
Remarque importante
Lors de la dclaration, on nindique pas le type des variables. Les variables prennent dynamiquement le type des valeurs quelles contiennent. Dans cet exemple, linstruction alert (monNombre vaut + monNombre); nous montre que, comme en algo, le signe + est utilis la fois pour laddition des nombres et la concatnation des chanes de caractres. Dans notre page de test, essayez maintenant de remplacer :
8 3950 TG PA 00
85
Squence 3
Initiation Javascript
Maintenant, testez cette fentre aprs avoir enregistr la modification. Vous avez vu, a marche plus !! Cela signifie que javascript est sensible la casse utilise pour les variables. Pour lui, la variable monNombre et la variable MonNombre ne sont pas la mme variable.
O Javascript est galement sensible la casse pour ses propres mots cls.
Exemple : lobjet document ne sera pas reconnu si vous lappelez Document . Des instructions comme if, while, for ne seront pas reconnues non plus si vous leur collez des majuscules. Il faut tre trs vigilant quand on na pas lhabitude dutiliser un langage de programmation sensible la casse.
<html> <head> <title>essais javascript </title> </head> <body> <!--Partie HTML de la page --> Cette premire phrase fait partie de la description en HTML de la page.<br> <script language="javascript"> <!-- dclarations et instructions javascript --> document.write("Dbut de la partie javascript.<br>"); saisie = prompt("Saisissez votre prnom : ", "Prnom"); document.write ("Vous vous appelez ", saisie, ".<br>"); </script> <!--Suite de la description HTML de la page --> Ce texte est aussi dans la partie HTML de la page. </body> </html>
Testez votre page. Maintenant, la place de
8 3950 TG PA 00
86
Squence 3
Initiation Javascript
Window.close( )
Enregistrez votre modif, puis rouvrez ou rafrachissez votre page. Moi, avant la fermeture de la page, jai un petit message de la part de mon navigateur, me demandant si je confirme la fermeture.
8 3950 TG PA 00
87
Squence 3
Initiation Javascript
Par contre, pour mettre en forme du texte lorsquon affiche des messages javascript (utilisation de alert ou prompt), il faut utiliser ce quon appelle des squences dchappement . Ce sont des combinaisons de touches qui indiquent javascript comment prsenter le texte des messages. Exemple : la squence dchappement \n permet dinsrer un saut de ligne dans le texte affich. Essayons linstruction suivante dans notre page de test :
Par contre, pour crire Dbut de la partie javascript , sur 2 lignes, laide de linstruction write, on ne peut pas utiliser \n, jutilise donc <br >. Pourquoi ? Parce que pour document.write, tout ce qui lui est pass en paramtre est du HTML.
<head> <title>...</title> <script language ="javascript"> function nomDeLaFonction(paramtresDeLaFonction) { // dclarations et instructions javascript de la fonction } </script> </head>
8 3950 TG PA 00
88
Squence 3
Initiation Javascript
Ensuite, on appelle cette fonction dans le corps de la page HTML, entre les balises <script language = "javascript"> et </script>, ou bien on lassocie un vnement provoqu par lutilisateur (par exemple, on associe la fonction crite en javascript lvnement click sur un bouton de formulaire).
3B. Un exemple
Cet exemple montre comment crire une fonction qui lve au carr le nombre pass en paramtre, et comment appeler cette fonction dans la partie <body>. Tapez ce code dans notre page de test.
<html> <head> <title> essais javascript </title> <!-- description de la fonction --> <script language= "javascript"> function carre(saisie) { <!-- laccolade ouvrante correspond au mot cl dbut de lalgo --> resultat = saisie * saisie <!-- linstruction return correspond au mot cl renvoyer de lalgo --> return resultat } <!-- laccolade fermante correspond au mot cl fin de lalgo --> </script> </head> <body> <script language="javascript"> saisie = prompt ("Saisir un nombre"); <!-- appel de la fonction et affichage du rsultat dans la page --> document.write ("Le rsultat est :", carre(saisie)); </script> </body> </html>
8 3950 TG PA 00
89
Squence 3
Initiation Javascript
<html> <head> <!-- Linstruction suivante indique quel fichier .js on veut intgrer --> <script src = "fichierJavaScript.js"></script> </head> <body> <script> <!-- dclarations et instructions javascript --> </script> </body> </html>
4B. Un exemple
Nous allons crer dans un fichier spar, fonction.js, une fonction, afficheDateHeure dont le rle sera dafficher la date et lheure. Ensuite, dans notre page de test, nous indiquerons que nous intgrons ce fichier fonction.js, puis nous appellerons la fonction afficheDateHeure. Voici le code source de la fonction. Il sagit donc du contenu du fichier fonction.js. Pour crer ce fichier, dans le bloc notes de windows, je tape le code source et jenregistre le fichier en lappelant fichier.js.
function afficheDateHeure( ) { // Dclaration des variables // La variable dateComplete va contenir la date systme, heures et minutes incluses var dateComplete; // La variable minutes est destine contenir les minutes var minutes; // La variable jour est destine contenir le jour de la date var jour; // La variable mois est destine contenir le mois de la date var mois;
8 3950 TG PA 00
90
Squence 3
Initiation Javascript
// Fin de la dclaration des variables // Dbut du traitement // Affectation de la date complte la variable dateComplete dateComplete = new Date() // On extrait les minutes de la date complte et on les affecte la variable // minutes
minutes = dateComplete.getMinutes(); // Si le nombre de minutes est sur un seul chiffre, on le formate en lui rajoutant // un zro if (minutes <= 9) minutes= "0"+ minutes; // On extrait le jour de la date complte et on laffecte la variable jour jour = dateComplete.getDate(); // Formatage ventuel du jour sur 2 chiffres if (jour < = 9) jour = "0" + jour; // On extrait le mois de la date complte et on laffecte la variable mois mois = dateComplete.getMonth() + 1 // formatage ventuel sur 2 chiffres if (mois <= 9) mois = "0" + mois; document.write ("Nous sommes le ",jour,"/",mois,"/",dateComplete.getYear()); document.write(" et il est ",dateComplete.getHours()," heures ",minutes," minutes.") }
Remarque
en javascript, on peut dclarer et initialiser chaque variable en une seule instruction. Dans le code ci-dessus, on aurait tout fait pu crire :
8 3950 TG PA 00
91
Squence 3
Initiation Javascript
var dateComplete; var minutes; var jour; var mois; dateComplete = new Date() minutes = dateComplete.getMinutes(); jour = dateComplete.getDate(); mois = dateComplete.getMonth() + 1;
Remarque
la cinquime ligne du code source prcdent, je n'ai pas mis de point virgule, et pourtant ce code source est correct car en javascript, le sparateur d'instructions est soit le point virgule, soit le saut de ligne. Voici maintenant le code de notre page de test. Tapez ce code puis ouvrez cette page dans votre navigateur pour la tester.
<HTML> <HEAD> <title> Appel dune fonction spare </title> <script language="javascript" src="fonction.js"> </script> </HEAD> <BODY> <center> <H3>Appel de la fonction qui affiche la date et lheure </H3><BR> <script language="javascript"> afficheDateHeure() </script> </center> </BODY> </HTML>
8 3950 TG PA 00
92
Squence 3
Initiation Javascript
Notez bien la majuscule Date, si vous ne la mettez pas, lexcution, vous avez un message derreur vous disant assez peu sympathiquement quil ne sait pas qui est date. Essayez dans le fichier fonction.js, de remplacer dateComplete = new Date() par dateComplete = new date(), vous verrez. La classe Date contient des mthodes qui permettent de manipuler la date systme, comme la mthode getFullYear() par exemple. Pour pouvoir appeler ces diffrentes mthodes de manipulation de la date systme, il faut avoir, au pralable, rang la date systme dans une variable. Dans notre exemple, cest linstruction dateComplete = new Date() qui a pour effet daffecter la date systme la variable dateComplete. Vous remarquerez que la syntaxe daffectation est assez particulire, puisquon utilise le mot cl new. Cest quil ne sagit pas dune affectation classique. La classe Date nest pas une fonction, ni une variable, mais une classe. L, on va faire un tout petit bout de thorie objet. Une classe, cest un peu comme un type structur (chapitre 7 du cours dalgo de premire anne). Lorsquon cre la classe, on dcrit quelles sont les informations quelle contient (ce quon appelle les champs propos des types structurs, et quon appelle les attributs ou proprits lorsquil sagit dune classe), mais, en plus, au moment o on dcrit la classe, on y dcrit les fonctions et les procdures permettant de manipuler les diffrents attributs. Les fonctions et procdures permettant de manipuler les attributs sappellent des mthodes. Si la classe est correctement dcrite, on ne peut pas manipuler directement ses attributs, on est oblig dutiliser les mthodes de la classe pour accder ses attributs. Exemple : dans le cas de la classe Date, on ne peut pas accder lanne de la date systme sans utiliser la mthode getFullYear(), la fonction qui renvoie lanne de la date systme. Lorsque les attributs dune classe ne sont accessibles que via les mthodes de la classe, on dit que ces attributs sont privs. Comme les mthodes font partie de la description de la classe, on dit quelles sont encapsules (sous-entendu encapsules dans la description de la classe). Revenons notre affectation dateComplete = new Date(). Il ne sagit pas dune affectation classique, do le mot cl new, mais de ce quon appelle une instanciation, cest--dire, la cration dune occurrence, dune instance, dun objet de la classe Date, par appel dune fonction spciale, crite dans la description de la classe, qui porte le nom de la classe, et qui sappelle, en thorie objet, un constructeur. Dans la plupart des cas, on ne peut pas utiliser les mthodes dune classe si on na pas dabord instanci cette classe, cest--dire cr une variable du type de la classe. Ici, linstruction dateComplete = new Date() a pour rle de doter lobjet dateComplete de tous les attributs avec, pour valeurs, les caractristiques de la date du jour, mais aussi de toutes les mthodes de la classe Date. Cette sorte daffectation (cest une instanciation) nous permet ensuite dutiliser toutes les mthodes de la classe Date pour manipuler les informations sur la date, contenues dans lobjet dateComplete. Lexemple de code javascript contenu dans le fichier fonction.js nous montre quelles sont les mthodes disponibles dans la classe Date.
8 3950 TG PA 00
93
Squence 3
Initiation Javascript
Une fois quon a affect sa valeur dateComplete laide de linstruction new Date(), on peut utiliser les mthodes getMinutes( ), getDate(), getMonth( ), getYear( ), getHours( ). Ces mthodes sont toutes des fonctions, puisquon range leur rsultat dans une variable. Vous remarquerez la syntaxe dappel de ces mthodes : nomDeLobjet.nomDeLaMthode. Exemple : dateComplete.getDate() Cette syntaxe signifie appelle la mthode getDate() sur lobjet dateComplete , autrement dit applique dateComplete le traitement dcrit dans getDate() . Mais alors, pourquoi, quand on utilise des instructions comme document.write, on na pas dabord instanci la classe Window par une instruction du type new Window() ? Il y a deux raisons possibles cela : un objet Window peut-tre automatiquement instanci par le navigateur au lancement de tout script javascript ; la classe Window est une classe spciale (dite statique), qui na pas besoin dtre instancie pour quon puisse utiliser ses membres (cest--dire ses attributs et ses mthodes).
8 3950 TG PA 00
94
Squence 3
Initiation Javascript
<body> <form > <input type = "button" value = "Clique-moi" onClick = "clicSurCliqueMoi()"> </form> </body> </html>
8 3950 TG PA 00
95
Squence 3
Initiation Javascript
... essai : <Input type = "text" value = "on teste" onChange = "test()"> ...
Enregistrez la modif puis ractualisez votre page dans votre navigateur.
8 3950 TG PA 00
96
Squence 3
Initiation Javascript
Faites le premier test suivant : cliquez dans la zone de texte, puis cliquez ailleurs sur la page. Rien ne se passe parce que vous navez pas modifi son contenu. Maintenant, retournez dans la zone de texte, modifiez son contenu, puis cliquez nouveau ailleurs sur la page. Et paf, notre beau message saffiche, parce quon a modifi ltat du contrle. On peut galement programmer cet vnement pour tout contrle pouvant changer dtat. checkbox et radio : dans ce cas, lorsque linternaute sort du contrle, si celui-ci nest pas dans le mme tat que lorsque linternaute y est entr, alors, lvnement onChange se produira. Si par contre, linternaute coche puis dcoche, ou bien dcoche puis coche le contrle, la sortie, le contrle sera dans le mme tat qu lentre, lvnement ne sera pas dclench. Faites les tests en remplaant tout btement text par checkbox et/ou radio dans la ligne de code de lexemple ci-dessus. select : dans ce cas, ds que linternaute choisit dans la liste autre chose que le choix dj fait (soit le choix par dfaut, soit un choix effectu prcdement par linternaute), lvnement est dclench. Exemple : essayez le code ci-dessous :
<Select name = "preference" onChange = "test()"> <option> les livres <option> les films <option> la musique </select>
</form>
Pour testez, faites les deux manips suivantes : slectionnez autre chose que les films. L, lvnement se dclenche ; ensuite, rafrachissez votre fentre, droulez la liste, mais slectionnez les films. L, lvnement ne se dclenche pas.
Remarque
Cet vnement ne sapplique pas aux button car linternaute na pas la possibilit de les faire changer dtat. Il ne sapplique pas non plus aux images ni aux liens.
8 3950 TG PA 00
97
Squence 3
Initiation Javascript
Exemple : faisons quelques tests pour bien comprendre cet vnement onFocus. Dans notre page de test, on sest arrt tester lvnement onChange sur les contrles select . Remplaons tout simplement :
essai :
Par :
essai :
et testons. Lvnement se dclenche la premire fois quon clique dans la liste, cest--dire lorsquelle reoit le focus. Si on clique ailleurs dans la page, rien ne se passe, et si on reclique dessus aprs avoir cliqu ailleurs, lvnement est nouveau provoqu. De mme, une fois que la liste a le focus, si on le lui retire en appuyant sur tab, puis quon lui redonne en appuyant nouveau sur tab, lvnement est nouveau dclench. Je vous laisse faire les tests de votre choix sur les autres contrles focusables . Inspirez-vous des exemples des paragraphes prcdents si vous ne voyez pas trop comment effectuer les tests.
Remarque
lexemple suivant ne fonctionne pas
8 3950 TG PA 00
98
Squence 3
Initiation Javascript
Exemples
Modifiez notre page de test comme suit
<html> <head> <title> Gestion des vnements utilisateur </title> <script language = "javascript"> function test( ) {alert("Evnement dclench") } </script> </head> <body> <form > <input type = "select" value = "Essai" onBlur = "test()"> </form> </body> </html>
...et ouvrez-la dans votre navigateur (aprs avoir enregistr les modifications de votre fichier .html). Cliquez dans la zone de texte, puis appuyez sur tab ou cliquez ailleurs dans la page pour provoquer la sortie de la zone de texte. Vous avez vu ? a marche!! Reprenez le code source de cet exemple et remplacez :
Remarque
lexemple suivant ne fonctionne pas
8 3950 TG PA 00
99
Squence 3
Initiation Javascript
8 3950 TG PA 00
100
Squence 3
Initiation Javascript
Exemple :
<frameset cols = "30%, *" onLoad = "test()"> <frameset rows = "50%,50%"> <frame src = "premierePage.htm"> <frame src = "imageTheme.jpg"> </frameset> <frame src = "deuxiemePage.htm"> </frameset>
Puis ouvrez la page. Normalement, notre merveilleux message vnement dclench devrait safficher ds que la page est affiche par le navigateur. Pour tester lvnement onLoad dans la balise body, reprenez notre page de tests sur javascript, et dans la balise body, rajoutez onLoad = "test()", puis ouvrez ou rafrachissez la page. Maintenant, pour tester onUnLoad, remplacez, dans les deux pages prcdentes, onLoad par onUnLoad, rafrachissez vos pages puis fermez-les.
<form onSubmit = "test()"> <input type = "select" value = "saisir"> <Input type = "submit" name = "monBoutonEnvoyer" value = "Envoyer"> <Input type = "reset" name = "monBoutonAnnuler" value = "Annuler"> </form>
Pour tester votre page, cliquez sur le bouton Envoyer, le message saffiche. Maintenant, pour tester lvnement onReset , modifiez le code source comme suit :
= "test()"> "select" value = "saisir"> "submit" name = "monBoutonEnvoyer" value = "Envoyer"> "reset" name = "monBoutonAnnuler" value = "Annuler">
Rafrachissez votre page puis cliquez sur le bouton Annuler. Ce sont ces vnements quon utilisera quand, avant denvoyer le formulaire au serveur, on voudra vrifier les saisies de lutilisateur. 101
8 3950 TG PA 00
Squence 3
Initiation Javascript
tout contrle focusable et aux liens. tout contrle focusable, pouvant donc perdre le focus, et aux liens. Tout contrle de formulaire au dessus duquel on peut passer avec la souris, ainsi quaux images et aux liens. Tout contrle de formulaire au dessus duquel on peut passer avec la souris, et donc que la souris peut quitter, ainsi quaux images et aux liens. Champ texte (textarea, select, text). Aux balises body et frameset. Balises body et frameset. Balise form. Balise form.
onMouseOut
Linternaute a slectionn du texte dans le contrle. Le chargement du document est termin. On quitte la page en cours. Linternaute annule lenvoi dun formulaire en cliquant sur un bouton reset. Linternaute envoie un formulaire en cliquant sur un bouton submit.
8 3950 TG PA 00
Squence 3
Initiation Javascript
<html> <head> <title> Gestion des vnements utilisateur </title> <script language = "javascript"> function test() {alert("Evnement dclench")} </script> </head> <body > <form > <A href = "javascript:test()"> Texte du lien </A> </form> </body> </html>
Pour tester la page, il suffit de louvrir dans le navigateur et de cliquer sur le lien. En tout cas, le moins quon puisse dire de notre fonction test(), cest quelle aura sacrment servi!!
8 3950 TG PA 00
103
Squence 3
Initiation Javascript
Remarque
La situation propose ci-dessus diffre de lexemple suivant de lien utilisant lvnement onClick :
8 3950 TG PA 00
104
Squence 3
Initiation Javascript
<html> <head> <title> Association liens/Evnements </title> <script language = "javascript"> function test() {alert("Evnement dclench")} </script> </head> <body > <form >
test de onMouseOver : <A href="javascript:void(0)" onMouseOver = "test()"> Texte du lien </A> <br> test de onMouseOut : <A href="javascript:void(0)" onMouseOut= "test()"> Texte du lien </A> <br>
test de onFocus : <A href="javascript:void(0) " onFocus= "test()"> Texte du lien </A> <br> test de onClick : <A href="javascript:void(0)" onClick = "test()"> Texte du lien </A> <br> test de onBlur : <A href="javascript:void(0)" onBlur = "test( )"> Texte du lien </A> <br> </form> </body> </html>
Bon, nous voil peu prs au courant du minimum en ce qui concerne les liens.
6A. Utilisation des valeurs contenues dans les zones de saisie et de texte
Pour une zone de texte (textarea) ou une zone de saisie (text, select, password), la proprit value contient tout instant le texte contenu dans la zone (ce texte a t saisi par linternaute ou bien il a t affect par programmation la zone).
8 3950 TG PA 00
105
Squence 3
Initiation Javascript
<html> <head> <title> Gestion des vnements</title> <script language = "javascript"> function test(form) {alert (form.saisie.value)} </script> </head> <Body> <form> Saisissez votre nom : <input type = "text" name = "saisie" size = "5"> <P> <input type = "button" value = "Cliquer ici" onClick = "test(this.form)"> <p> </form> </body> </html>
Expliquons certaines instructions de cet exemple en dtail. Vous remarquerez que lentte de la fonction test a chang. Cet entte function test(form) indique au navigateur que la fonction test est dcrite pour un formulaire, le paramtre form utilis ici lors de la description de la fonction test est un paramtre formel (si vous ne savez plus ce quest un paramtre formel, je vous renvoie votre cours dalgo, chapitre6). Lorsquon appelle la fonction test , dans lvnement onClick, on utilise la syntaxe suivante onClick = "test(this.form)". On appelle ici la fonction test en lui passant this.form en paramtre. this.form est un paramtre effectif, il dsigne le formulaire courant, cest--dire le formulaire en train dtre visualis par le navigateur. Dans la description de la fonction test, linstruction alert (form.saisie.value) signifie : affiche la valeur (value) du contrle qui sappelle saisie, ce contrle se trouve dans le formulaire que je tai pass en paramtre (form). Vous pourrez remarquer que pour un button, la proprit value contient le libell du bouton. On en reparlera un peu plus bas.
8 3950 TG PA 00
106
Squence 3
Initiation Javascript
<html> <head> <title> Manipulation du contenu des contrles </title> <script language = "javascript"> function test(form) {form.resultat.value = form.saisie.value + "ppp"} </script> </head> <Body> <form> Saisissez votre nom : <input type = "text" name = "saisie" size = "5"> <P> <input type = "button" value="Cliquer ici" onClick = "test(this.form)"> <p>
Le nom modifi vaut maintenant : <input type = "text" name = "resultat" size = "10"> <P>
</form> </body> </html> Cet exemple nous montre que pour affecter une valeur une zone de texte, il faut utiliser la syntaxe nomDuContrle.value = valeur
8 3950 TG PA 00
107
Squence 3
Initiation Javascript
<html> <head> <title> Gestion des vnements</title> <script language = "javascript"> function test(form) {form.resultat.value = parseFloat(form.saisie.value) + 20} </script> </head> <Body> <form> Saisissez votre ge : <input type = "text" name = "saisie" size = "5"> <P> <input type = "button" value = "Cliquer ici" onClick = "test(this.form)"> <p> Dans 20 ans, vous aurez : <input type = "text" name = "resultat" size = "10"> <P> </form> </body> </html>
Maintenant, on va tester a sans utiliser la fonction parseFloat . Remplacez :
form.resultat.value = parseFloat(form.saisie.value) + 20
Par :
form.resultat.value = form.saisie.value + 20
Vous avez vu ? a a concatn lge saisi avec 20!! Parce quil croit quil doit concatner, notre pauvre navigateur, puisquune des deux valeurs entourant le signe + est une chane. Alors si on avait utilis une autre opration arithmtique, quest-ce que a aurait donn, sans parseFloat ? Jessaie tout de suite, je remplace :
form.resultat.value = form.saisie.value + 20
Par :
form.resultat.value = form.saisie.value 20
Ben oui... - 20, parce que moi, en plus, a marrange davoir 20 ans de moins dans vingt ans que 20 ans de plus dans vingt ans. Eh ben l, a marche sans parseFloat? Pourquoi ? Parce que l, il ny a aucune ambigut, le navigateur sait bien que le signe correspond forcment une soustraction, une opration arithmtique, donc, il convertit dynamiquement le texte contenu dans saisie en un nombre pour pouvoir effectuer le calcul. Jessaie aussi avec / et avec *, a fonctionne aussi sans parseFloat . Donc, en fait, on na besoin dutiliser parseFloat que pour laddition, et tout a parce que le signe + correspond la fois la concatnation et laddition.
8 3950 TG PA 00
108
Squence 3
Initiation Javascript
<html> <head> <title> Gestion des vnements</title> <script language = "javascript"> function plus(form) {form.saisie.value = parseFloat(form.saisie.value) + 5} function moins(form) {form.saisie.value = form.saisie.value - 5} </script> </head> <Body> <form> Saisissez le nombre : <input type = "text" name = "saisie" size = "5"> <P> <input type = "button" value = "Plus" onClick = "plus(this.form)"> <p> <input type = "button" value = "Moins" onClick = "moins(this.form)"> <p> </form> </body> </html>
Pour bien vous assurer que la proprit value a bien le mme rle pour tous les contrles contenant du texte, dans lexemple prcdent, remplacez successivement :
alert(form.saisie.value);
8 3950 TG PA 00
109
Squence 3
Initiation Javascript
<html> <head> <title> Gestion des vnements</title> <script language = "javascript"> function nouvelleSelection(form) {alert("Vous avez slectionn" + form.preference.value)} </script> </head> <Body> <form> Je suis plus intress(e) par : <Select name = "preference" onChange = "nouvelleSelection(this.form)"> <option value = 1> les livres <option value = 2> les films <option value = 3> la musique </select> </form> </body> </html>
Vous pouvez (euh... en fait, cest largement conseill) aussi tester ce qui suit :
.... Je suis plus intress(e) par : <Select name = "preference" onChange = "nouvelleSelection(this.form)"> <option value = les livres> les livres <option value = les films> les films <option value = la musique selected> la musique </select> ....
Cet exemple nous montre que : lattribut selected dsigne quelle option doit tre slectionne par dfaut; pour pouvoir manipuler la valeur slectionne dans une liste, il faut complter la description des <option> en valorisant leur attribut value. Lattribut value des <option...> permet de faire en sorte que si lutilisateur slectionne une option dans la liste, cest le contenu de son attribut value qui est affect lattribut value de la liste <select>;
8 3950 TG PA 00
110
Squence 3
Initiation Javascript
si la proprit value des options contient du texte, il doit tre entre quotes. Sil contient des nombres, ils peuvent tre entre quotes (dans ce cas ils sont considrs comme du texte) ou non (dans ce cas, ils sont considrs comme des valeurs numriques).
6B2. Modification
On peut modifier la proprit value dune option. Si, par exemple, vous rajoutez le code suivant dans notre formulaire de test :
6B3. Ajout
On peut galement ajouter une entre de liste par programmation. Tiens, la preuve :
... <Select name = "preference"> <option value = les livres> les livres <option value = les films> les films <option value = la musique selected> la musique <script language = "javascript"> document.write(<option value = "le truc"> le truc); </script> </select> ...
Lexemple prcdent est stupide, puisquon se contente de rajouter par programmation une constante chane de caractres. Stupide, mais utile (si, si,) car plus loin, on apprendra construire les lments de formulaires, leur contenu et leur valeur entirement par calcul, et cet exemple est la premire brique du majestueux difice logiciel que je souhaite vous amener construire (hou l, je commence fatiguer, on dirait... comment a, je ne fais que continuer fatiguer!!).
8 3950 TG PA 00
111
Squence 3
Initiation Javascript
Enfin, pas si stupide que a... il nous apprend : quon peut utiliser la mthode write de lobjet document pour construire par programmation une page HTML ; quon peut mettre des scripts dans la description dun contrle de formulaire.
6C2. Modification
On peut aussi modifier la proprit value dune checkbox... Cochez si vous tes majeur : <Input type = "checkbox" name = "majeur" value = "vrai" onClick = "majeur.value = tralala; alert(majeur.value);" checked>
6C3. Test
Maintenant, on peut souhaiter savoir si cette chekbox a t coche ou non par lutilisateur...
<html> <head> <title> Gestion des vnements</title> <script language = "javascript"> function essaiCheckBox(form) { if (form.majeur.checked) alert("Donc, vous tes majeur") else } </script> </head> <Body> <form> Cochez si vous tes majeur : <Input type = "checkbox" name = "majeur" value = "vrai"> <input type = "button" value = "Clic!" onClick = "essaiCheckBox(this.form)"> </form> </body> </html> alert("Vous tes mineur");
8 3950 TG PA 00
112
Squence 3
Initiation Javascript
<html> <head> <title> Gestion des vnements</title> </head> <Body> <form> Cochez si vous tes majeur : <Input type = "checkbox" name = "majeur" value = "vrai" checked> <br> <input type = "button" value = "Clic!" onClick="majeur.checked = false"> </form> </body> </html>
Vous avez vu ? Quand linternaute clique sur le bouton clic! La checkbox est dcoche sans cliquer dessus. Pour obtenir cela, je me suis contente daffecter la valeur false lattribut checked de la checkbox, ce qui signifie que lattribut checked de la checkbox devient faux, ce qui signifie que la checkbox est dcoche. Sur le mme modle que lexemple prcdent, on peut aussi affecter par programmation la valeur true la proprit checked dune checkbox. Autre exemple : on peut aussi faire un truc sympa (si, si, vous allez voir, cest sympa comme truc ...). On peut, par programmation, faire en sorte que : si la checkbox est coche, alors, au clic sur notre bouton clic!, elle sera dcoche; si elle est dcoche, au clic sur notre bouton clic!, elle sera coche. Il sagit en fait dinverser la valeur de lattribut checked de la checkbox. Regardez, tapez et testez. Dans le code de lexemple ci-dessus, remplacez avantageusement linstruction :
8 3950 TG PA 00
113
Squence 3
Initiation Javascript
... <form> Cochez si vous tes majeur : <Input type = "radio" name = "majeur" value = "vrai" checked> majeur <br> Cochez si vous tes mineur : <Input type = "radio" name = "mineur" value = "faux" > mineur <br> <input type = "button" value = "Clic!" onClick="majeur.checked = !majeur.checked ; mineur.checked = !mineur.checked"> </form> ...
Dans le code ci-dessus, on na pas cr de groupe de contrles radio, nos radio sont indpendants lun de lautre. Bon, quand on clique sur notre bouton clic!, a inverse la slection des radio, par contre, comme les radio sont indpendants lun de lautre, le choix nest pas exclusif et une fois quon a coch un radio, il le reste. Cest plutt bof, comme comportement. Et maintenant, modifiez comme suit : ... <form> Cochez si vous tes majeur : <Input type = "radio" name = "majeurOuMineur" value = "vrai" checked> majeur <br> Cochez si vous tes mineur : <Input type = "radio" name = "majeurOuMineur" value = "faux" > mineur <br> <input type = "button" value = "Clic!" onClick="majeurOuMineur.checked = !majeurOuMineur.checked;"> </form> ...
8 3950 TG PA 00
114
Squence 3
Initiation Javascript
L, on a cr un groupe de radio. Alors l, maintenant, quand on teste, lorsquon clique sur notre bouton clic! Il ne se passe absolument rien. Cela signifie que, comme linstruction majeurOuMineur.checked = !majeurOuMineur. checked nest pas applicable, le navigateur lignore purement et simplement, ce qui, soit dit en passant vaut mieux quun message derreur. Les navigateurs se comportent comme a parce que justement, il arrive que dans la page quils doivent visualiser, il se trouve des instructions, symboles quils ne connaissent pas (cas par exemple dun vieux navigateur qui aurait affaire une version trop rcente de javascript). Par contre, comme nos deux radio ont la mme proprit name, ils font partie du mme groupe et lorsquon slectionne un des choix, lautre est automatiquement dslectionn. Oui, mais moi je veux que lutilisateur puisse manipuler les radio soit par un clic direct dessus, soit en cliquant sur le bouton clic! En fait, voil ce que je veux exactement : faire en sorte que les choix soient exclusifs; dcocher un choix coch par un clic sur le radio; faire en sorte que lorsquun choix est dcoch, lautre est automatiquement coch; modifier la valeur de la proprit checked de chaque radio au clic sur un bouton. Il faut donc : utiliser des radio indpendants (cest--dire ne possdant pas la mme valeur pour leur attribut name); programmer leurs vnements onClick respectifs en plus de programmer lvnement onClick de notre bouton clic!
8 3950 TG PA 00
115
Squence 3
Initiation Javascript
Jai cherch et trouv (dans ma petite tte) le bout de code suivant, qui donne aux radio un comportement un peu plus riche : <html> <head> <title> Manipulation des contrles radio</title> <script language = "javascript"> function inverseSelection(form) { form.majeur.checked = !form.majeur.checked; form.mineur.checked = !form.mineur.checked; } </script> </head> <Body> <form name = "maPage"> Cochez si vous tes majeur : <Input type = "radio" name = "majeur" value = "vrai" checked onclick = "mineur.checked = !mineur.checked; majeur.checked = !mineur.checked;"> majeur <br> Cochez si vous tes mineur : <Input type = "radio" name = "mineur" value = "faux" onclick = "majeur.checked = !majeur.checked; mineur.checked = !majeur.checked;"> mineur <br> <input type = "button" value = "Clic!" onClick="inverseSelection(maPage)"> </form> </body> </html> Le comportement de la page est le suivant : quand la page souvre, cest le radio majeur qui est coch par dfaut ; quand on clique sur le bouton clic!, cela a pour effet dinverser la slection des radio ; quand on clique sur un radio, sil tait coch, il est dcoch et cest lautre radio qui est coch ; sil tait dcoch, il est coch et lautre radio est dcoch. Le comportement est un peu plus riche que si on utilise des radio appartenant un mme groupe. Maintenant, si on veut permettre des choix non exclusifs, alors l, ce nest pas la peine de sembter programmer le comportement des radio, il suffit dutiliser des checkbox.
8 3950 TG PA 00
116
Squence 3
Initiation Javascript
... <input type = "button" name = "inverserSelection" onClick="inverseSelection(maPage)" value = "Clic!" disabled> <br> <BUTTON name = "boutonActiver" value = "activer" type = "button" onClick = "inverserSelection.disabled = false;"> Activer </button> ...
Vous constatez que quand on clique sur le bouton Activer, cela a pour effet de rendre actif le bouton clic!, ce qui permet de cliquer dessus. Ce qui serait top, cest de changer le libell du bouton Activer en Dsactiver une fois que le bouton clic! a t activ. Une solution simple serait dutiliser la syntaxe <input..> pour le bouton Activer et de changer son libell en changeant sa proprit value, comme a <input type = "button" name = "boutonActiver" value = "Activer" onClick = inverserSelection.disabled= false;boutonActiver.value= "Dsactiver";
>
Remarque
Vous avez remarqu au passage que comme jutilise "Dsactiver", une chane de caractre entre doubles quotes pour affecter une nouvelle valeur la proprit value du bouton, jai encadr le code javascript de simples quotes, sinon, le code ne fonctionne plus, le navigateur sarrtant dans son interprtation la premire double quote de la chane "Dsactiver" qui pour lui, est la marque de la fin du code javascript.
8 3950 TG PA 00
117
Squence 3
Initiation Javascript
Autre solution : une solution existe, plus propre car utilisant la syntaxe <button...>, un petit peu plus complexe aussi, puisque ce quil faut, cest modifier le texte du bouton, qui est plac entre les balises <button...> et </button>. Pour ce faire, il faut affecter un identifiant au contrle, rcuprer cet identifiant laide dune fonction prdfinie, et changer le texte Activer en Dsactiver, comme a <button type= "button" id= "monBout" name= "boutonActiver" value= "Activer" onClick = inverserSelection.disabled = false; document.getElementById("monBout").childNodes[0].nodeValue= "Dsactiver";> Activer </button> Lavantage de cette faon de faire, cest quon peut modifier tout lment de document avec la mthode getElementById partir du moment o on a affect un attribut Id cet lment. Llment que lon modifie nest pas forcment un contrle de formulaire, a peut tre un lment statique de la page. On peut mme modifier les options dune liste <select.> de cette faon, ou mme les options dune liste pas <select..>, une liste normale quoi (une liste ol ou une liste ul), ou mme le contenu dun tableau, la taille dune image, tout quoi!!! Expliquons ce bout de code, un peu plus compliqu que le prcdent, je vous laccorde. document.getElementById("monBout") nous permet de rcuprer le contrle dont lattribut Id vaut "monBout". childNodes[0] nous permet de rcuprer le premier lment de llment dont lId est "monBout". Bon, l, il faut que jexplique que : pour tout lment ayant un attribut Id, un tableau sappelant childNodes est accessible par programmation. Lindice du premier lment de ce tableau est 0(zro). Ce tableau contient les valeurs des diffrents lments de texte de llment. Dans le cas de notre bouton Activer, le tableau childNodes contient un seul lment, qui est le libell du bouton. document.getElementById("monBout").childNodes[0].nodeValue nous permet daccder la valeur (nodeValue) du premier lment texte (childNodes[0].) du contrle dont lattribut est "monBout" (getElementById("monBout").) dans le document courant (document.). Ouf!! Jai expliqu!!!
8 3950 TG PA 00
118
Squence 3
Initiation Javascript
On peut galement accder un lment par sa proprit name et dans ce cas, on utilise la mthode getElementByName, ce qui suppose que les lments de notre document auxquels on veut accder ont une proprit name. Il existe encore dautres moyens de modifier un document HTML par programmation. Par exemple, on peut accder llment que lon veut modifier par son tag (cest--dire le truc entre <> qui encadre llment), laide de la mthode getElementsByTagName. Nous ne verrons pas ici ces faons de faire, car ce cours a pour but une initiation. Si vous souhaitez approfondir les diffrents moyens quoffre javascript de modifier les lments dun document HTML, je vous invite vous documenter par tout moyen votre convenance (en allant fouiner sur le net, en achetant des bouquins). Mon but est de vous montrer que cest possible et pas si compliqu que a. Aprs, vous pourrez transposer ce quon va voir ici : la suppression dlments, avec, par exemple, la mthode removeChild ; lajout dlments avec, par exemple, createElement ; dautres traitements encore. Comme dans le paragraphe ci-dessus, nous allons utiliser la mthode getElementById. Si on utilise ce procd sur une liste <select..>, vous allez voir ci-dessous que a nous permet de changer les options de la liste. Cest trop fort, ce truc, vous ne trouvez pas ? Pour tester a, on va reprendre un exemple dj utilis plus haut dans ce prsent ouvrage, tout aussi inspir que pdagogique (Ben quoi, cest le printemps, alors je moffre des fleurs, na!). Donc on va reprendre notre liste :
<Select name = "preference"> <option value = les livres> les livres <option value = les films> les films <option value = la musique selected> la musique </select>
Puis, pour dclencher la modification de la liste, on va reprendre notre bouton clic! Donc, on va modifier le code comme suit :
<html> <head> <title> Gestion des vnements</title> <script language = "javascript"> function modifListe(idDeLelement) {document.getElementById(idDeLelement).childNodes[0].nodeValue = "Blablabla";} </script> </head> <Body> <form name = "monFormulaire">
8 3950 TG PA 00
119
Squence 3
Initiation Javascript
<Select name = "preference" Id = idSelect> <option value = les livres Id = option1> les livres </option> <option value = les films> les films </option> <option value = la musique selected> la musique </option> </select> <p> <button type = "button" name = "boutonActiver" value = "activation" onClick = modifListe("option1");> Clic! </button> </form> </body> </html>
L, btement, quand on clique sur notre bouton clic!, a change la premire option de la liste preference. Il suffit de drouler la liste aprs avoir cliqu sur clic! pour sen rendre compte. Expliquons quand-mme ce bout de code : vous remarquerez tout dabord que, pour pouvoir utiliser getElementById, jai rajout un attribut Id loption de la liste que je souhaite modifier. Bon, maintenant, parlons de la fonction modifListe. La fonction modifListe prend un paramtre. Dans la description de la fonction, jai appel ce paramtre idDeLelement pour quon se rappelle bien que ce paramtre formel, cest lattribut Id de llment. Ce quon veut, cest changer la valeur du premier node de cet lment. Cette fonction affecte la valeur Blablabla (nodeValue = "Blablabla") du premier node (childNodes[0].) de llment dont lId a t pass en paramtre (getElementById(IdDeLelement).), et ceci, dans le document courant (document). Vous pouvez constater que le tableau qui rfrence les nodes dun lment est indic partir de0. Oui mais madame, c koi un node ? Ah, enfin, il y en a un qui pense me poser la question... cest pas trop tt!! Alors, un node, quest-ce que cest ? laide de tout un ensemble de mthodes et de proprits de lobjet document , les navigateurs ( partir de Internet Explorer 5 et Netscape Navigator 6) savent voir un document HTML comme un ensemble compltement hirarchis dlments. Pour tout lment, on a moyen de connatre les lments quil contient, et par quel lment il est contenu. Les mthodes de lobjet document permettent galement daccder aux lments via leurs indices dans des tableaux dans lesquels ils sont rpertoris suivant la hirarchie du document. Autrement dit, les navigateurs savent voir tout document HTML sous forme dune arborescence, et mettent notre disposition des outils javascript (des fonctions, des procdures, des proprits) nous permettant daccder et de mettre jour cette arborescence. Exemple : en crant le paragraphe
8 3950 TG PA 00
120
Squence 3
Initiation Javascript
Lobjet texte On explique c koi un node tant contenu dans le tag objet <p></p> , il est considr par votre navigateur comme lenfant de <p>. Donc, notre paragraphe a un enfant, auquel on accde en allant dans le tableau qui rpertorie les enfants de ce paragraphe, ce tableau sappelle childNodes, le premier enfant est lindice 0 de ce tableau. Maintenant, si je veux mettre en gras le mot node dans mon paragraphe, je vais crire
8 3950 TG PA 00
121
Squence 3
Initiation Javascript
modifListe(preference.value, valeur);"> <option value = livres Id = livres> les livres </option> <option value = films Id = films> les films </option> <option value = musique Id = musique selected> la musique </option> </select> </form> </body> </html>
Observons notre liste select tout dabord: jai trich, vous avez vu ? jai affect la mme valeur lattribut Id et lattribut value de chaque option. Pourquoi jai fait a ? Eh ben parce que dans une liste select la proprit value de la liste est tout instant identique la proprit value de loption slectionne, donc, avec ma tricherie, la proprit value de la liste est tout instant identique la proprit Id de loption slectionne. Cest fort, hein!! Ensuite, quest-ce que jai fait dautre ? laide de la fonction prompt , je rcupre dans la variable valeur la nouvelle valeur que lutilisateur veut attribuer litem de liste quil a slectionn. Puis, jappelle la fonction modifListe en lui passant, comme paramtres, lattribut value de la liste. Donc, en fait, grce ma petite tricherie, je lui passe lId de loption dont il veut modifier le texte. Le second paramtre pass modifListe est le nouveau texte de loption. Allons maintenant regarder de plus prs la fonction modifListe. Cette fonction rcupre llment modifier grce document.getElementById(idDeLelement)., idDeLelement ayant t pass en paramtre. Puis, grce childNodes[0].nodeValue = val, la fonction affecte la valeur val (qui est le second paramtre qui lui a t pass) au texte (nodeValue) du premier enfant de loption (chilNodes[0]).
8 3950 TG PA 00
122
Squence 3
Initiation Javascript
Vieux navigateurs
Lorsquune page est interprte par un trs vieux navigateur ne sachant pas interprter le javascript (ils sont de plus en plus rares, mais il en reste), le navigateur affiche sur la page le code javascript, au lieu de linterprter. Pour viter a, il suffit dencadrer tout code javascript avec des commentaires HTML. Comme a, un navigateur ne sachant pas interprter le javascript croira quil sagit dun bloc de commentaires, par contre, un navigateur sachant interprter le javascript reprera les balises <script> et </script> et interprtera le script. Exemple : testez ce qui suit, et vous verrez quavec votre navigateur, le code javascript est interprt.
<script language="javascript"> <!-var monNombre ; monNombre = 4 ; alert (monNombre vaut + monNombre); --> </script>
8 3950 TG PA 00
123
Squence 3
Initiation Javascript
Ce quon peut mettre entre <noscript> et </noscript> : la description dun document HTML nutilisant pas de javascript; la redirection vers une autre page. Exemple : ici, on redirige vers une autre page <html> <head> <noscript> <meta http-equiv= "refresh" content= "0; URL= http://www.lesite.fr/lapage.html"> </noscript> <title> </title> <script language = "javascript"> ... </script> </head> <Body> <form></form> ... </body> </html>
Dclaration
On peut dclarer une variable de diffrentes manires : var maVariable; Cette dclaration est classique, dans le sens o elle naffecte pas de valeur la variable maVariable lors de la dclaration. Cette dclaration utilise le mot rserv var pour indiquer quil sagit dune dclaration. var maVariable = 15; Ici, on initialise la variable lors de sa dclaration.
8 3950 TG PA 00
124
Squence 3
Initiation Javascript
maVariable = 15; Cette dernire faon de dclarer une variable est possible mais ambige dans la mesure o labsence du mot rserv var implique une possible confusion de cette dclaration avec une opration daffectation.
Type
Lorsquon dclare une variable, on nindique pas son type. Cest le type de la valeur quelle prend qui dtermine le type de la variable. Selon la valeur quelle contient, une variable peut tre des diffrents type suivants.
Chane de caractres
Vous lavez dj constat, les chanes de caractres sont encadres par des simples quotes (...), ou bien par des doubles quotes ("..."). La seule condition respecter : ne pas, par exemple, commencer une chane avec une simple quote et la finir avec une double, ou linverse. Pourquoi ces deux possibilits ? Car elle nous donne lavantage suivant: si on cre une chane de caractres encadre par des doubles quotes, on peut y insrer des mots entre simples quotes. Inversement, si on cre une chane de caractres encadre par des simples quotes, on peut y insrer des mots entre doubles quotes. Cest bien pratique, a. Pourquoi ? Parce que si on veut insrer une chane utilisant des simples quotes dans une chane encadre par des simples quotes, la deuxime simple quote rencontre, javascript considrera que cest la fin de la chane. Exemple : testez a...
Nombres
Rien de plus simple que de donner une valeur numrique une variable. Exemples :
8 3950 TG PA 00
125
Squence 3
Initiation Javascript
Boolens
Javascript met notre disposition les deux valeurs boolennes vrai et faux : true, false. Exemple :
var monBool = true; var autreBool; autreBool = !monBool /* Aprs lopration daffectation ci-dessus, la variable autreBool vaut la ngation de la variable monBool.*/
Null
On peut utiliser la valeur null pour laffecter une variable. Cela signifie que la variable na pas de valeur. Aprs, on peut sen servir pour faire des tests. Exemple : var maVar; var monRes; monRes = prompt(Saisissez le jour :,); if monRes = Dimanche maVar = null; ... if maVar = null alert("Cest dimanche aujourdhui, vous ne devriez pas travailler");
Rgles de porte
Vous vous rappelez ce quon appelle les rgles de porte ? On a vu a dans le cours dalgo, la squence 6 sur les sous-programmes. En bref, une variable, selon lendroit o elle est dclare, nest pas visible de partout. Les rgles de porte sont les rgles utilises par le langage de programmation en ce qui concerne la visibilit des variables. Une variable dclare dans un sous-programme avec le mot cl var est locale au sous-programme. Toute variable dclare dans un bloc javascript avec le mot cl var est visible dans ce bloc et dans les sous-programme de ce bloc. Bref, cest comme en algo et cest trs bien comme a. javascript possde une caractristique assez pige en ce qui concerne la dclaration des variables : Une variable dclare dans un sous-programme sans le mot cl var est globale, et donc visible par le programme appelant et les autres sous-programmes.
Remarque
Je vous dconseille cette pratique. Quitte dclarer une variable globale, autant la dclarer dans le bloc o elle est visible, cest--dire ici, dans le programme appelant, et avec le mot cl var pour une meilleure lisibilit.
8 3950 TG PA 00
126
Squence 3
Initiation Javascript
Lorsquon veut modifier la valeur dune variable partir de sa propre valeur (laugmenter de 5, la multiplier par 2), il existe des critures plus synthtiques que lcriture daffectation classique. nouveau, je vous prsente a sous forme dun petit tableau : criture classique nombre = nombre + 1; nombre = nombre 1; nombre = nombre + 7; nombre = nombre - 7; nombre = nombre * 7; nombre = nombre / 7; criture synthtique nombre ++; ou ++ nombre ; nombre --; ou -- nombre ; nombre += 7; nombre -= 7; nombre *= 7; nombre /= 7;
ONe pas crire de btise avec les oprateurs dincrmentation (++, --).
En effet, imaginons le code suivant :
... var nombre = 10; var res; res = nombre ++; alert(res); ...
La valeur 10 saffiche. Pourquoi ? La valeur de la variable nombre est affecte la variable res et cest seulement aprs que nombre est incrment. Par contre, si on crit :
... var nombre = 10; var res; res = ++nombre; alert(res); ...
cest la valeur 11 qui saffiche car la variable nombre est incrmente avant dtre affecte res.
8 3950 TG PA 00
127
Squence 3
Initiation Javascript
et non
Remarque
pour convertir une chane en un nombre, je vous avais dj prsent la fonction parsefloat, maintenant, vous savez quon peut aussi utiliser la fonction eval. Et pour convertir un nombre en chane, que faut-il utiliser ? Rien, vous voyez dans les exemples du dessus qu partir du moment o on concatne un nombre avec une chane, il est automatiquement converti en chane, cest classe, hein!!
8 3950 TG PA 00
128
Squence 3
Initiation Javascript
Allez, maintenant, on attaque une prsentation rapide des diffrentes structures algorithmiques disponibles dans le javascript.
Sinon instruction x
Remarques
Important : il faut absolument penser encadrer les conditions par des parenthses, sinon, on a une erreur de syntaxe. on peut, bien sr, navoir quune seule instruction dans le bloc Alors et plusieurs dans le bloc Sinon, et on peut aussi avoir plusieurs instructions dans le bloc Alors et une seule dans le bloc Sinon.
8 3950 TG PA 00
129
Squence 3
Initiation Javascript
Je ne vous prsente pas dexemple pour le moment, car vous allez appliquer tout cela notre site dans quelques petites pages. Une application possible, laquelle vous pouvez rflchir ds maintenant : les conditionnelles nous permettent par exemple de tester si lutilisateur a bien saisi tous les champs obligatoires avant denvoyer son formulaire en cliquant sur un bouton submit .
Le mot cl break la fin de chaque cas est optionnel. Si on le met, cela rend les cas exclusifs les uns par rapport aux autres puisque break sert quitter linstruction switch et excuter la premire instruction suivant la fin du switch. Bon, l, on va faire un petit exemple tout simple. Ca nous permettra de tester le comportement avec et sans break.
8 3950 TG PA 00
130
Squence 3
Initiation Javascript
Alors je vous prviens tout de suite, mon exemple est stupide. Jai rarement fait mieux dans la dbilit, en ce qui concerne les exemples, jentends. Mon but est de vous faire comprendre quoi sert le break. On va donc tester plusieurs versions pour comprendre. Voici la premire version de mon super code source :
<html> <head><title> Test du switch avec un exemple idiot </title></head> <Body> <script language="javascript"> var nombre; nombre = prompt(Saisir le nombre tester); switch(nombre) { case 6 : alert(Multiple de 2); case 6 : alert(Multiple de 3); default : alert(Pas 6); } </script> </body> </html>
Lors du test (moi, je lai test une fois en saisissant 6 et une fois en saisissant une autre valeur que6), on comprend tout de suite quoi sert le break. Si on ne met pas break, les conditions ne sont pas exclusives. Donc, si le slecteur (ici, la variable nombre) satisfait plusieurs conditions, les traitements correspondant chacune de ces conditions sont effectus. Mme le default!! Pourquoi ? Eh bien probablement parce que default signifie ici nimporte quelle condition . En fait, le fait que a passe aussi dans le default vient du fonctionnement du switch. Quand il ny a pas de break, toutes les conditions case sont values. Essayons la deuxime version (je ne remets pas le dbut ni la fin de la page, seul le switch est modifi).
... switch(nombre) { case 6 : alert(Multiple de 2); case 6 : alert(Multiple de 3); break; default : alert(Pas 6); } ...
Bon, le fait de rajouter un break fait quon ne passe plus dans le default lorsque6 a t saisi.
8 3950 TG PA 00
131
Squence 3
Initiation Javascript
switch(nombre) { case 6 : alert(Multiple de 2); break; case 6 : alert(Multiple de 3); break; default: alert(Pas 6); } ...
Cette fois, cause du break quon a rajout, on sort aprs affichage du premier message, ce qui ne nous arrange pas dans notre cas, mais a nous apprendra inventer des exemples dbiles. On peut donc utiliser des switch quivalents des si alors sinon imbriqus, dans ce cas, il faut utiliser des break. On peut aussi utiliser le switch comme une succession de si alors Maintenant, essayez ce qui suit :
switch(nombre) { case 6 : alert(Multiple de 2); break; case 6 : alert(Multiple de 3); break; default: alert(Pas 6); } ...
Jai simplement enlev les simples quotes autour des 6 du case, et maintenant, quand je saisis 6 a marche mme pus!! Est-ce que a voudrait dire que les valeurs des case doivent tre des chanes de caractres ? Pour vrifier cette hypothse (quelque peu hasardeuse, je vous laccorde), je complte mon switch comme a : switch(eval(nombre)). Et l, a fonctionne nouveau. Donc, mon hypothse tait fausse. Le problme tait tout autre : les valeur saisies laide de la fonction prompt , mme si on saisit des chiffres, sont des chanes de caractres. Si, dans les case, les conditions portent sur des nombres, il faut convertir en numrique les valeurs saisies. Bon, il tait dbile, mon exemple, mais il nous a quand-mme permis de comprendre pas mal de choses. Voil, jen ai fini avec les notions de base sur les structures conditionnelles. Maintenant, attaquons les boucles (cest--dire les structures itratives).
8 3950 TG PA 00
132
Squence 3
Initiation Javascript
8 3950 TG PA 00
133
Squence 3
Initiation Javascript
while (artisteSaisi !=*) { nbArtistes ++; document.write(<TR> <TD> + nbArtistes + </TD> <TD> + artisteSaisi + </TD> </TR>); artisteSaisi = prompt(Saisissez un artiste (* pour terminer),); } // fermeture de la table document.write(</table>); // On complte la page avec une zone pour saisir le-mail et un bouton pour envoyer le // formulaire document.write(<form>);
document.write(Saisissez votre adresse e-mail : <input type = "text" Value = "email"> <br>);
document.write(<Input type="submit" name = "monBoutonEnvoyer" value="Envoyer">); document.write(</form>); } </script> </head> <Body> <!-- Pour les fioritures (couleur, taille de police exotiques, petits gugus qui rigolent, images..., je vous laisse faire --> Bonjour,<br> Vos gots en matire de musique nous intressent <br> Nous vous proposons donc de saisir vos 5 artistes prfrs. <br> Si un article concernant un de ces 5 artistes est disponible la vente, <br> Nous ne manquerons pas de vous avertir par mail.<br> Si vous tes prt pour la saisie, cliquez sur le bouton "Saisir les artistes". <br> <form> <button name = bSaisie onCLick = saisieArtistes()> Saisir les Artistes </button> </form> </body> </html>
Vous avez test ? Cest sympa hein. Bon, je vous laisse le soin de fignoler le look de cette page. Le seul truc qui me drange pour le moment, en ce qui concerne le fonctionnement, cest que mme si linternaute ne saisit aucun artiste (cest--dire s'il saisit demble une *), on a quandmme lentte du tableau ainsi que les lments de formulaire qui saffiche.
8 3950 TG PA 00
134
Squence 3
Initiation Javascript
Pour corriger a, on peut, par exemple : mettre la construction de lentte du tableau lintrieur du while avec un test. Ce test vrifie si le nombre dartiste est 1, si oui, on construit lentte du tableau, sinon, non ; nafficher la zone de saisie de ladresse de messagerie et le bouton envoyer que si lutilisateur a effectivement saisi au moins un artiste. Voici ci-dessous le code source modifi, jai mis en gras les modifications. D ans le code ci-dessous, jai mis certaines instructions document.write sur plusieurs lignes par manque de place en largeur, mais jai constat que si on fait effectivement cela dans le code source de la page, javascript considre quil y a une erreur. En javascript il y a en fait deux sparateurs d'instruction : le point virgule et le saut de ligne.
Donc, mme si dans le code ci-dessous, certaines instructions document.write stalent sur plusieurs lignes, tapez-les en une seule ligne dans votre diteur.
<html> <head> <title> Parlez-nous de vos gots, cher visiteur </title> <script language = javascript> function saisieArtistes() { // compteur dartistes var nbArtistes = 0; artisteSaisi = prompt(Saisissez un artiste (* pour terminer),); while (artisteSaisi !=*) { nbArtistes ++; if (nbArtistes == 1) { // construction du dbut du tableau document.write(<table border = 1>);
document.write(<TR> <TD> Ordre de prfrence </TD> <TD> Artiste </TD> </TR>); } // fin du if (nbArtistes == 1) document.write(<TR> <TD> + nbArtistes + </TD> <TD> + artisteSaisi + </TD> </TR>); artisteSaisi = prompt(Saisissez un artiste (* pour terminer),); } // fin du while // fermeture de la table document.write(</table>); if (nbArtistes > 0)
8 3950 TG PA 00
135
Squence 3
Initiation Javascript
{ // On complte la page avec une zone pour saisir lemail et un bouton pour envoyer le // formulaire document.write(<form>); document.write(Saisissez votre adresse e-mail : <input type = "text" Value = "email"> <br>); document.write(<Input type="submit" name = "monBoutonEnvoyer" value="Envoyer">); document.write(</form>); } else history.back(); } </script> </head> <Body> ...je ne vous remets pas la fin, qui na absolument pas chang. </html>
Voil, il ne reste plus qu expliquer le sens de linstruction history.back();, se trouvant dans le else, cest--dire sexcutant lorsque le nombre dartistes saisis est 0. Pour comprendre ce que a fait, mettez le else en commentaires (en prcdant la ligne de //) et relancez laffichage de votre page. Vous constatez que, quand lutilisateur ne saisit aucun artiste, la fentre courante reste affiche, mais nest plus active : on peut toujours schiner cliquer 50 fois sur le bouton Saisir les artistes, rien ne se passe. Par contre, si on clique sur l'icne prcdant de votre navigateur, la fentre est de nouveau active, car elle est dans ltat antrieur au fait que linternaute nait saisi aucun artiste. Ce quil faut, donc, cest revenir ltat antrieur de notre page, quand elle tait encore active. Cest ce quoi sert la mthode back() de lobjet history. Cette mthode permet de ramener le navigateur la page prcdente, comme si linternaute cliquait sur le bouton Prcdent de son navigateur. Voil. On pourrait encore peaufiner le comportement de notre page. Notamment, on devrait contrler, laide dun test, si linternaute a bien renseign son e-mail avant denvoyer le formulaire. Mais ceci ne relve pas dun paragraphe sur la prsentation des boucles. On le fera plus tard, quand on en sera rinvestir ce quon a appris en javascript, pour amliorer notre site.
8 3950 TG PA 00
136
Squence 3
Initiation Javascript
Traduction en javascript for (i = valDeb; i <= valFin; i += n) instruction; for (i = valDeb; i <= valFin; i += n) { instruction 1; instruction 2; ... instruction n; } for (i = valDeb; i >= valFin; i -= n) instruction; for (i = valDeb; i >= valFin; i -= n) { instruction 1; instruction 2; ... instruction n; } for (initialisation; condition; instruction modifiant la valeur de condition) { instruction 1; instruction 2; instruction n; }
8 3950 TG PA 00
137
Squence 3
Initiation Javascript
Mon tout rattrape un peu le reste, cest la traduction du programme du paragraphe prcdent, avec un for au lieu dun while. Rappelez-vous que les instructions document.write ne doivent pas staler sur plusieurs lignes.
<html> <head> <title> Parlez-nous de vos gots, cher visiteur </title> <script language = javascript> function saisieArtistes() { var nbArtistes = 0; for (artisteSaisi = prompt(Saisissez un artiste (* pour terminer),);artisteSaisi != *; artisteSaisi = prompt(Saisissez un artiste (* pour terminer),)) { nbArtistes ++; if (nbArtistes == 1) { // construction du dbut du tableau document.write(<table border = 1>); document.write(<TR> <TD> Ordre de prfrence </TD> <TD> Artiste </TD> </TR>); } document.write(<TR> <TD> + nbArtistes + </TD> <TD> + artisteSaisi + </TD> </TR>);
/ / ici, jai enlev artisteSaisi = prompt(Saisissez un artiste (* pour terminer),)
8 3950 TG PA 00
138
Squence 3
Initiation Javascript
// fermeture de la table document.write(</table>); if (nbArtistes > 0) // etc...etc... la suite ne change pas Bon, je pense quen ce qui concerne les boucles, on est au clair, alors maintenant, il ne nous reste plus qu voir les tableaux, et on aura fait le tour des bases du langage. Ensuite, je ne reviendrai que trs succinctement sur les fonctions, pour vous donner quelques petites prcisions, puis ensuite, on passera la gestion des cookies.
8G1. Dclaration
En javascript, un tableau est un objet de la classe Array. On a dj utilis quelques classes dans ce chapitre (la classe Date, la classe Window). Puisquun tableau est un objet de la classe Array, il faut, comme pour la classe Date, non pas le dclarer, mais linstancier laide de la syntaxe new . On a plusieurs faons de dclarer un tableau, principalement trois faons. Premire faon : dclarer et valoriser un tableau de littraux (cest--dire de valeurs). Dans ce cas, pas besoin de new, puisquon numre directement le contenu du tableau. Exemple : v ar monTableauDeLitteraux;
var monTableauDeLitteraux = [truc, 4, bidule]; for (var i = 0; i <= 2; i++) document.write(monTableauDeLitteraux [i]);
Cet exemple nous montre que : le premier lment de tout tableau est lindice 0 ; on peut, dans un tableau, mlanger des nombres, des chanes ; on peut dclarer une variable au moment de lutiliser (Cest ce quon fait quand on crit for(var i = 0)). On dclare et on initialise i, le compteur ditrations, lintrieur du for. Si on avait voulu faire exactement comme en algo, on aurait crit :
8 3950 TG PA 00
139
Squence 3
Initiation Javascript
Deuxime faon : dclarer et instancier un tableau dune certaine taille. Exemple : v ar monTableau; // Dclaration
var monTableau = new Array(2); for (var i = 0; i <= 1; i++) monTableau[i] = prompt (Saisir llment dindice" + i,"")
Testez. Maintenant, regardez, je modifie le code ci-dessus :
var monTableau = new Array(2); for (var i = 0; i <= 5; i++) monTableau[i] = prompt (saisir llment dindice" + i,"")
Ici, jessaie de faire saisir lutilisateur plus dlments (6 lments) que le tableau ne peut en contenir (le tableau peut contenir 3 lments). Et a marche. Cela signifie que mme si on dfinit la taille lors de linstanciation, la taille du tableau est extensible. Tous les tableaux sont de taille dynamique. Ceci nous amne la troisime faon. Troisime faon : on instancie le tableau sans indiquer sa taille. Exemple : v ar monTableau = new Array(); Reprenez lexemple du dessus et modifiez linstanciation pour vrifier que je ne vous raconte pas de btises. Convaincus ? Donc, inutile de sembter indiquer la taille lors de linstanciation.
8 3950 TG PA 00
140
Squence 3
Initiation Javascript
Les proprits
En fait, un tableau ne possde quune proprit, la proprit length, qui contient, tout moment, le nombre dlments du tableau. Si mon tableau sappelle monTableau, alors, tout instant, lexpression monTableau.length a pour valeur le nombre dlments contenus dans le tableau monTableau.
Les mthodes
L, par contre, il y en a un bon petit paquet. Jen ai slectionn quelques unes. Je vous rappelle quune mthode, cest un sous-programme qui nest utilisable que pour une certaine classe dlments. La mthode concat Exemple :
8 3950 TG PA 00
Squence 3
Initiation Javascript
var tab = new Array(); tab[0] = new Array(); // Le premier lment de tab est un tableau tab[1] = new Array(); // Le second lment de tab est un tableau
On peut ici considrer quon a cr un tableau de n lignes et 2 colonnes. Pour accder aux lments dun tel tableau, on fait comme a :
8 3950 TG PA 00
Squence 3
Initiation Javascript
<html> <head> <title> Tests sur les fonctions </title> <script language = "javascript"> // dbut fonction function fonctionSomme(var1,var2) { return var1 + var2; } // fin fonction </script> </head> <body> <script language = "javascript"> document.write(resultat = + fonctionSomme(2,4) + <br> ); </script> </body> </html>
Et maintenant regardez : je mamuse changer la description de la fonction de place (faites-en autant), pour voir si elle doit tre dcrite un endroit prcis.
<html> <head> <title> Tests sur les fonctions </title></head> <body> <script language = "javascript"> function fonctionSomme(var1,var2) {return var1 + var2;} document.write(resultat = + fonctionSomme(2,4) + <br> ); </script> </body>
</html> Bon, apparemment, on peut mettre la description dune fonction o on veut.
8 3950 TG PA 00
143
Squence 3
Initiation Javascript
<html> <head> <title> Tests sur les fonctions </title></head> <body> <script language = "javascript"> document.write(resultat = + fonctionSomme(2,4) + <br> ); function fonctionSomme(var1,var2) {return var1 + var2;} </script> </body> </html>
Ben oui, a marche aussi. Et encore plus bas ?
<html> <head> <title> Tests sur les fonctions </title></head> <body> <script language = "javascript"> document.write(resultat = + fonctionSomme(2,4) + <br> ); </script> </body> <script language = "javascript"> function fonctionSomme (var1, var2) {return var1 + var2 ;} </script> </html>
Ah non, l, a marche plus, mais cest normal, car le javascript doit forcment se trouver soit entre <head> et </head>, soit entre <body> et </body>. Et les procdures, a existe en javascript ? Oui, a existe. Ce sont des sous-programmes qui ne comportent pas le mot cl return, mais qui effectuent un traitement quand-mme. Comme en algo, lappel des procdures se comporte comme une instruction, et pas comme une expression. Seulement, il existe une limitation par rapport ce quon a vu en algo : les paramtres rsultats renvoys par une procdure (ce quon a appel les donnes modifies dans le cours dalgo) ne peuvent tre que de deux types : tableau ou objet. Je mexplique : on ne peut pas passer en donnes modifies un paramtre dun type de base, cest--dire une variable. Cela vient du mode de passage des paramtres, sur lequel on na pas la main. Cest javascript qui dcide du mode de passage des paramtres, en fonction de leur catgorie (les variables sont passes par valeur, les objets et les tableaux sont passs par rfrence, ce mode de passage tant quivalent au mode de passage par adresse).
8 3950 TG PA 00
144
Squence 3
Initiation Javascript
On va faire un petit test pour mieux comprendre. On va traduire notre fonction fonctionSomme en une procdure procSomme, dont lalgo est dans votre cours dalgo, et on va voir ce que a donne. Pour mmoire, je vous remets ci-dessous lalgo de cette procdure : Procdure ProcSomme (donnes utilises nombre1, nombre2 : entiers, Donnes modifies ResSomme : entier) Dbut ResSomme nombre1 + nombre2 Fin La traduction javascript serait donc la suivante :
<html> <head> <title> Tests sur les fonctions </title></head> <body> <script language = "javascript"> // description de la procdure function procSomme(var1,var2, resSomme) {resSomme = var1 + var2;} var res ; // appel de la procdure procSomme (2,4,res) ; document.write(resultat = + res + <br> ); // affichage du rsultat </script> </body> </html> Quand on teste, on voit que le rsultat est undefined, ce qui signifie que res na pas de valeur dfinie lextrieur du sous-programme. Donc, les modifications que cette variable a subies lintrieur du sous-programme ne sont pas rpercutes lextrieur du sous-programme.
Alors, bigre, comment va ton sen sortir ? Eh bien quand on voudra avoir des variables en donnes modifies, il faudra les mettre dans un tableau, ou crer un objet. On ne verra pas pour notre part la cration dobjets, mais on a vu les tableaux et on va rcrire notre procdure procSomme en mettant notre variable res dans un tableau.
<html> <head> <title> Pas dide pour le titre </title></head> <body> <script language = "javascript"> // description de la procdure function procSomme(var1,var2, resSomme) {resSomme[0] = var1 + var2;} res = new Array(); // appel de la procdure procSomme (2,4,res) ; document.write(resultat = + res[0] + <br> ); </script> </body> </html>
8 3950 TG PA 00
145
Squence 3
Initiation Javascript
Testez... a marche, et en plus, a ne mange pas de pain. Tiens, a ne mange pas de pain, cest pareil que les cuillers pots, a. videmment quune fonction a ne va pas manger de pain. .... Quoique Quoique (Raymond Devos, de lAcadmie franaise).
9A. dfinition
Ce sont des petits fichiers texte, stocks sur le poste de linternaute, permettant de personnaliser son accs notre site en conservant des informations dune connexion lautre. Ils permettent aussi de conserver certaines informations dune page consulte lautre dun mme site, car les variables javascript ne peuvent pas tre transmises dune page lautre. Les paramtres obligatoires dun cookie sont son nom et sa valeur (comme pour une variable en fait), ses paramtres optionnels sont sa date dexpiration, son chemin, son domaine de validit.
8 3950 TG PA 00
146
Squence 3
Initiation Javascript
La valeur dun cookie : cest une chane de caractres. La date dexpiration : si on ne lindique pas, le cookie sera dtruit la fermeture du navigateur. Le chemin : si on ne le prcise pas, le cookie ne sera accessible que depuis le rpertoire de la page accde ainsi que depuis les ventuels sous-rpertoires de ce rpertoire. Si on prcise un autre chemin, le cookie sera accessible depuis le rpertoire indiqu dans ce chemin, ainsi que depuis les ventuels sous-rpertoires de ce rpertoire. Le domaine : il permet de prciser le serveur sur lequel le cookie est accessible.
Remarques importantes
Tout cookie appartient un seul site. Ce site est le seul connatre ses cookies. i linternaute consulte un site, et que sur la machine de cet internaute, il existe des cookies S appartenant ce site, tous les cookies de ce site sont transmis au serveur chaque fois que la machine de linternaute envoie une requte http au serveur hbergeant le site consult. En javascript, on accde un cookie (cest--dire quon le cre, quon y lit et quon y crit) laide dun objet document.cookie.
8 3950 TG PA 00
147
Squence 3
Initiation Javascript
cest idiot ce que je viens dcrire), Bill Dortch. Cette bibliothque de fonctions javascript est un fichier dextension .js permettant une gestion complte des cookies en javascript (cration, lecture, suppression...). Vous trouverez cette bibliothque sur le net ent tapant Bill Dortch javascript dans un moteur de recherche. Mais avant de nous contenter dutiliser les fonctions de quelquun dautre, je vous propose den crire deux toutes simples : une permettant de crer un cookie (cest--dire de lajouter dans lobjet document.cookie), et lautre permettant daccder un cookie dans lobjet document. cookie (cest--dire de le lire). Nous essayerons ensuite dappeler ces fonctions afin de voir ce que a donne. Ensuite, dans le paragraphe suivant, nous utiliserons des cookies (au moins un) pour transmettre des informations dune page une autre de notre site. Dacc ? Oui, dacc.
8 3950 TG PA 00
148
Squence 3
Initiation Javascript
Une autre utilisation de la mthode indexOf : si, en second paramtre, on indique un indice de dbut de recherche la mthode indexOf, alors la recherche commence partir de cet indice. Le rsultat renvoy, lui, par contre, est la position de dbut de la chane passe en paramtre depuis le dbut de la chane sur laquelle on appelle la mthode indexOf. Euh... Vous me suivez l ? Exemple : je reprends la variable maChaine de lexemple du dessus. Elle vaut toujours Salut les tudiants du cned. Lappel var autreRes = maChaine.indexOf("a", 1) renvoie la valeur 1. En effet, la recherche commence partir du deuxime caractre (caractre dindice 1 dans maChaine), et, comme par hasard, partir du deuxime caractre, quand on recherche "a", il est lindice1 dans maChaine (le deuxime caractre de "Salut les tudiants du Cned" est "a"). Maintenant, si mon appel devient var autreRes = maChaine.indexOf("a", 3), le rsultat renvoy est 15 car, quand on recherche "a" partir du 4e caractre (cest--dire partir du caractre dindice 3), on le trouve lindice 15 de maChaine (cest le 16e caractre).
Remarque
si le caractre recherch ne figure pas dans la chane, la fonction indexOf renvoie la valeur1. La mthode length : cest une fonction qui renvoie la longueur de la chane sur laquelle elle est appele. Exemple : lappel maChaine.length renvoie 27. La mthode subString : cest notre brave fonction sous-chaine de lalgo. Deux utilisations possibles : En indiquant lindice de dbut de lextraction, au quel cas le rsultat sera une chane contenant tous les caractres de la chane source partir de lindice spcifi. Exemple : maChaine.substring(10) renvoie la valeur tudiants du cned. En indiquant lindice de dbut et lindice de fin de la copie, auquel cas, le rsultat sera une chane contenant les caractres de la chane source se situant entre lindice de dbut et lindice de fin. Exemple : maChaine.substring(10, 18) renvoie la valeur tudiant , sans s. Sans s signifie que le caractre de lindice de fin est exclu de lextraction. Revenons notre fonction qui sait rcuprer la valeur dun cookie partir de son nom. Vl lcode, jlai comment : function lireCookie(nomDuCookie) { // La variable posNom contiendra la position de dbut du nom du cookie // La variable posDebutValeur contiendra la position de dbut de la valeur du cookie // La variable posFinValeur contiendra la position de fin de la valeur du cookie // La variable valeur contiendra la valeur du cookie var posNom, posDebutValeur, posFinValeur, valeur;
8 3950 TG PA 00
149
Squence 3
Initiation Javascript
/* on rcupre dans la variable posNom, laide de la mthode indexOf la position du premier caractre du nom du cookie */ posNom = document.cookie.indexOf(nomDuCookie); /* partir de la position du premier caractre du nom du cookie, et de la longueur du nom du cookie, on calcule la position du premier caractre de la valeur */ posDebutValeur = posNom + nomDuCookie.length + 1; /* On calcule maintenant la position du prochain point virgule, qui permet de dterminer la position du dernier caractre de la valeur du cookie */ posFinValeur = document.cookie.indexOf(";", posDebutValeur); /* Si on na pas trouv de point virgule, cest quon est la fin du cookie */ if (posFinValeur == -1) /* Dans ce cas, on rcupre la sous-chane partir de posDebutValeur jusqu la fin de la chaine */ valeur = document.cookie.substring(posDebutValeur); /* sinon, cest--dire si on a trouv un point virgule */ else /* on rcupre la sous-chane se situant entre posDebutValeur et finDebutV leur */ valeur = document.cookie.substring(posDebutValeur, posFinValeur); /* on renvoie la valeur au programme appelant */ return valeur; } Bon, il ne nous reste plus qu appeler nos deux petites fonctions de cration et de lecture pour comprendre comment a marche. Pour mieux se rendre compte quoi servent les cookies, on va crer deux pages : une o on cre le cookie et qui comporte un lien sur lautre page, et lautre qui lit et affiche le cookie. Pour transmettre une information dune page lautre, les cookies sont LA solution. Allez, cest pppppparti pour la premire page!!!
8 3950 TG PA 00
150
Squence 3
Initiation Javascript
<html> <head> <title> Cration du cookie </title></head> <body> <script language = "javascript"> function ajouterCookie(nomDuCookie, valeurDuCookie) { document.cookie = nomDuCookie + "=" + valeurDuCookie + ";path=/"; alert("Merci, votre saisie a t prise en compte"); } </script> Saisissez votre nom : <input type = "text" name = "nom" maxlength = "30" > <br> <button type = "button" name = "monBouton" onClick = "ajouterCookie (cookieNom, nom.value)" > Valider </button> <br> <a href = "lectureCookie.html"> Accder la page suivante </a> </body> </html>
Bon, vous voyez bien ce qui se passe quand vous testez. Cette fentre est simple, alors inutile de lexpliquer en long, en large ou en travers. Pour linstant, on a une erreur sur le lien, puisquon na pas encore cr la page rfrence. Note : jaurais pu me fatiguer un peu plus et mettre un test, pour ne crer le cookie que si un nom a bien t saisi petite flemme... La deuxime page sappelle lectureCookie.html
<html> <head><title> Lecture du cookie </title></head> <body> <script language = "javascript"> function lireCookie(nomDuCookie) { var posNom, posDebutValeur, posFinValeur, valeur; posNom = document.cookie.indexOf(nomDuCookie); posDebutValeur = posNom + nomDuCookie.length + 1; posFinValeur = document.cookie.indexOf(";", posDebutValeur); if (posFinValeur == -1) valeur = document.cookie.substring(posDebutValeur); else valeur = document.cookie.substring(posDebutValeur, posFinValeur); return valeur; } // fin de la fonction document.write (Re-bonjour + lireCookie("cookieNom") + , content que tu sois toujours avec nous); </script> </html>
8 3950 TG PA 00
151
Squence 3
Initiation Javascript
Attention, si vous faites des essais successifs pour cause de bugs. Pensez bien fermer votre explorateur entre chaque test afin que le cookie prcdemment cr soit dtruit. Bon, ben voil pour les kouqui.
On va juste faire un contrle, gnralisable tous les contrles du formulaire : si la zone o linternaute doit saisir son mot de passe est vide lors du clic sur le bouton envoyer, on le signale linternaute, sinon, on envoie le formulaire.
8 3950 TG PA 00
152
Squence 3
Initiation Javascript
Voici le code, jai mis en gras ce qui a chang par rapport la version de la squence 2.
<HTML> <body> <script language = "javascript"> function verif(form) { if (form.motdepasse.value == ) alert(Saisissez votre mot de passe); else form.submit(); } </script> <FORM ACTION = "http://adresse bidon" METHOD = "post" enctype = "html" NAME = "inscription" > Nom : <Input type="text" name="nom" maxlength=15> <br> Cochez si vous tes majeur : <Input type = "checkbox" name = "majeur" value = "vrai"> <br> Sexe : <BR> H: <Input type="radio" name="sexe" value="h"> F: <Input type="radio" name="sexe" value="f"> <br> Commentaires :<BR> <TEXTAREA COLS = 40 ROWS = 3 WRAP = "SOFT"> Mettez ici vos commentaires et ventuellement, votre adresse e-mail </textarea> <br> Je suis plus intress(e) par : <Select name="preference"> <option> les livres <option> les films <option> la musique </select> <br> <br> indiquez votre date de naissance : <Input type = "date" name = "dateNaiss" size = 8 > <br> Choisissez-vous un mot de passe (huit caractres) : <Input type = "password" name = "motdepasse" size = 8 maxlength = 8 > <br> <Input type = "reset" name = "monBoutonAnnuler" value = "Annuler"> <Input type = "button" name = "monBoutonEnvoyer" value = "Envoyer" onClick = "verif(this.form)"> </FORM> Je prendrai en compte votre inscription ds sa rception. </body> </html>
8 3950 TG PA 00
153
Squence 3
Initiation Javascript
Quelques explications :
Vous avez srement vu que dans la description html de la page, jai remplac le bouton submit par :
<html> <head> <title> Parlez-nous de vos gots, cher visiteur </title> <script language = javascript> function saisieArtistes() {
8 3950 TG PA 00
154
Squence 3
Initiation Javascript
var nbArtistes = 0; for (artisteSaisi = prompt(Saisissez un artiste (* pour terminer),);artisteSaisi != *; artisteSaisi = prompt(Saisissez un artiste (* pour terminer),)) { nbArtistes ++; if (nbArtistes == 1) { document.write(<table border = 1>); document.write(<TR> <TD> Ordre de prfrence </TD> <TD> Artiste </TD>); } document.write(<TR> <TD> + nbArtistes + </TD> <TD> + artisteSaisi + </TD> </TR>); } // fermeture de la table document.write(</table>); if (nbArtistes > 0) { document.write(<form name = monFormulaire action =adresse bidon method = POST>); document.write(Saisissez votre adresse e-mail : <input type = text name = email Value = e-mail> <br>); document.write(<button name = monBoutonEnvoyer onClick=if (email.value == \email\) alert(\zone non renseigne\); else monFormulaire.submit() ;> Envoyer </ button>); document.write(</form>); } else history.back(); } // la suite du code ne change pas
document.write(<button name = monBoutonEnvoyer onClick=if (email.value == \email\) alert(\zone non renseigne\); else monFormulaire.submit() ;> Envoyer </ button>);
Vous constatez que jai remplac le bouton submit par un bouton normal, et que les instructions de contrle sont dans lvnement onClick de ce bouton. Expliquons pas pas ces instructions de contrle. if (email.value == \e-mail\). Cette instruction nest pas complique en soi. La question qui se pose cest pourquoi mettre des \ devant chaque quote encadrant la chane de caractre e-mail ? 155
8 3950 TG PA 00
Squence 3
Initiation Javascript
Si je mets des simples quotes, comme, dans mon instruction document.write, jindique entre simples quotes ce qui est crire sur la page, si je ne mets pas les \ pour encadrer la chane e-mail, javascript comprendra que linstruction quil doit excuter est la suivante : document.write(<button name = monBoutonEnvoyer onClick=if (email.value == \ et il va gnrer une erreur car, selon son interprtation, il manque la parenthse fermante. Maintenant, si jencadre ma chane e-mail avec des doubles quotes, sans mettre d\, le navigateur va comprendre que, lors du clic sur le bouton, je lui demande dexcuter linstruction suivante : if (email.value == \ Cette instruction tant incorrecte, le navigateur me gnre un message derreur. Le problme est le mme pour la chane de caractres passe en paramtre la procdure alert. Testez cette page. Bon, a marche. La cration dynamique nous donne la page suivante :
Si je ne renseigne pas mon e-mail, jai le message suivant qui saffiche lorsque je clique sur le bouton envoyer :
Si je renseigne mon e-mail, lorsque je clique sur Envoyer, jai un message derreur qui me dit que le navigateur ne trouve pas la page demande, ce qui est normal, puisquon a indiqu une adresse bidon. Maintenant, ce qui est intressant, cest dafficher le code source de cette page que lon gnre dynamiquement (pour faire a, dans internet explorer, je choisis, dans le menu Affichage, loption de menu Source).
8 3950 TG PA 00
156
Squence 3
Initiation Javascript
Voici le code source qui saffiche, mais sur une seule ligne :
<table border = 1><TR> <TD> Ordre de prfrence </TD> <TD> Artiste </TD></TR><TR> <TD>1</TD> <TD>p</TD> </TR></table><form name = monFormulaire action =adresse bidon method = POST>Saisissez votre adresse e-mail : <input type = text name = email Value = e-mail> <br><button name = monBoutonEnvoyer onClick=if (email.value == e-mail) alert(zone non renseigne); else monFormulaire.submit() ;> Envoyer </ button></form>
Pourquoi ce code se trouve sur une seule ligne ? Parce que jai utilis linstruction document.write pour gnrer le code source de cette page. part a, dans ce code source, on retrouve bien tout ce qui a t tap dans les instructions document.write. Aprs avoir trouv ce code, qui fonctionne mais ne me plat gure (je ne le trouve pas trs joli), je me suis dit quil fallait essayer de lamliorer
Tentatives damliorations
Dabord, cette ligne trop longue, a mnerve. Alors jai essay de la couper. Jai remplac la ligne :
document.write(<button name = monBoutonEnvoyer onClick=if (email.value == \email\) alert(\zone non renseigne\); else monFormulaire.submit() ;> Envoyer </button>);
Par les lignes :
document.write(<button name = monBoutonEnvoyer ); document.write(onClick=if (email.value == \e-mail\) ); document.write(alert(\e-mail non renseign\); ) document.write(else monFormulaire.submit() ;> Envoyer </button>);
a a march : jutilise 4 instructions document.write pour dcrire mon bouton, elles sont mises bout bout comme si ctait une seule. Bon, cest dj mieux. Par contre, quand on affiche le code source de la page gnre, on a toujours tout le code gnr sur une seule ligne. Alors jai remplac la plupart des instructions document.write par des instructions document. writeln. a donne le code source suivant, jai mis en gras les instructions modifies.
<head> <title> Parlez-nous de vos gots, cher visiteur </title> <script language = javascript> function saisieArtistes() { var nbArtistes = 0; for (artisteSaisi = prompt(Saisissez un artiste (* pour terminer),);artisteSaisi != *;
8 3950 TG PA 00
157
Squence 3
Initiation Javascript
artisteSaisi = prompt(Saisissez un artiste (* pour terminer),)) { nbArtistes ++; if (nbArtistes == 1) { document.writeln(<table border = 1>); document.writeln(<TR> <TD> Ordre de prfrence </TD> <TD> Artiste < / T D > < / TR>); } document.writeln(<TR> <TD> + nbArtistes + </TD> <TD> + artisteSaisi + </ TD> </TR>); } // fermeture de la table document.writeln(</table>); if (nbArtistes > 0) { document.writeln(<form name = monFormulaire action =adresse bidon method = POST>); document.writeln(Saisissez votre adresse e-mail : <input type = text name = email Value = e-mail> <br>); document.write(<button name = monBoutonEnvoyer ); document.writeln(onClick=if (email.value == \e-mail\) ); document.writeln(alert(\e-mail non renseign\); ) document.writeln(else monFormulaire.submit() ;> Envoyer </button>); document.writeln(</form>); } else history.back(); } </script> </head> // etcetcla suite ne change pas
Je teste. Ca donne a :
8 3950 TG PA 00
158
Squence 3
Initiation Javascript
La page gnre par notre code a dsormais le code source suivant, plus lisible que quand tout est bourr sur une seule ligne :
<table border = 1> <TR> <TD> Ordre de prfrence </TD> <TD> Artiste </TD></TR> <TR> <TD>1</TD> <TD>Ringo</TD> </TR> <TR> <TD>2</TD> <TD>Gantal Choya</TD> </TR> <TR> <TD>3</TD> <TD>Ernestine Lastar</TD> </TR> </table> <form name = monFormulaire action =adresse bidon method = POST> Saisissez votre adresse e-mail : <input type = text name = email Value = email> <br> <button name = monBoutonEnvoyer onClick=if (email.value == e-mail) alert(e-mail non renseign); else monFormulaire.submit() ;> Envoyer </button> </form>
E nsuite, je me suis dit : Tout ce code directement dans onClick, cest cradouille quand-mme. On va faire une fonction. Alors jai crit, sur une seule ligne :
8 3950 TG PA 00
Squence 3
Initiation Javascript
V oici la premire des deux solutions. Jy cris le code de la fonction de manire ce quil se trouve dans la page que lon gnre dynamiquement, laide de document.writeln.
<html> <head> <title> Parlez-nous de vos gots, cher visiteur </title> <script language = javascript> function saisieArtistes() { // compteur dartistes var nbArtistes = 0; for (artisteSaisi = prompt(Saisissez un artiste (* pour terminer),);artisteSaisi != *; artisteSaisi = prompt(Saisissez un artiste (* pour terminer),)) { nbArtistes ++; if (nbArtistes == 1) { // construction du dbut du tableau document.writeln(<head>); document.writeln(<script>); document.writeln(function verif(form) {if (form.email.value == \e-mail\) alert(\Mot de passe non renseign\); else form.submit();}); document.writeln(<\/script>); document.writeln(</head>); document.writeln(<body>); document.writeln(<table border = 1>); d ocument.writeln(<TR> <TD> Ordre de prfrence </TD> <TD> Artiste </TD></TR>); } d ocument.writeln(<TR> <TD> + nbArtistes + </TD> <TD> + artisteSaisi + </ TD> </TR>); } // fermeture de la table document.writeln(</table>); if (nbArtistes > 0) { // On complte la page avec une zone pour saisir lemail et un bouton pour envoyer le // formulaire document.writeln(<form name = monFormulaire action =adresse bidon method = POST>);
8 3950 TG PA 00
160
Squence 3
Initiation Javascript
document.writeln(Saisissez votre adresse e-mail : <input type = text name = email Value = e-mail> <br>); document.writeln(<button name = monBoutonEnvoyer onClick=verif(this.form)> Envoyer </button>); document.writeln(</form>); } else history.back(); document.writeln(</body>); } </script> </head> // etcetc la suite ne change pas
Parlons un peu des modifications apportes notre code source. Comme tout code javascript doit tre plac entre les balises <head> et </head> ou bien les balises <body> et <body>, dans la page que nous construisons dynamiquement, je rajoute les balises <head> et </head> laide des instructions : document.writeln(<head>); et document.writeln(</head>);
Ensuite, dans cette page construite dynamiquement, entre les balises <head> et </head>, il doit y avoir les balises <script ..> et </script>. Cest pourquoi jai rajout les instructions :
document.writeln(<head>); document.writeln(<script>); // Cest entre ces deux balises que je vais rajouter le code source de la fonction verif document.writeln(<\/script>); document.writeln(</head>);
Enfin, je rajoute le code source de la fonction verif, ce qui nous donne le bloc de code suivant :
document.writeln(<head>); document.writeln(<script>); document.writeln(function verif(form) {if (form.email.value == \e-mail\) alert(\Mot de passe non renseign\); else form.submit();}); document.writeln(<\/script>); document.writeln(</head>);
Sur le mme principe, jai rajout, dans la page que nous construisons dynamiquement, les balises <body> et </body>. Elles sont optionnelles. Pour vous en persuader, il vous suffit de mettre en commentaires les instructions ayant pour rle de rajouter ces deux balises, comme a
8 3950 TG PA 00
161
Squence 3
Initiation Javascript
// document.writeln(<body>); ..... // document.writeln(</body>); // dans ce cas, les balises <body> et </body> ne figureront pas dans le document // que nous construisons dynamiquement.
de tester notre page et dafficher le code source de la page que nous gnrons dynamiquement. Vous pouvez constater quon ny voit pas de balises <body> et </body>. Certain(e)s se demandent peut-tre pourquoi, quand on rajoute la balise fermante </script> laide de linstruction document.writeln, on est oblig de faire prcder le / dun \. En effet, pour que la balise fermante </script> sinscrive correctement dans le document que nous gnrons dynamiquement, on doit crire document.writeln(<\/script>);. Pourquoi ne peut-on pas crire tout simplement document.writeln(</script>); ? Tout dabord, essayons denlever ce fameux \ et regardons ce que a donne. Dans le code source, je remplace : document.writeln(<\/script>); par : document.writeln(</script>); Ae, ae, quel carnage quand je raffiche ma page ! ! Vous aussi ? Par contre, si la place, jcris: document.writeln(<+/script>); L, a fonctionne. Ce qui est bizarre, cest que linstruction document.writeln(</table>); ne pose pas de problme, de mme que linstruction document.writeln(</head>);. Donc, cest, seule, linstruction document.writeln(</script>); qui pose problme si on la laisse comme a. Pourquoi ? Eh bien, quand on crit document.writeln(</script>);, ce que voit javascript, cest, dune part, document.writeln(, qui est une instruction incorrecte, et dautre part </script>, qui est lindicateur de fin de script, do ce carnage si on ncrit pas document.writeln(<\/script>); ou document.writeln(<+/script>); (cette dernire solution est rigolote, elle consiste tromper linterprteur javascript sur ce quil lit. En effet, comme le < et le / ne sont pas colls, il ne voit pas que cest crit </script>, le bougre ! !). Pour finir lexplication de cette version de notre page, il ne reste plus qu prciser que linstruction document.writeln(<button name = monBoutonEnvoyer onClick=verif(this.form)>
8 3950 TG PA 00
162
Squence 3
Initiation Javascript
Envoyer </button>); permet de faire en sorte que la fonction verif soit appele lorsque linternaute clique sur le bouton Envoyer. On peut galement rajouter une dernire remarque. On peut tout fait remplacer : if (form.email.value == \e-mail\) alert(\Mot de passe non renseign\); par : if (form.email.value == e-mail) alert(Mot de passe non renseign); au cas o il sen trouve parmi vous qui naiment pas les \. Passons maintenant la dernire solution, celle o on utilise un fichier .js dans lequel se trouve la fonction verif. En repartant de la solution prcdente, il suffit de remplacer les lignes : document.writeln(<script>); document.writeln(function verif(form) {if (form.email.value == \e-mail\) alert(\Mot de passe non renseign\); else form.submit();}); document.writeln(<\/script>); par la ligne : document.writeln(<script language = javascript src = verifier.js><\/script>);. Ensuite, il faut crer le fichier verif.js, dans lequel figurera le code source de la fonction verif, comme a :
8 3950 TG PA 00
163
Squence 3
Initiation Javascript
Alors voil lexplication : internet explorer ne sait pas grer les accents dans les fichiers javascript externes. Pour que a fonctionne, il faut donc : remplacer nos messages avec accents par des messages sans accent, genre Renseignez votre e-mail, mais ce nest pas toujours facile; remplacer les caractres accentus par leur code html, dans notre cas, le message devient E-mail non renseign´. Voil, jen ai fini avec la mise au point sur cette partie concernant lcriture des contrles de saisie laide de javascript.
8 3950 TG PA 00
164