• Aucun résultat trouvé

[PDF] Support de cours web Ajax pour débutant avec exemples - Cours Ajax

N/A
N/A
Protected

Academic year: 2021

Partager "[PDF] Support de cours web Ajax pour débutant avec exemples - Cours Ajax"

Copied!
36
0
0

Texte intégral

(1)

ANF Dev Web ASR – Carry-le-Rouet

25 octobre 2012

AJAX

 

 

Magali  Contensin  

 

(2)

Plan

¨ 

Présentation d’AJAX  

¨ 

Principe

¨ 

Etapes

¨ 

Prendre en compte la latence

¨ 

Support par les navigateurs

¨ 

Inconvénients

(3)

Présentation d’

liste de tâches

Google maps

agenda

chat

(4)

A

synchronous

J

avascript

A

nd

X

ML

Combinaison de technologies :

(X)HTML & CSS – présentation et contenu

DOM – manipulation du contenu

Objet XMLHttpRequest – communication avec le serveur

XML – échange de données (pas obligatoire – texte, JSON)

JavaScript

Jesse James Garrett - 2005

Ajax: A New Approach to Web Applications

asynchrone

I

synchrone

(5)

Plan

¨ 

Présentation d’AJAX  

¨ 

Principe

¨ 

Etapes

¨ 

Prendre en compte la latence

¨ 

Support par les navigateurs

¨ 

Inconvénients

(6)

Actualiser une

partie d’une

page web

(7)

Principe

serveur

1

HTML  

(8)

Principe

serveur

1

2

HTML  

(9)

Principe

serveur

1

pays=Angleterre

2

3

Requête XMLHTTP

JS  

HTML  

AJAX

(10)

Principe

serveur

4

Londres, Manchester

Texte  brut  ou  extrait  de  code  HTML  

ou  JSON  

ou  XML  

1

pays=Angleterre

2

3

Requête XMLHTTP

JS  

HTML  

AJAX

(11)

Principe

serveur

pays=Angleterre

2

3

4

5

Requête XMLHTTP

Londres, Manchester

JS  +  DOM  

1

JS  

Texte  brut  ou  extrait  de  code  HTML  

ou  JSON  

ou  XML  

HTML  

(12)

Plan

¨ 

Présentation d’AJAX  

¨ 

Principe

¨ 

Etapes

1. 

page web HTML

2. 

script côté serveur

3. 

script JavaScript

¨ 

Prendre en compte la latence

¨ 

Support par les navigateurs

¨ 

Inconvénients

(13)

Etape 1

– page web HTML

<!DOCTYPE  html  PUBLIC  "-­‐//W3C//DTD  XHTML  1.0  Strict//EN"  "hMp://www.w3.org/TR/xhtml1/DTD/xhtml1-­‐strict.dtd">    

<html  xmlns="hMp://www.w3.org/1999/xhtml">   <head>  

<Utle>test</Utle>  

<script  type="text/javascript"  src="ajax.js"></script>   </head>  

<body>  

 <form  acUon="traite_form.php"  method="post">      <div>  Choisir  une  agence  :  <br  />  

 Nom  <input  type="text"  name="nom"  />  <br  />  

 Pays  <select  name="pays"  onchange="showCiUes(this.value,  'ciUes')">  

     <opUon  value=""  selected="selected"></opUon>        <opUon  value="Allemagne">Allemagne</opUon>        <opUon  value="Angleterre">Angleterre</opUon>        <opUon  value="Belgique">Belgique</opUon>        <opUon  value="Espagne">Espagne</opUon>        <opUon  value="France">France</opUon>        <opUon  value="Italie">Italie</opUon>    </select>  

 <span  id="ciUes"></span>  <br  />  

 <input  type="submit"  value="Envoyer"  class="buMon"  />    </div>    </form>   </body>   </html>  

JS  

JS  

1.  Page  web  HTML    

-­‐  Inclure  un  script  JavaScript  

-­‐   Définir  l’acUon  

(14)

Etape 2

– script côté serveur (E/S)

serveur

http://.../liste_villes.php

?

pays=Angleterre

Requête XMLHTTP

Londres;Manchester

JS  

Réponse XMLHTTP

liste_villes.php

2.  Script  côté  serveur  

-­‐  

Entrées

 :  données  de  la  requête  

-­‐   

SorEe

 :  JSON/texte/XML  

(15)

funcEon  showCiUes(pays,  id_elt)  {    

 var  node  =  null;        var  xml_hMp  =  null;  

 try  {  

   node  =  document.getElementById(id_elt);  

   if  (pays.length  ==  0)  {              //  si  aucun  pays  selecUonne          node.innerHTML  =  '';      

     return;          }  

   xml_hMp  =  new  XMLHMpRequest();  

     

<span  id="ciUes"></span>  

Etape 3

– script JavaScript

                }    //  fin  foncUon  showCiUes  

Angleterre

cities

3.  Script  JS  

a)  Créer  la  foncUon  appelée  dans  

 l’événement  de  la  page  HTML  

(16)

funcEon  showCiUes(pays,  id_elt)  {    

 var  node  =  null;        var  xml_hMp  =  null;  

 try  {  

   node  =  document.getElementById(id_elt);  

   if  (pays.length  ==  0)  {              //  si  aucun  pays  selecUonne          node.innerHTML  =  '';      

     return;          }  

   xml_hMp  =  new  XMLHMpRequest();  

     

<span  id="ciUes"></span>  

Etape 3

– script JavaScript

                }    //  fin  foncUon  showCiUes  

texte br texte input br texte select span br input

option … option div form body html texte head title script

Angleterre

cities

span

node  

3.  Script  JS  

a)  Créer  la  foncUon  appelée  dans  

 l’événement  de  la  page  HTML  

(17)

funcEon  showCiUes(pays,  id_elt)  {    

 var  node  =  null;        var  xml_hMp  =  null;  

 try  {  

   node  =  document.getElementById(id_elt);  

   if  (pays.length  ==  0)  {              //  si  aucun  pays  selecUonne          node.innerHTML  =  '';      

     return;          }  

   xml_hMp  =  new  XMLHMpRequest();  

     

<span  id="ciUes"></span>  

Etape 3

– script JavaScript

                }    //  fin  foncUon  showCiUes   span

Angleterre

cities

node  

3.  Script  JS  

b)  Créer  l’objet  XMLHMpRequest  

 

(18)

Etape 3

– script JavaScript

funcEon  showCiUes(pays,  id_elt)  {    

 var  node  =  null;        var  xml_hMp  =  null;  

 try  {  

   node  =  document.getElementById(id_elt);  

   if  (pays.length  ==  0)  {              //  si  aucun  pays  selecUonne          node.innerHTML  =  '';            return;          }      xml_hMp  =  new  XMLHMpRequest();      xml_hMp.onreadystatechange  =  funcEon(){                                      }    //  fin  foncUon  anonyme                   }    //  fin  foncUon  showCiUes  

<span  id="ciUes"></span>  

span

Angleterre

cities

node  

3.  Script  JS  

c)  Définir  le  gesUonnaire  d’événements        

       (appelé  quand  l’

état  de  l’objet

 change)  

Etats  de  l’objet  

0  :  UNSENT  –  objet  construit  

1  :  OPENED  –  objet  iniUalisé  (méthode  open)   2  :  HEADERS_RECEIVED    –    requête  envoyée  au   serveur  (méthode  send)  

3  :  LOADING  –  réponse  en  cours  de  chargement   4  :  DONE  –  terminé  

(19)

Etape 3

– script JavaScript

funcEon  showCiUes(pays,  id_elt)  {    

 var  node  =  null;        var  xml_hMp  =  null;  

 try  {  

   node  =  document.getElementById(id_elt);  

   if  (pays.length  ==  0)  {              //  si  aucun  pays  selecUonne          node.innerHTML  =  '';      

     return;          }  

   xml_hMp  =  new  XMLHMpRequest();  

   xml_hMp.onreadystatechange  =  funcEon(){        

     var  tab_villes  =  new  Array();      

     var  code_html  =  '';  

     if  ((this.readyState  ==  4)  &&  (this.status  ==  200))  {                    

     }    //  fin  etat  4  DONE  et  reponse  HTTP  200    

   }    //  fin  foncUon  anonyme                   }    //  fin  foncUon  showCiUes  

<span  id="ciUes"></span>  

span

Angleterre

cities

node  

3.  Script  JS  

c)  Définir  le  gesUonnaire  d’événement  

   -­‐  AMendre  que  la  réponse  HTTP  soit  complète  

Etats  de  l’objet  

0  :  UNSENT  –  objet  construit  

1  :  OPENED  –  objet  iniUalisé  (méthode  open)   2  :  HEADERS_RECEIVED    –    requête  envoyée  au   serveur  (méthode  send)  

3  :  LOADING  –  réponse  en  cours  de  chargement  

(20)

Etape 3

– script JavaScript

funcEon  showCiUes(pays,  id_elt)  {    

 var  node  =  null;        var  xml_hMp  =  null;  

 try  {  

   node  =  document.getElementById(id_elt);  

   if  (pays.length  ==  0)  {              //  si  aucun  pays  selecUonne          node.innerHTML  =  '';      

     return;          }  

   xml_hMp  =  new  XMLHMpRequest();  

   xml_hMp.onreadystatechange  =  funcEon(){        

     var  tab_villes  =  new  Array();      

     var  code_html  =  '';  

     if  ((this.readyState  ==  4)  &&  (this.status  ==  200))  {          if  (this.responseText.length  >  0){  

         tab_villes  =  this.responseText.split(';');  

             

     }    //  fin  etat  4  DONE  et  reponse  HTTP  200    

   }    //  fin  foncUon  anonyme                   }    //  fin  foncUon  showCiUes  

Londres;Manchester

<span  id="ciUes"></span>  

span

Angleterre

cities

node  

3.  Script  JS  

c)  Définir  le  gesUonnaire  d’événement  

   -­‐  AMendre  que  la  réponse  HTTP  soit  complète      -­‐  Récupérer  la  réponse  envoyée  par  le  serveur  :  

             format  texte/JSON  :  propriété  responseText  

(21)

Etape 3

– script JavaScript

funcEon  showCiUes(pays,  id_elt)  {    

 var  node  =  null;        var  xml_hMp  =  null;  

 try  {  

   node  =  document.getElementById(id_elt);  

   if  (pays.length  ==  0)  {              //  si  aucun  pays  selecUonne          node.innerHTML  =  '';      

     return;          }  

   xml_hMp  =  new  XMLHMpRequest();  

   xml_hMp.onreadystatechange  =  funcEon(){        

     var  tab_villes  =  new  Array();      

     var  code_html  =  '';  

     if  ((this.readyState  ==  4)  &&  (this.status  ==  200))  {          if  (this.responseText.length  >  0){            tab_villes  =  this.responseText.split(';');                

     }    //  fin  etat  4  DONE  et  reponse  HTTP  200    

   }    //  fin  foncUon  anonyme                   }    //  fin  foncUon  showCiUes  

Londres;Manchester

<span  id="ciUes"></span>  

Londres

Manchester

0

1

span

Angleterre

cities

node  

tab_villes

3.  Script  JS  

c)  Définir  le  gesUonnaire  d’événement  

   -­‐  AMendre  que  la  réponse  HTTP  soit  complète      -­‐  Récupérer  la  réponse  envoyée  par  le  serveur      -­‐  Modifier  le  contenu  de  la  page    

(22)

Etape 3

– script JavaScript

funcEon  showCiUes(pays,  id_elt)  {    

 var  node  =  null;        var  xml_hMp  =  null;  

 try  {  

   node  =  document.getElementById(id_elt);  

   if  (pays.length  ==  0)  {              //  si  aucun  pays  selecUonne          node.innerHTML  =  '';      

     return;          }  

   xml_hMp  =  new  XMLHMpRequest();  

   xml_hMp.onreadystatechange  =  funcEon(){        

     var  tab_villes  =  new  Array();      

     var  code_html  =  '';  

     if  ((this.readyState  ==  4)  &&  (this.status  ==  200))  {          if  (this.responseText.length  >  0){  

         tab_villes  =  this.responseText.split(';');  

         for  (var  i  =  0;  i  <  tab_villes.length;  i++)  {  

           code_html  +=  '<opUon  value="'  +  i  +  '">'  +    tab_villes[i]  +  '</opUon>';  

         }  

         node.innerHTML  =  'Ville  <select  name="city">'  +  code_html  +  '</select>';  

       }  else  {  

         node.innerHTML  =  'echec';  

       }  

     }    //  fin  etat  4  DONE  et  reponse  HTTP  200    

   }    //  fin  foncUon  anonyme                   }    //  fin  foncUon  showCiUes  

<span  id="ciUes"></span>  

 

 

<opUon  value="0">Londres</opUon>   <opUon  value="1">Manchester</opUon>    

0

1

span

Angleterre

cities

Londres

Manchester

node  

tab_villes

code_html

3.  Script  JS  

c)  Définir  le  gesUonnaire  d’événement  

   -­‐  AMendre  que  la  réponse  HTTP  soit  complète      -­‐  Récupérer  la  réponse  envoyée  par  le  serveur      -­‐  Modifier  le  contenu  de  la  page    

(23)

Etape 3

– script JavaScript

funcEon  showCiUes(pays,  id_elt)  {    

 var  node  =  null;        var  xml_hMp  =  null;  

 try  {  

   node  =  document.getElementById(id_elt);  

   if  (pays.length  ==  0)  {              //  si  aucun  pays  selecUonne          node.innerHTML  =  '';      

     return;          }  

   xml_hMp  =  new  XMLHMpRequest();  

   xml_hMp.onreadystatechange  =  funcEon(){        

     var  tab_villes  =  new  Array();      

     var  code_html  =  '';  

     if  ((this.readyState  ==  4)  &&  (this.status  ==  200))  {          if  (this.responseText.length  >  0){  

         tab_villes  =  this.responseText.split(';');  

         for  (var  i  =  0;  i  <  tab_villes.length;  i++)  {  

           code_html  +=  '<opUon  value="'  +  i  +  '">'  +    tab_villes[i]  +  '</opUon>';  

         }  

         node.innerHTML  =  'Ville  <select  name="city">'  +  code_html  +  '</select>';  

       }  else  {  

         node.innerHTML  =  'echec';  

       }  

     }    //  fin  etat  4  DONE  et  reponse  HTTP  200    

   }    //  fin  foncUon  anonyme                   }    //  fin  foncUon  showCiUes  

<span  id="ciUes"></span>    

Ville  <select  name="city">  

     <opUon  value="0">Londres</opUon>        <opUon  value="1">Manchester</opUon>      </select>  

span

Angleterre

cities

node  

3.  Script  JS  

c)  Définir  le  gesUonnaire  d’événement  

   -­‐  AMendre  que  la  réponse  HTTP  soit  complète      -­‐  Récupérer  la  réponse  envoyée  par  le  serveur      -­‐  Modifier  le  contenu  de  la  page    

(24)

Etape 3

– script JavaScript

funcEon  showCiUes(pays,  id_elt)  {    

 var  node  =  null;        var  xml_hMp  =  null;  

 try  {  

   node  =  document.getElementById(id_elt);  

   if  (pays.length  ==  0)  {              //  si  aucun  pays  selecUonne          node.innerHTML  =  '';      

     return;          }  

   xml_hMp  =  new  XMLHMpRequest();  

   xml_hMp.onreadystatechange  =  funcEon(){        

     var  tab_villes  =  new  Array();      

     var  code_html  =  '';  

     if  ((this.readyState  ==  4)  &&  (this.status  ==  200))  {          if  (this.responseText.length  >  0){  

         tab_villes  =  this.responseText.split(';');  

         for  (var  i  =  0;  i  <  tab_villes.length;  i++)  {  

           code_html  +=  '<opUon  value="'  +  i  +  '">'  +    tab_villes[i]  +  '</opUon>';  

         }  

         node.innerHTML  =  'Ville  <select  name="city">'  +  code_html  +  '</select>';  

       }  else  {  

         node.innerHTML  =  'echec';  

       }  

     }    //  fin  etat  4  DONE  et  reponse  HTTP  200    

   }    //  fin  foncUon  anonyme                   }    //  fin  foncUon  showCiUes  

<span  id="ciUes">  

Ville  <select  name="city">  

     <opUon  value="0">Londres</opUon>        <opUon  value="1">Manchester</opUon>      </select>   </span>   option option texte select span Londres Manchester

Angleterre

cities

node  

3.  Script  JS  

c)  Définir  le  gesUonnaire  d’événement  

   -­‐  AMendre  que  la  réponse  HTTP  soit  complète      -­‐  Récupérer  la  réponse  envoyée  par  le  serveur      -­‐  Modifier  le  contenu  de  la  page    

(25)

Etape 3

– script JavaScript

funcEon  showCiUes(pays,  id_elt)  {  

 

 var  node  =  null;        var  xml_hMp  =  null;  

 try  {  

   node  =  document.getElementById(id_elt);  

   if  (pays.length  ==  0)  {              //  si  aucun  pays  selecUonne          node.innerHTML  =  '';      

     return;          }  

   xml_hMp  =  new  XMLHMpRequest();  

   xml_hMp.onreadystatechange  =  funcEon(){        

     var  tab_villes  =  new  Array();      

     var  code_html  =  '';  

     if  ((this.readyState  ==  4)  &&  (this.status  ==  200))  {          if  (this.responseText.length  >  0){  

         tab_villes  =  this.responseText.split(';');  

         for  (var  i  =  0;  i  <  tab_villes.length;  i++)  {  

           code_html  +=  '<opUon  value="'  +  i  +  '">'  +    tab_villes[i]  +  '</opUon>';  

         }  

         node.innerHTML  =  'Ville  <select  name="city">'  +  code_html  +  '</select>';  

       }  else  {  

         node.innerHTML  =  'echec';  

       }  

     }    //  fin  etat  4  DONE  et  reponse  HTTP  200    

   }    //  fin  foncUon  anonyme  

     //  envoyer  la  requete  

   xml_hMp.open("GET",    

           "liste_villes.php?pays="  +  pays,    

             true);    //  asynchrone  

   xml_hMp.send(null);        //  GET  -­‐>  pas  de  donnees  

   }  catch  (e)  {      return;    }   }    //  fin  foncUon  showCiUes  

Angleterre

3.  Script  JS  

d)  Envoyer  la  requête  au  serveur  web  

   -­‐  Récupérer  les  données  à  envoyer  au  serveur      -­‐  IniUaliser  (méthode  open)  

(26)

Etape 3

– script JavaScript

xml_hMp.open("GET",  "liste_villes.php?pays="  +  pays,    true);    

xml_hMp.send(null);        //  GET  -­‐>  pas  de  donnees  

 

 Envoyer  la  requête  au  serveur  web  par  la  méthode  GET

 Envoyer  la  requête  au  serveur  web  par  la  méthode  POST

xml_hMp.open("POST",  "liste_villes.php",  true);    

xml_hMp.setRequestHeader("Content-­‐type",  "applicaUon/x-­‐www-­‐form-­‐urlencoded");  

xml_hMp.send("pays="  +  pays);        //  POST  -­‐>  donnees  

(27)

Plan

¨ 

Présentation d’AJAX  

¨ 

Principe

¨ 

Etapes

¨ 

Prendre en compte la latence

¨ 

Support par les navigateurs

¨ 

Inconvénients

(28)

xml_hMp.onreadystatechange  =  funcEon(){          

 var  tab_villes  =  new  Array();    

 var  code_html  =  '';  

 

 if  (this.readyState  <  4){  

                 node.innerHTML  =  "<img  src='loader.png'  alt='loading…'>";  

         }  else  {  

     //  si  etat  4  DONE  et  que  code  reponse  HTTP  200  manipuler  le  DOM  pour  afficher  le  select    

   …  

 }  

}    //  fin  foncUon  anonyme  

Prendre en compte la latence

Informer  l’uUlisateur  qu’une  opéraUon  est  en   cours  en  tâche  de  fond  

(29)

Plan

¨ 

Présentation d’AJAX  

¨ 

Principe

¨ 

Etapes

¨ 

Prendre en compte la latence

¨ 

Support par les navigateurs

¨ 

Inconvénients

(30)

Support par les navigateurs

¨ 

IE 5 introduit un contrôle ActiveX XMLHTTP

¨ 

XMLHttpRequest

Firefox

Mozilla 1.0+ (Netscape 7)

Chrome

Safari 1.2+

Opera 8.0+

IE 7+

(31)

funcEon  getXmlHMpObject(){  

   

 var  xml_hMp_obj  =  null;  

 

 try  {          

   xml_hMp_obj  =  new  XMLHMpRequest();    //  Firefox,  IE  >=  7,  Safari,  Opera,  Chrome  

 }  catch(e){    

   try{  

       xml_hMp_obj  =  new  AcUveXObject("Msxml2.XMLHTTP");    //  IE  6    

     }  catch(e){  

     alert  ("Browser  does  not  support  Ajax");  

   }  

 }  

 return  xml_hMp_obj;  

}  

(32)

Plan

¨ 

Présentation d’AJAX  

¨ 

Principe

¨ 

Etapes

¨ 

Prendre en compte la latence

¨ 

Support par les navigateurs

¨ 

Inconvénients

(33)

Inconvénients

¨ 

navigateur

¤ 

JavaScript activé

¤ 

support de l’objet XMLHttpRequest

=> prévoir une version qui fonctionne sans Ajax

¨ 

navigation

¤ 

historique de navigation (boutons back/forward)

=> fonction de callback qui restaure la page

¤ 

signets

¨ 

sécurité

¤ 

JavaScript activé

¨ 

pas d’indexation du contenu dynamique

(34)

Plan

¨ 

Présentation d’AJAX  

¨ 

Principe

¨ 

Etapes

¨ 

Prendre en compte la latence

¨ 

Support par les navigateurs

¨ 

Inconvénients

(35)

Avantages

¨ 

Amélioration de l’expérience utilisateur

¤ 

mise à jour locale de la page

⇒  supprime l’effet de rafraîchissement de la page entière

⇒  diminution des temps d’attente (réponse plus rapide aux actions de l’utilisateur )

¤ 

contrôle en temps réel du contenu des formulaires

¤ 

asynchrone => permet de continuer à remplir un formulaire

¨ 

Réduction de la bande passante

seule l’information nécessaire est transmise

¨ 

Réduction de la charge du serveur

¤ 

une partie des traitements est réalisée par le client (mise en page du résultat)

¤ 

le serveur n’a pas à générer la totalité de la page à chaque demande

¨ 

Aucune installation nécessaire (pas de plugin)

AJAX, utilisé à bon escient, fournit une expérience utilisateur similaire à celle des

applications installées sur l’ordinateur.

(36)

En savoir plus

¨ 

W3C XMLHttpRequest Level 2 – Working Draft 2012

http://www.w3.org/TR/XMLHttpRequest

¨ 

Ajax: A New Approach to Web Applications – J.J. Garrett 2005

http://adaptivepath.com/ideas/ajax-new-approach-web-applications

¨ 

Ajax Tutorial

http://www.xul.fr/en-xml-ajax.html

¨ 

Ajax loader icon

http://www.ajaxload.info

¨ 

Liste Frameworks Ajax

http://en.wikipedia.org/wiki/List_of_Ajax_frameworks

http://www.xul.fr/ajax-librairies.html

¨ 

Firebug (Onglet Net – XHR)

http://getfirebug.com/network

¨ 

OWASP – Ajax and Other « Rich » Interface Technologies

https://www.owasp.org/index.php/Ajax_and_Other_%22Rich%22_Interface_Technologies

¨ 

OWASP Ajax Security Guidelines

Références

Documents relatifs

Si l’on inclut l’exposition à l’Eurosystème, l’exposition cumulée de la zone euro à la dette grecque atteindrait 342 milliards d’euros (4 % du PIB de la zone euro), dont

étude étaient les suivantes: le nom du premier auteur ainsi que l’année de publication, le pays dans lequel l’étude a été réalisée et/ou la source des données, la période

Percentage of time of engaged in stereotypy and functional engagement during baseline, noncontingent access (NC), and differential reinforcement (DR) conditions... How

Avec la pr´ esence de source de curieth´ erapie LDR comprise entre les hanches, les images CT reconstruites pr´ esentent une forte pr´ esence d’art´ efacts m´ etalliques (figure

Les 79 occurrences du verbe entendre dans les Psaumes se répartissent en fonction de deux niveaux de communication : dans la plus grande partie des textes concernés, c’est

Le système pentecôtiste de gestion de l’argent s’inscrit en effet dans des dispositifs institutionnels de formation, de médiation et d’encadrement dont

Non seulement les instituts religieux sont eux-mêmes fort divers entre eux, d’où l’importance de la complémentarité entre droit universel et droit propre en

Ce que manifeste enfin la confrontation des jugements portés par les voyageurs du XVII e siècle sur les différentes langues orientales, c’est la manière dont