L'éditeur JavaScript
Visiteur non-identifié | Identifiez-vous | Devenir membre
Code perdu ? | Combien de visiteurs sur votre site ?
Rechercher :
Page d'accueil
     Home Page

JavaScript
     Tous les scripts
     Proposer un script
     Recherche de script
     AJAX
     Cours de JavaScript
     Liste de discussion
     Forums

Services :
     CountUs
     myCircle
     ClickInText
     XooIt

Trucs et astuces :
     HTML / CSS
     PHP / MySQL
     Réferencement
     Graph / Présentation
     Toutes les astuces
     Ajouter un article

MailingList :
122663 abonnés

Annuaire webmaster :      Hebergement web
     Referencement
     Sites webmasters
     XHTML - CSS2
     PHP
     Affiliation - Pub
     FAI

     Annuaire webmaster

Ressources pour webmasters :
     Kit graphique
     Foire aux questions
     Les membres
     Devenir annonceur
     Faire un lien
     Contact

Partenaire :
     Compteur live
     Créer un forum
     Le PHP facile
     Comscripts
     Liens sponsorisés
     Blog
     Page Rank
     Poésie et cita...
     Gifs animés, f...
     Easy-script.com
     Azote.org - no...
     Web creation ...
     K i s s design
     Outils de créa...
     Electroniq...
     Je crée mon site
     Créer son site...
     Les autres
     Votre site ici ?


Article posté par : krucial
Date de mise en ligne : 21-11-2007
Niveau : Confirmé
>> Ajouter un article

Ajax : synchrone et asynchrone ? Des exemples !


Quelle difference ?

Nous avons vu dans le précédent article sur le sujet qu'AJAX voulait dire "Asynchronous Javascript And Xml". Asynchronous est un terme moche et barbare qui, basé sur synchrone, veut dire qu'AJAX peut, au choix, etre executé de façon synchrone (le script va attendre que la requete AJAX vers le serveur soit faite pour se poursuivre) ou asynchrone (le script n'attend pas la fin de la requete). Voyons pas l'exemple :

AJAX executé de façon synchrone

Reprennons le code de notre précédent article, et ajoutons-y un evenement déclencheur. Au clic, le notre script va verifier le contenu dans fichier PHP (ajax_test.php, contenant le texte « Ceci est un test ») et l'afficher dans un "div". Pour bien montrer le fonctionnement du script, notre fichier PHP contient un "sleep(2)" qui va retarder sa lecture. A chaque étape du script, des lignes seront ajoutées dans le div


<script type="text/javascript">
function exemple()
{
obj = document.getElementById("resultat");
// ON AFFICHE UNE PREMIERE LIGNE DANS LE DIV
obj.innerHTML = "Avant la requete : OK<br />";
if(window.XMLHttpRequest) // FIREFOX
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject) // IE
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else
return(false);
// ON APPELLE LA PAGE
xhr_object.open("GET", "/misc/ajax_test.php", false);
xhr_object.send(null);
// ON AFFICHE UNE SECONDE LIGNE DANS LE DIV
obj.innerHTML += "Apres la requete : OK<br />";
// ON AFFICHE LE RESULTAT DANS LE DIV
res = "Contenu du fichier : "+xhr_object.responseText;
obj.innerHTML += res;
}
</script>
<a href="javascript:exemple()">Hop, on essaye !</a>
<div id="resultat"></div>

Rien d'extraordinnaire dans ce bout de code. A noter simplement que le "false" dans l'appel de "xhr_object.open" signifie que nous sommes en mode synchrone. Nous passerons cet élément à "true" dans notre prochain exemple.

Resultat :
Hop, on essaye !


On voit bien dans cet exemple que le script attend la fin du chargement de la page pour continuer. Cela peut être pratique, mais certaines fois, on aura envie d'executer diverses actions pendant le chargement du fichier, et a chaque étape de sa lecture. Nous allons donc passer en mode "asynchrone".

AJAX executé de façon asynchrone

Reprennons le code précédent et passons le simplemet en mode asynchrone (en changer le parametre cité précedement à "true") :

<script type="text/javascript">
function exemple()
{
obj = document.getElementById("resultat");
// ON AFFICHE UNE PREMIERE LIGNE DANS LE DIV
obj.innerHTML = "Avant la requete : OK<br />";
if(window.XMLHttpRequest) // FIREFOX
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject) // IE
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else
return(false);
// ON APPELLE LA PAGE
xhr_object.open("GET", "/misc/ajax_test.php", true);
xhr_object.send(null);
// ON AFFICHE UNE SECONDE LIGNE DANS LE DIV
obj.innerHTML += "Apres la requete : OK<br />";
// ON AFFICHE LE RESULTAT DANS LE DIV
res = "Contenu du fichier : "+xhr_object.responseText;
obj.innerHTML += res;
}
</script>
<a href="javascript:exemple()">Hop, on essaye !</a>
<div id="resultat"></div>

Essayons :
Hop, on essaye !


Tout s'est executé avant la fin du chargement. Resultat notre script n'affiche pas le contenu du fichier appelé. Avouons que le résultat n'est pas tres interessant dans l'immediat. Pour tirer partie de « l'asynchronisime » (je me suis lancé, n'hésitez pas à me dire si ce mot existe ou non), nous allons ajouter a ce bout de code « des controles » pour verifier chaque étape de la requete vers le serveur, et d'y associer, si on le désire, des actions.

Les controles de requetes :

Lorsque nous créons une requete vers un fichier, nous créons un objet "XMLHttpRequest", dans notre exemple, il correspond a la variable "xhr_object". Un attribut de cet objet, "readyState" va nous permettre de connaître l'état de notre requete en temps réèl. En effet, cet attribut retourne un code different pour chaque disponibilité des données :
  • 0 : non initialisé
  • 1 : connexion établie
  • 2 : requete reçue
  • 3 : réponse en cours
  • 4 : terminé
Nous allons donc ajouter un bout de code qui va controlé chaque changement d'étape de notre objet XMLHttpRequest :
<script type="text/javascript">
function exemple()
{
obj = document.getElementById("resultat");
// ON EFFACE LE CONTENU DU DUV
obj.innerHTML = "";
if(window.XMLHttpRequest) // FIREFOX
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject) // IE
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else
return(false);

// CONTROLE DE L'ETAT DE LA REQUETE
// CHAQUE CHANGEMENT D'ETAT AFFICHE UNE LIGNE DANS NOTRE DIV
xhr_object.onreadystatechange = function()
{
if(xhr_object.readyState == 1)
     obj.innerHTML += "connexion établie<br />";
if(xhr_object.readyState == 2)
     obj.innerHTML+= "requête reçue<br />";
if(xhr_object.readyState == 3)
     obj.innerHTML += "réponse en cours<br />";
if(xhr_object.readyState == 4)
{
     // ON CONTROLE LE STATUS (ERREUR 404, ETC)
if(xhr_object.status == 200)
obj.innerHTML += "Fichier : " + xhr_object.responseText;
else
obj.innerHTML +="Error code " + xhr_object.status;
}
};

// ON APPELLE LA PAGE
xhr_object.open("GET", "/misc/ajax_test.php", true);
xhr_object.send(null);
}
</script>
<a href="javascript:exemple()">Hop, on essaye !</a>
<div id="resultat"></div>


Voyons ce que ca donne :
Hop, on essaye !


Et voilà, tout s'offre à vous désormais ! On peut imaginer afficher une petite image d'attente pendant le chargement, etc ...


Annotations des visiteurs :

De Cubitus - le 07-07-2008

Ce script bug sous firefox ( plusieurs ecris requête reçue et réponse en cours ) , de plus les etapes ne sont pas effacé une fois la requete finis .

Pour finir le resultat n'est pas le meme sous IE et firefox .

Bref ce script n'est pas finis et bugué , c'est dommage ...
De Lutino - le 02-04-2008

D'abord merci pour tout, je suis en train de lire un livre sur AJAX et cela me semblait rébarbatif, ce tutoriel m'a convaincu du contraire.

Par contre, ma question bête : Comment faire disparaître les affichages des "étapes 1 à 4" une fois la requête exécutée, et le contenu de la page affiché ?

Merci d'avance.
De legral - le 15-02-2008

Je ne pensait pas l'ajax aussi simple à utiliser. Merci pour cet exemple. Je vais me regaler a programmer plein de truc hautement facultatif maintenant.
Question sans rapport avecc ajax: Pourquoi ne pas avoir utiliser switch.. case a la place de if répété?
De nemrod93 - le 13-02-2008

Un tuto lair et simple, merci beaucoup
De NEO III - le 09-01-2008

Très bon tuto !

Bravo et continuez dans cette voie !

>> Poster une annotation sur cette astuce

Retour à la liste des trucs et astuces





compteur gratuit
actuellement en ligne

    PUBLICITE



     ANNUAIRE WEBMAST.
iFrance
Apres des moments difficiles, iFrance a revu toute son architecture technique pour hebergement de nouveau tres performant !
http://www.ifrancepro.com/
Cat : Hebergement gratuit
Voir l'annuaire webmaster


     LES SCRIPTS :
78 à éditer
68 à copier/coller
247 des membres
2580 sur le web
>> Tous les scripts

     LES MEMBRES :
65982 membres
4650 comptes CountUs
1842 comptes myCircle

     LES FORUMS :
14 forums
40362 topics
191691 messages
>> Les forums

    SONDAGE

Vous avez un blog ou site classique ?
Un blog
Un site classique
Les deux !
La mini-astuce "Divers" du jour par mirage
Simplifiez-vous les forums : http://update.mozilla.org/extensions/moreinfo.php?id=128&vid=196&category=Miscellaneous ! Avec ce petit menu ajouté à vos options du clic droit, vous avez toutes les balises BBCode ! Très pratique pour le forum de l'EJS ;)
Proposer votre mini-astuce | Archives des mini-astuces
© 1999-2012 EJS - Tous droits réservés | CNIL N° 844440 | 13/02/2012 11:55:55 | Design by | Gen. en 0.494 sec.