JavaScript - Isis TRUCKisis.truck.free.fr/Site/fichiers/CM_Javascript.pdf · Eléments de langage...

44
JavaScript M2 CogniTech, UPO par Isis TRUCK, PR Informatique UP8 Inspiré de diverses sources comme https://developer.mozilla.org/ http://www.commentcamarche.net/ http://www.toutjavascript.com http://www.thesitewizard.com/javascripts/change-style-sheets.shtml

Transcript of JavaScript - Isis TRUCKisis.truck.free.fr/Site/fichiers/CM_Javascript.pdf · Eléments de langage...

JavaScript

M2CogniTech,UPOparIsisTRUCK,PRInformatiqueUP8

Inspirédediversessourcescommehttps://developer.mozilla.org/

http://www.commentcamarche.net/http://www.toutjavascript.com

http://www.thesitewizard.com/javascripts/change-style-sheets.shtml

JavaScript:motivations•  OnavudansleTP1(exercice9)leslimitationsd’un

langagedetypeHTML•  Ilfautbiendistinguerlangagedeprogrammationet

langagedebalisage(trèsrestrictif!)•  Javascriptestunlangagedescript(àmi-cheminentreles

deux)•  Iln'aaucuneutilitéentantquelangageautonomemaisest

conçupours'intégrerfacilementauseind’unnavigateurWebparexemple

•  Lorsqu'utiliséauseind'unenvironnementhôte,JavaScriptpeutêtrereliéauxobjetsdecetenvironnementetainsifournirunmoyendecontrôlercesobjetsparlebiaisdelaprogrammation.

•  Ilestinterprétésurleposteduclient2

Intérêts(parmid’autres)

•  L’exécutiondecode(JavaScriptenparticulier)surleposteclientpeut:– Améliorerl’interactivité(tempsderéponsepluscourtcarinutiled’allerinterrogerleserveur)

– Améliorerlesdébitssurleréseau(éviterdesenvoiscontenantdeserreurs,etdoncdesurchargerinutilementleréseau,parexemple:testd’unformulaireavantl’envoi)

3

JavaScriptdebase•  LeJavaScriptdebase(le«noyau»)contientunensembled'objets

debase(Array,DateetMath)ainsiqu'unensembled'élémentsdebasepourtoutlangagedeprogrammation:opérateurs,structuresdecontrôleetautresinstructions.

•  ilpeutêtreétendupourêtreapplicableàn’importequeldomaineenluiajoutantdesobjetssupplémentaires.Exemples:–  LeJavaScriptclientétendlelangagedebaseenluiajoutantdesobjets

destinésàcontrôlerunnavigateuretàmanipulerleDOM.Parexemple,lesextensionsclientpermettentauxapplications

•  d'ajouterdesélémentsàunformulaireHTML,•  derépondreauxactionsdel'utilisateurtelsquelesclicsdesouris•  degérerl'entréedesformulairesetlanavigationentrelespages,etc.

–  LeJavaScriptserveurétendlelangagedebaseenfournissantdesobjetsrelatifsaubonfonctionnementdeJavaScriptducôtéduserveur.Parexemple,lesextensionsserveurpermettentauxapplicationsdemanipulerdesfichiersprésentssurleserveur.

4

InteractionavecHTML(XHTML,HTML5…)

•  MéthodespourinsérerducodeJavascriptdansunepagetypeHTML:–  Utilisationdelabalise<script>:codedanslapageHTML

•  Déclarationdesfonctionsdansl’entête(<head>)•  Appeldefonctionouexécutiond’unecommandeJavaScript(dans<body>)

–  Balise<script>:insertiond’unfichierJavaScriptexterne•  Déclarationdufichier.jsdansl’entête(<head>)•  Appeldefonctionouexécutiond’unecommandeJavaScript(dans<body>)

–  UtilisationdansuneURL:•  UneURLpeutêtreuneexécutiondefonctionJavaScript(entre<a>…</a>ou<form>…</form>)

–  Utilisationdenouveauxattributsdebalisepourlagestiond’événementsutilisateur

•  <baliseonEvenement="Action_Javascript_ou_Fonction();">•  Exemplesd’événements:onClick,onMouseOver… 5

Méthode1:JavaScriptdansleHTML

•  EcrituredeJavaScriptauseind'unepage:•  Syntaxe:

–  Exple:Mettreunealerte,dansleheadoudanslebody:<scripttype="text/javascript">//<![CDATA[alert("Houston,we’vegotaproblem");//]]></script>

<noscript>Votrenavigateurnesupportepaslejavascript</noscript>

–  NB1:Ici,alert()n’apasbesoind’êtredéclarée:c’estunefonction(méthode)deJavaScript,pasunefonctioncrééeparl’utilisateur.

–  NB2:lesélémentssituésdansl'en-têtesecomportentcommedesdéclarations,ilsnes'exécutentpasdirectement.Lesélémentssituésdanslecorpss'exécutentaufuretàmesureduchargementdelapage

6

Méthode1:JavaScriptdansleHTML(2)

–  Exple2:appelerunefonctioncrééeparl’utilisateur:<head>

<scripttype="text/javascript">functionmaFonction(){…;}</script></head><body><ahref="javascript:maFonction();">appelerlafonction</a>

</body>7

Méthode2:insertiond’unfichierexterneàlapage

•  Déclarationd'unfichierJavaScriptexterneàlapage=>mettrelabalise<script>dans<head>:<scripttype="text/javascript"

src="FichierJavascript.js"></script><noscript>Votrenavigateurnesupportepasle

javascript</noscript>=>appelerlafonctiondans<body>:<ahref="javascript:maFonction();">appelerlafonction</a>Oubien:<p>passezlasouris<a

href=""onMouseOver="maFonction();">ici</a></p> 8

Elémentsdelangage•  Variables

=lieuxdemémorisationdeschiffresetdescaractères.•  L’affectationpermetd’attribuerunevaleuràunevariable–  Syntaxe:target = source –  Affectationconditionnelle:var = (condition) ? expr_alors : expr_sinon

–  Pourassignerunechaînedecaractères,onlaplaceentreguillemetsdoublesousimples

–  Exemples:•  a=3•  b=“helloworld”•  c=‘hellofromParis8’•  a=b•  a=3*4*3+2

9

Elémentsdelangage(2)

– Attentionàbiendistinguerl’affectation(=)delacomparaison(==)

–  Ilexistedesnotationsabrégéescomme:•  x+=y(équivalentàx=x+y)•  x--(équivalentàx=x-1décrémentation)

•  Commentaires://commentairesur1ligne /*commentairessur plusieurslignes*/

•  Séparateurd’instructions:‘;’ouretourchariot

10

Typesdevariables?•  pasobligatoirededéclarerletypedevariablesquel'onutiliseen

JavaScript,contrairementàdeslangagesévoluéscommeC,C++ouJavapourlesquelsilfautprécisers'ils'agitd'entier(int),denombreàvirguleflottante(float),decaractères(char),etc.=>ils’agitd’unlangageàtypagefaible

•  Portéedesvariables:locale(uniquementdanslescriptoulafonction)ouglobale(entoutpointduscript)–  lorsqu'unevariableestdéclaréesanslemotclévar,(defaçonimplicite),elle

estaccessibledepartoutdanslescript(n'importequellefonctionduscriptpeutfaireappelàcettevariable).Onparlealorsdevariableglobale

–  Laportéed'unevariabledéclaréedefaçonexplicite(précédéedumot-clévar),dépenddel'endroitoùelleestdéclarée.

•  Unevariabledéclaréeaudébutduscript,avanttoutefonction,seraglobale.Ellepeutêtreutiliséen'importeoùdanslescript

•  Unevariabledéclaréeexplicitementdansunefonctionaurauneportéelimitéeàcetteseulefonction,c'est-à-direqu'elleestinutilisableailleurs.Onparlealorsdevariablelocale.

11

Typesdevariables(2)•  JavaScriptn'autoriselamanipulationquede4typesdedonnées:–  desnombres:entiersouàvirgule–  deschaînesdecaractères(string):unesuitedecaractères

–  desbooléens(variablesàdeuxétatspermettantdevérifierunecondition):

•  false:résultatestfaux•  true:résultatestvrai

–  desvariablesdetypenull:unmotcaractéristiquepourindiquerqu'iln'yapasdedonnées

12

Nomdesvariables•  nomd’unevariablepeutêtreaussilongquesouhaité,maisildoit:

–  commencerparunelettre(majusculeouminuscule)ouun"_"–  comporterdeslettres,deschiffresetlescaractères_et&(pasd’espaces!)–  Ilnepeutpasêtreundesnomssuivants(nomsréservés):

•  abstract•  booleanbreakbyte•  casecatchcharclassconstcontinue•  debuggerdefaultdeletedodouble•  elseexportextends•  falsefinalfinallyfloatforfunction•  goto•  if,implements,import,in,infinity,instanceof,int,interface•  label,long•  native,new,null•  package,private,protected,public•  return•  short,static,super,switch,synchronized•  this,throw,throws,transient,true,try,typeof•  var,void,volatile•  while,with•  (ainsiquetouslesnomsdesobjetsJavascript)

13

Opérateurs(1)

14

Opérateurs logiques

&& Opérateur ET : implique que toutes les conditions soient réalisées

|| Opérateur OU : implique qu'au moins une des conditions soit réalisée

! Opérateur de négation : implique que la condition ne soit pas réalisée

Opérateurs de calcul

+ Addition de deux valeurs numériques

- Soustraction de deux valeurs numériques

* Multiplication de deux valeurs numériques

/ Division de deux valeurs numériques

= Affectation d'une valeur à une variable

% Reste de la division entière entre deux valeurs numériques 9 % 3 vaut 0, 7 % 2 vaut 1, 7 % 8 vaut 7 ...

Opérateurs d'incrémentation

++ Incrémente de 1 la valeur de la variable

-- Décrémente de 1 la valeur de la variable

Opérateurs(2)

15

Opérateurs d'affectation

+= Ajoute à la variable de gauche la variable de droite. Stocke la nouvelle valeur dans la variable de gauche

-= Soustrait à la variable de gauche la variable de droite. Stocke la nouvelle valeur dans la variable de gauche

*= Multiplie la variable de gauche par la variable de droite. Stocke la nouvelle valeur dans la variable de gauche

/= Divise la variable de gauche par la variable de droite. Stocke la nouvelle valeur dans la variable de gauche

%= Calcule le modulo entre deux valeurs numériques. Stocke la nouvelle valeur dans la variable de gauche

Opérateurs(3)

16

Opérateurs de comparaison

== opérateur d'égalité : retourne 1 si les éléments comparés sont égaux, 0 sinon

!= opérateur de différence : retourne 1 si les éléments comparés sont différents, 0 sinon

< opérateur d'infériorité stricte : retourne True si la comparaison est correcte, False sinon

<= opérateur d'infériorité : retourne True si la comparaison est correcte, False sinon

> opérateur de supériorité stricte : retourne True si la comparaison est correcte, False sinon

>= opérateur de supériorité : retourne True si la comparaison est correcte, False sinon

=== opérateur d'identité : compare la valeur et le type des variables, retourne 1 si les éléments comparés sont les mêmes, 0 sinon

!== opérateur de différence : compare la valeur et le type des variables, retourne 1 si les éléments comparés sont différents, 0 sinon

Exemplesd’expressions

•  arithmétique(3+4) * (56.7 / 89)

•  chaînedecaractères"parce" + " " + "que"

•  logiquetemp == 37

h2o = (temp<100) ? "eau" : "vapeur";

h2o = (temp>0) ? ((temp<100) ? "eau" : "vapeur") : "glace";

17

Exemples•  Ladate:<html> <head> <title>Page dynamique</title> </head> <body> <script type = "text/javascript"> //<![CDATA[ date = new Date(); document.writeln("Nous sommes le ", date); //]]> </script> </body> </html>

18

Structuresdecontrôle•  Instructionsdebranchement

–  ifelse:if(condition){instructions;}[else{instructions;}]

–  switchcase:switch(variable){case‘valeur1’:

codeàexécutersi“variable==‘valeur1’”;break;

case‘valeur2’:codeàexécutersi“variable==‘valeur2’”;break;

case‘valeur9’:codeàexécutersi“variable==‘valeur1’”;break;

default:codeàexécutersitouslesautrescasontéchoué;break;

}19

Structuresdecontrôle

•  Boucles–  for:

for (i=1;i<n;i++) {instructions;} for (p in objet) {instructions;}

– while:while (condition) {instructions;}

–  dowhile:do {instructions;} while (condition)

–  Sortied’uneboucle:break; –  Itérationsuivanted’uneboucle(pour“skip”uneitération):continue;

20

Fonctions•  Définition:

function nomFonction(param1, ..., paramN) {

// code JavaScript

return expression ;

}

•  Appel:nomVariable = nomFonction(exp1, ..., expN);

•  LesfonctionsJavaScriptontunepropriétéspécialeappeléearguments,quicontientuntableau(Array)desparamètresprisenentrée.Enutilisantlapropriétélengthd’unArray,ilestpossibled’itérersurchaqueparamètreautraversdutableau.

•  =>Celapermetdedévelopperdesfonctionsquichangentenfonctiondunombredeparamètres.

21

Exempledefonctionfunction somme() { var argv = somme.arguments; var argc = somme.arguments.length; var result = 0; for (var i = 0 ; i < argc ; i++) { result += argv[i]; } return result; }

Queretournesomme(1,2,3)?etsomme(2)?

22

Fonctions:passagedesparamètres(1)

•  Lesvariablessontpasséesparvaleurs,lesobjetsparréférence.LesArraysontdesobjets

•  Casd'unevariablesimple–  Lafonctiontest()ajouteunechaîneàunechaînedonnéeenparamètre.

function test(z)

{ z = z + "suffixe";

}

var x = "démo";

test(x); document.write(x);

=>Résultat:démo –  Onpeutvérifierquelavariablexn'estpasmodifiéehorsducontextedela

fonction.–  Lamêmechosesevérifieraitavecunnombre.

23

Fonctions:passagedesparamètres(2)

•  Casd'unobjetStringvar x = new String("démo"); test(x);

document.write(x);

=>Résultat:démo – LesobjetssimplescommeString,Boolean,Numbersontaussipassésparvaleur.

24

Fonctions:passagedesparamètres(3)

•  Casd'unobjetArray–  Lafonctiontestaajouteunélémentàuntableaudonnéenparamètre.

function testa(a) {

a.push("ajouté"); }

x = new Array("un", "deux", "trois");

testa(x); document.write(x);

=>Résultat:un,deux,trois,ajouté –  Onvoitqu'unobjetArrayestpasséparréférence,puisquel'élément

ajoutédanslecorpsdelafonctionresteinclusdansletableauaprèsl'appeldelafonction.

25

Fonctions:passagedesparamètres(4)

•  Celavaut-ilaussipouruntableaudéclarécommeunlittéral?

var y = [1, 2, 3];

testa(y); document.write(y);

Résultat:1,2,3,ajouté =>oui,celavautaussi

26

Fonctions:passagedesparamètres(5)

•  Enconclusion,sil'onveutpasserunevariablesimpleparréférence,ilfautl'incluredansuntableau:x = "essai"; x = [x]; testa(x); x = x.join(' '); document.write(x);

•  Résultat:essai ajouté •  Lafonctionjoin(String separ)transformele

tableauenchaînedecaractères(lesélémentsétantséparésparsepar)aprèsl'appeldelafonction.

•  Celaalourditlecodemais,restelemoyenleplussimpledepasserunechaînedecaractèresparréférence.

27

Fonctions:passagedesparamètres(6)•  Autrepossibilité(pluscompliquée)pourpasserunechaîneparréférence

function testb(a) { var x = a[0]; x += "suffixe"; a[0] = x; } x = "essai"; x = [x]; testb(x); x = x[0]; document.write(x); Résultat:essaisuffixe

28

Lesobjetsprédéfinis •  Objetsdunoyau

29

Nomdel'objet Description

Array L'objetArraypermetdecréerdestableaux.Ilpossèdedenombreusesméthodespermettantd'ajouter,desupprimeroud'extrairedesélémentsd'untableauainsiquedelestrier.

Boolean L'objetBooleanpermetdecréerdesvaleursbooléennes,c'est-à-diredesélémentspossédantdeuxétats:vraietfaux.

Date L'objetDatepermetdecréerdesdatesetdesdurées.Ilproposedesméthodespermettantdelesmanipuler.

Function L'objetFunctionpermetdedéfinirdesfonctionspersonnalisées.

Math L'objetMathpermetdemanipulerdesfonctionsmathématiques,commeparexemplelesfonctionstrigonométriquesouencorelafonctiongénérantunnombrealéatoire,etc.

Number L'objetNumberestunobjetpermettantdefairedesopérationsdebasesurlesnombres.

RegExp L'objetRegExppermetdecréerdesexpressionsrégulières,c'est-à-diredesélémentspermettantdefairedesopérationsavancéessurleschaînesdecaractères.

String L'objetStringproposeunegrandevariétédeméthodespermettantdemanipulerdeschaînesdecaractères.

Lesobjetsprédéfinis(2)

•  Objetsdunavigateur–  navigator:quicontientdesinformationssurlenavigateurdeceluiquivisitelapage

–  window:c'estl'objetoùs'affichelapage,ilcontientdoncdespropriétésconcernantlafenêtreelle-mêmemaisaussitouslesobjets-enfantscontenusdanscelle-ci

–  location:contientdesinformationsrelativesàl'adressedelapageàl'écran

–  history:c'estl'historique,c'est-à-direlalistedeliensquiontétévisitésprécédemment

–  document:ilcontientlespropriétéssurlecontenududocument(couleurd'arrièreplan,titre,...)

30

Objetwindowwindowestl'objetprincipaldanslemodèleobjetJavaScript•  Propriétés

closed(Indicateurdefermeturedefenêtre)defaultStatus(Textepardéfautdelabarredestatut)name(Nomdelafenêtre)opener(Fenêtreouvrante)screenLeft(Positionhorizontaledelafenêtrenavigateur.)screenTop(Positionverticaledelafenêtrenavigateur.)status(Textedelabarredestatut)

•  Méthodesalert()(Afficheunmessaged'information)blur()(Enlèvelefocusàlafenêtre)clearInterval()(Arrêtel'exécutiond'untraitementàintervallerégulier)clearTimeout()(Suspenduneminuterie)close()(Fermelafenêtre)confirm()(PermetlechoixentreOuietNon)focus()(Donnelefocusàlafenêtre)home()(Ouvrelapagededémarragedunavigateur)moveBy()(Déplacelafenêtre)moveTo()(Positionnelafenêtre)

31

Objetwindow(2)•  Méthodesdewindow(suite)

open()(Ouvreunpopup)print()(Imprimelapageencours)prompt()(Ouvreuneboîtedesaisie)resizeBy()(Agranditouréduitlatailled'unefenêtre)resizeTo()(Redimensionneunefenêtre)scrollBy()(Déroulelesascenseurs)scrollTo()(Positionnelesascenseurs)setInterval()(Lanceuntraitementàintervallerégulier)setTimeout()(Déclencheuneminuterie)stop()(Arrêtelechargementdelapage)

•  Sous-objetsdocument(Objetdocumentvisiblesurlapage)external(ObjetpropreàInternetExplorer)frames(Tableauxdesframes)history(Objetpermettantdenaviguerdansl'historique)location(Informationssurl'adressedelapage)parent(Fenêtremèredujeudeframes)screen(Informationsurl'écran)self(Fenêtreencours)top(Fenêtreinitialedujeudeframes) 32

Objetdocument •  L'objetdocumentestprobablementl'undesobjetslesplusimportantsdumodèleobjet

JavaScript.Ilpermetd'accéderàtouslesélémentsaffichéssurlapage,decontrôlerlessaisies,demodifierl'apparenceetlecontenu.

•  Propriétés(nonexhaustif)bgColor(Couleurdefonddepage)cookie(Chaînecontenantlescookiesdudomaine)fgColor(Couleurdutexte)fileSize(Tailledelapageenoctets)lastModified(Datededernièremodification)location(Urldelapage)referrer(Adressedelapaged'origine)title(Titredelapage)

•  Méthodes(nonexhaustif)getElementById()(RetourneunobjetHTMLàpartirdesonid)getElementsByName()(RetourneunobjetHTMLàpartirdesonnom)getElementsByTagName()(Retourneuntableaud'objetsàpartirdeleurbalise)write()(Ecritdutextedansledocument)

•  Sous-objetsforms(Tableaudesformulairesdudocument)images(Tableaudesimagesdelapage)

33

Lire/écrire

•  prompt() – Ouvreuneboîtededialogueavecunezonesaisieet2boutons(OKetAnnuler),

–  retournel'informationlue•  confirm()

– Ouvreuneboîtededialogueavec2boutonsOKetAnnuler,

–  retourneunbooléen•  alert()

–  Permetd‘écrireunmessagedansunefenêtre

34

Lire/écrire:exemple<html> <head>

<title>Utilisation de prompt() et d'alert()</title>

</head>

<body>

<script type = "text/javascript">

//<![CDATA[

annee = prompt('En quelle année sommes-nous ? ', '2018'); alert('Vous avez répondu : ' + annee);

//]]>

</script>

</body>

</html>

35

Écrireavecdocument.write()<html>

<head> <title>Utilisation de document.write</title>

</head>

<body>

<script type = "text/javascript">

//<![CDATA[ document.write('Hello world !');

//]]>

</script>

</body>

</html>

36

Ouvrirunenouvellefenêtre<script type = "text/javascript"> //<![CDATA[ fenetre = open('', '', 'height=50, width=300,

status=yes'); fenetre.document.write('<html>'); fenetre.document.write('<head>'); fenetre.document.write('<title>' + 'Titre fenetre'

+ '</title>'); fenetre.document.write('</head>'); fenetre.document.write('<body>'); fenetre.document.write('Texte dans la fenetre'); fenetre.document.write('</body>'); fenetre.document.write('</html>'); //]]>

</script>

37

Encadrerlesitems(avecjQuery)•  Encadrerlesitemsd’unelisteaupassagedelasouris:

–  //codeHTML<ul id="liste"> <li>texte1</li> <li>texte2</li> <li>texte3</li> </ul>

–  //codecss.li_hover { border:1px solid black; }

–  //codeJavaScript$("#liste li").hover( function(){

$(this).addClass('li_hover'); }, function(){ $(this).removeClass('li_hover'); } );

38

JavaScriptetCSS•  Enreprenantl’exempledeVermeer(cf.cours1,page28),dansunfichier

JSexterne,onpourraainsimodifierlalargeurdu<div>vialasyntaxesuivante:document.getElementById("peinture").style.width =

"100px"; (Onaccèdeàl’élémentdontl’idestpeintureetonchangesalargeur(à100pixels))

•  Delamêmefaçon,pourchangerdynamiquementlestyle,ilfautmarierJavaScriptetCSSen,parexemple:

–  créant2baliseslinksuccessivesdansleHTMLcontenantl’attributrel(avec2valeursdistinctes:altetstylesheet,parexemple)

–  affectantàlavariablelientouslesnœudsnomméslink:var lien = document.getElementsByTagName("link") ;

–  testantlien[i].rel.indexOf("stylesheet") != -1 –  affectantlien[i].disabledàtrueoufalse,selonlescas

39

Formulairesetvérification(1)•  OnutiliselabaliseHTMLformetonfaitdestestssurlesvariablesrécupéréesviaJS•  Exemple1:Changerdynamiquementlecontenud’unchamptexte: <form>

Nom du personnage : <br /> <input type="text" name="le-nom" id="nomP" value="Mickey" />

<input type="submit" onclick="switch_name();return false;" name="chg" value="Changer !" />

</form>

•  Laformenelle-mêmen’estpasvisible.•  Lalargeurpardéfautd’unchamptextest20caractères.•  L’appelàl’événementJSsefaitgrâceàonclick="switch_name();" •  LescriptJScontient: function switch_name() {

nom=document.getElementById("nomP");

if (nom.value=="Mickey") nom.value="Donald";

else nom.value="Mickey”;

}

40

Formulairesetvérification(2)•  OnutiliselabaliseHTMLformetonfaitdestestssurlesvariables

récupéréesenmodeGETouPOSTviaduPHP(nontraitédanscecours)•  Exemple2:

<form> Mot de passe: <input type="password" name="pwd"> </form>

•  Exemple3:<form name="input" action="form_action.php" method="get">

Nom de login: <input type="text" name="user"> <input type="submit" value="Valider">

</form>

•  Ilyaégalementdesboutonsradio,etc.Voir:http://www.w3schools.com/html/html_forms.asp

41

Conseils(1)•  Document.write

–  Lecomportementdecettefonctionestproblématique.Lorsduchargementd'unepageHTMLcettefonctionajoutelachaînepasséeenparamètreaucontenu.Unefoislapagechargée,cettefonctionremplacetotalementleHTMLdelapageparlachaineenparamètre.

–  Onavuplushautquelechargementd'unepageHTMLestséquentiel,c'estunexercicepérilleuxpourlenavigateurquederajouterducontenuàunepageentraindecharger.Sic'estpérilleux,lesbugsnesontpasloin.Pouréviterlescomportements«étranges»ilnefautpasutiliserdocument.write()

–  L'alternativeestd'utiliserlesstandardsetplusprécisémentleDOM.SionveutrajouterducontenuàunepageHTMLleplussimpleestdeplacerunélémentvideàl'endroitvouluetdeleremplirunefoislapagechargée.Sil'onappliquelesrecommandationssurlaplacede<script>,celadonne:

42

Pourremplacerdocument.write<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEhtml><html><head><metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"/><title>Unepageweb</title></head><body><h1>Titredelapage</h1><p>Aujourd’hui,j’ai</p><pid="dynamique"></p><p>ettoutesmesdents</p><scripttype="text/javascript">document.getElementById("dynamique").innerHTML="8ans";</script></body></html>

43

Conseils(2)

•  LesscriptsJavaScriptdoiventêtreplacésdansunfichierexterneàlapageHTML.

•  Habituellementonplacelabalised'insertiondesfichiersdansle<head>.

•  Mais,pourunequestiondeperformancesonpeutpréférerlaplaceràlafindelapage,justeavant</body>

•  ÀnoterquelesdeuxméthodessontvalidesdupointdevuedelaspécificationHTMLetXHTML.

44