Attributs de l'objet XMLHttpRequest
Avant de commencer je voudrais vous rappeler de la fonction qu'on a créée dans la page précédente et qui permet de créer l'objet XMLHttpRequest quelque soit le navigateur utilisé. Je lui ai donné comme nom
getxhr() dont le code est le suivant:
<script>
function getxhr(){
try{xhr=new XMLHttpRequest();}
catch(e){
try{xhr=new ActiveXObject("Microsoft.XMLHTTP");}
catch(e1){
try{xhr=new ActiveXObject("Msxml2.XMLHTTTP");}
catch(e2){
alert("AJAX n'est pas supporté par votre navigateur!");
}
}
}
return xhr;
}
</script>
L'appel de cette fonction a pour effet de retourner l'objet
xhr dont on va se servir désormais.
Explorons maintenant les attributs et méthodes qu'on utilisera pour faire du AJAX à l'aide de l'objet
xhr.
Attribut readyState
L'attribut
readyState retourne un entier compris entre 0 et 4 (qui peut aussi être remplacée par une constante prédéfinie). Il permet d'évaluer l'état de la requête. Les valeurs possibles pour
readyState sont:
- 0: Objet non initialisé. Cela revient à dire que le client n'a pas encore envoyé de requête au serveur.
- 1: Requête en cours d'envoie. Le client a ordonné l'ouverture du document sur le serveur mais la requête n'est pas encore reçue par celui-ci.
- 2: Requête reçue. A ce stade, le serveur a intercepté la requête du client.
- 3: Réponse en cours. Le serveur traite les données et entreprend leur envoi au client.
- 4: Réponse chargée. Le client a intercepté la totalité des données envoyées par le serveur.
En général on vérifie si
readyState vaut 4 (ce qui signifie que toutes les données sont chargées sur le navigateur) pour les traiter en Javascript. On peut la coder comme ceci:
if(xhr.readyState == 4)
// Traiter les données chargées en Javascript
else
// Attendre le chargement des données
L'attente peut être explicitée par l'affichage d'une GIF animée ou un message disant "En cours de chargement" par exemple.
Attribut status
L'attribut
status permet de vérifier l'état du document sollicité sur le serveur. Il peut retourner plusieurs valeurs (qui correspondent aux fameux
codes HTTP) mais les plus fréquents sont:
- 200: OK. Cela veut dire que le document a été trouvé à l'emplacement désigné et est accessible pour l'ouverture.
- 404: Document introuvable. Dans ce cas, le document n'a pas été trouvé à l'emplacement désigné.
- 500: Erreur interne du serveur.
- 403: Accès refusé.
En général, on se contente de vérifier si
status vaut 200 pour continuer le traitement. D'ailleurs, cette vérification est souvent associée à celle de
readyState comme ceci:
if(xhr.readyState == 4 && xhr.status == 200)
// Traiter les données chargées en Javascript
else
// Attendre le chargement des données
Attribut responseText
L'attribut
responseText contient la réponse du serveur en format texte (ou HTML). La réponse n'est rien d'autre que le contenu du document sollicité lors de l'ouverture par la méthode open() (que l'on va voir dans la page suivante).
Généralement, on se contente d'afficher cette réponse telle qu'elle est dans un conteneur HTML. A titre d'exemple, supposons que l'on veut afficher le contenu reçu dans une balise
<div> identifiée par
id="divi". Le code peut ressembler à ceci:
if(xhr.readyState == 4 && xhr.status == 200)
document.getElementById("divi").innerHTML = xhr.responseText;
else
document.getElementById("divi").innerHTML = "En cours...";
Attribut responseXML
L'attribut
responseXML contient la réponse du serveur en format XML. Dans ce cas, on se sert des méthodes de DOM en Javascript pour en extraire les données. On peut la coder comme ceci:
if(xhr.readyState == 4 && xhr.status == 200){
objetXML = xhr.responseXML;
// Extraction de données de objetXML à l'aide des méthodes de DOM
}
else
document.getElementById("divi").innerHTML = "En cours...";
Attribut onreadystatechange
L'attribut
onreadystatechange est en fait un événement qui se déclenche à chaque fois que l'attribut
readyState change de valeur. Comme
readyState peut avoir 5 valeurs, alors
onreadystatechange est déclenché 4 fois.
En général, on associe à cet événement une fonction anonyme qui renferme les traitements vus précédemment. Le code peut donc ressembler à ceci:
xhr.onreadystatechange = function(){
if(xhr.readyState == 4 && xhr.status == 200)
document.getElementById("divi").innerHTML = xhr.responseText;
else
document.getElementById("divi").innerHTML = "En cours...";
}