Ajax : un premier appel avec l'objet XMLHttpRequest
Par Pascal MARTIN le dimanche 7 janvier 2007, 08:00 - Développement Web - Lien permanent
Pour réaliser un appel Ajax, vous avez besoin de trois éléments :
- Une page HTML, qui contiendra le nécessaire pour déclencher l’appel Ajax - et qui permettra la prise en compte du résultat[1].
- Quelques lignes de Javascript, pour réaliser l’appel et la récupération du résultat
- Un programme côté serveur, qui sera chargé du traitement - j’utiliserai du PHP[2] dans mes exemples.
Éventuellement, vous pouvez aussi :
- Utiliser une feuille de style CSS
- Intégrer le code Javascript directement à la page HTML
Page HTML
Pour notre exemple, la page HTML qui intégrera des fonctionnalités Ajax permet :
- L’appel à une portion de code Javascript qui réalisera l’appel ; Ceci peut être fait lors du clic sur un lien, par exemple
- L’affichage du résultat de l’appel ; dans un élément
div, par exemple
Voici le lien qui appellera la fonction JS déclenchant l’appel :
<a href="" onclick="gestionClic(); return false;"> Cliquez ici ! </a>
Et le bloc au sein duquel sera affiché le résultat de celui-ci :
<div id="resultat"> valeur avant l'appel Ajax </div>
Javascript : Appel Ajax
Un appel Ajax demande plusieurs étapes :
- Instancier un objet XMLHttpRequest
- L’initialiser
- Définir quelle fonction devra être appelée lors d’un événement sur cet objet
- Et enfin, déclencher l’appel
Instanciation d’un objet XMLHttpRequest
Un appel Ajax se fait en utilisant une instance de l’objet XMLHttpRequest.
Sous les navigateurs récents[3], une telle instance s’obtient de la manière suivante :
var http = new XMLHttpRequest();
Sous Internet Explorer 6, par contre, cet objet est un contrôle ActiveX ; le code suivant permet d’en obtenir une instance :
var http = new ActiveXObject("Microsoft.XMLHTTP");
Par soucis de compatibilité entre navigateurs, on utilise souvent une fonction de ce genre, qui se charge de créer une instance d’object XMLHttpRequest :
function createRequestObject() { var http; if (window.XMLHttpRequest) { // Mozilla, Safari, IE7 ... http = new XMLHttpRequest(); } else if (window.ActiveXObject) { // Internet Explorer 6 http = new ActiveXObject("Microsoft.XMLHTTP"); } return http; }
Note : dans un cas réel, il faudrait gérer le cas où cette fonction échoue…
Paramétrage de l’appel
Une fois que l’on dispose d’une instance d’objet XHR[4], il faut paramétrer l’appel. Pour cela, on utilise la méthode open :
objetXMLHttpRequest.open(methode, urlEtParams, async);
Voici la signification des trois paramètres attendus :
- methode : en général,
'GET'ou'POST'. Détermine quel type de requête HTTP sera utilisée pour l’appel Ajax. - urlEtParams : l’URL du programme qui sera exécuté, éventuellement suivie d’une liste de paramètre, si l’on est en GET.
- async :
truepour déclencher un appel en arrière-plan (asynchrone)[5] ;falsepour un appel synchrone bloquant le navigateur.
Par exemple, on pourrait utiliser une portion de code telle celle-ci :
http.open('GET', 'mon-script.php', true);
Préparer la récupération des informations renvoyées par l’appel
Ceci fait, vous avez la possibilité de définir quelle fonction sera appelée lorsqu’un événement se produit sur votre instance d’objet XHR - quand il se passe quelque chose en rapport avec votre appel Ajax, donc.
En supposant que nous avons défini une fonction nommée handleAJAXReturn :
http.onreadystatechange = handleAJAXReturn;
Lancer l’appel
Enfin, nous pouvons lancer l’appel Ajax, à l’aide de la méthode send :
http.send(null);
Cette méthode prend un paramètre, qui peut valoir :
null, dans le cas où l’appel se fait en GET- Une liste de paramètres, de la forme
'param1=valeur1¶m2=valeur2¶m3=valeur3', quand l’appel se fait en POST
Côté serveur : programme appelé
Côté serveur, nous pouvons effectuer les traitements sans avoir à nous soucier du fait que le programme/script est déclenché via un appel Ajax.
Notamment, nous pouvons utiliser les données passées en GET/POST[6].
Prenons l’exemple le plus simple qui soit : un script PHP ne faisant rien de plus qu’afficher un message à l’écran, dans le cas où il est appelé directement :
<?php echo 'coucou'; ?>
Un point est à prendre en compte : de manière générale, lors que vous réalisez un appel Ajax, vous souhaitez que le programme côté serveur soit plus dynamique que ça : qu’il renvoie des données dépendant des paramètres passés, par exemple.
Il est donc parfois recommandé de désactiver la mise en cache, de manière à ce que le navigateur soit contraint à actualiser les données lorsque l’appel se réalise[7].
Pour cela, en PHP, voici le genre de code qu’il faut utiliser :
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); header('Cache-Control: no-cache, must-revalidate'); header('Pragma: no-cache');
Javascript : Résultat de l’appel Ajax
Enfin, côté client, nous pouvons lire le résultat de l’appel Ajax, dans le corps de la fonction handleAJAXReturn, que nous avons défini comme étant celle appelée lorsqu’un événement se produit sur notre objet XHR.
Au sein de cette fonction, nous pouvons utiliser l’attribut readyState de l’objet XMLHttpRequest : s’il vaut 4, c’est que la fonction est appelée au moment du retour de l’appel Ajax.
Nous pouvons aussi utiliser l’attribut status, qui a pour valeur le code HTTP renvoyé par le serveur : 200 en cas de succès, 404 si l’URL appelée n’a pas été trouvée, 403 en cas d’accès non autorisé, …
Les tests à effectuer sont donc, au minimum, les suivants :
if (http.readyState == 400 && http.status == 200) { // Appel Ajax terminé, et bien passé }
Le résultat renvoyé par le serveur est disponible via deux propriétés de l’objet XHR :
responseText: la réponse du serveur, sous forme d’une chaîne de caractèresresponseXML: la réponse du serveur, sous forme d’un objet XML, dans le cas où le serveur a renvoyé du XML.
Avec le programme PHP reproduit plus haut, on pourrait afficher "coucou" - le message renvoyé - de la manière suivante :
alert(http.responseText);
Un exemple complet
Pour terminer, voici un ensemble HTML/Javascript/PHP permettant de reproduire les principes présentés dans ce billet :
Tout d’abord, la page HTML cliente :
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <title>AJAX : Exemple de client</title> <script type="text/javascript" src="ajax.js"></script> </head> <body> <p> <a href="" onclick="gestionClic(); return false;"> Cliquez ici ! </a> </p> <div id="resultat"> </div> </body> </html>
Puis, le code Javascript permettant de gérer l’appel et l’obtention des informations retournées :
var http; // Notre objet XMLHttpRequest function createRequestObject() { var http; if (window.XMLHttpRequest) { // Mozilla, Safari, IE7 ... http = new XMLHttpRequest(); } else if (window.ActiveXObject) { // Internet Explorer 6 http = new ActiveXObject("Microsoft.XMLHTTP"); } return http; } function gestionClic() { http = createRequestObject(); http.open('GET', './mon-script.php', true); http.onreadystatechange = handleAJAXReturn; http.send(null); } function handleAJAXReturn() { if (http.readyState == 4) { if (http.status == 200) { alert(http.responseText); document.getElementById('resultat').innerHTML = http.responseText; } else { alert('Pas glop pas glop'); } } }
Et enfin, le programme PHP exécuté via l’appel Ajax :
<?php echo 'coucou'; ?>
Vous noterez que ce que nous avons développé ici n’utilise pas XML ; il ne s’agit donc pas d’AJAX[8], pas plutôt d’AHAH. D’où l’écriture généralement utilisée : "Ajax", et non "AJAX" - comme je l’indiquait en note d’un Billet précédent.
Notes
[1] Cette page peut être générée dynamiquement côté serveur, bien entendu.
[2] car fréquemment répandu, compréhensible par la plupart des développeurs, installable en local gratuitement, et libre
[3] Mozilla Firefox, Konqueror/Safari, Opera, Internet Explorer 7, en particulier
[4] Fréquemment utilisé pour XMLHttpRequest
[5] le A de Ajax
[6] Et devons les considérer comme non-securisées, de la même façon que lorsque notre page est appelée de manière traditionnelle
[7] Ceci étant en particulier vrai pour Internet Explorer
[8] Asynchronous Javascript And XML : Attention aux majuscules !
Pour être averti lors de la publication de nouvelles entrées, n'hésitez pas à vous abonner au flux RSS ou ATOM des articles de mon blog !
Commentaires
Merci pour ce tutoriel, très propre.
Bonjourà tous ceux qui passeront par ici.
J'ai une question, un peu dure à expliquer mais je vais essayer quand meme.
J'ai un script AJAX qui poste sur un site externe au mien.
Je l'utilise pour envoyer des messages personnels entre inscrits sur ce site (ce n'est pas du SPAM).
Je gère les deux principales barrières de sécurité :
signed.applets.codebase_principal_support=TRUE
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserAccess');
Sur mon pc au boulot ca marche trés bien. Chez moi le script marche sur 1 pc sur 3. Les config sont les memes WINDOWS XP SP2...
Problème : on dirait que le post perd l'authentification au site externe auquel je suis connecté.
Quelqu'un pourrait ou aurait envie de m'aider?
Merci par avance
Merci pour ce tuto simple et complet !!
Je me trompe peut-être, mais j'aurai mis
http.onreadystatechange = handleAJAXReturn();
à la place de
http.onreadystatechange = handleAJAXReturn;
En tout cas merci beaucoup!
vous assignez à
onreadystatechangela valeur renvoyée par l'exécution de la fonctionhandleAJAXReturn.Autrement dit :
handleAJAXReturnest exécutée (une fois, sur la ligne que vous proposez),onreadystatechangeAvec la syntaxe
vous assignez à
onreadystatechangeun "pointeur" vers la fonctionhandleAJAXReturn.Autrement dit :
handleAJAXReturnn'est pas exécutée,http.onreadystatechangeprovoquera l'exécution de la fonctionhandleAJAXReturn- la première "pointant vers" la seconde.Dans le cas d'un appel Ajax, la propriété
onreadystatechangede l'instance d'objetXMLHttpRequestdoit correspondre à une fonction qui sera appelée en cas d'activité au niveau de la requête Ajax.C'est donc la seconde solution qui doit être utilisée : lorsque le navigateur détecte de la vie au niveau de la requête Ajax, il appelera la fonction branchée sur
onreadystatechange; et, dans notre cas, on veut que ce soit la fonctionhandleAJAXReturnqui soit appelée.onreadystatechangedoit donc "pointer" vers cette méthode.En espérant que ce soit plus clair,
Bon courage,
C'est bien plus clair ! Merci beaucoup !
bonjour,
pour traiter une requête http j'utilise ajax. Mon code marche très bien avec firefox et chrome et les résultats son impeccables. Mais sous Internet Explorer 7 et 8 ça ne marche pas. je ne sais pas d'ou vient le problème.
Voici mon code :
@@function request(){
var xhr=new XMLHttpRequest();
xhr.onreadystatechange=function(){
if(xhr.readyState==4 && (xhr.status==200 || xht.status==0)){
readData(xhr.responseText);
}
};
xhr.open("GET","afterAcceuil.jsp?limit="+document.getElementById("nbre_lignes").value,true);
xhr.send(null);
}
function readData(sData){
document.getElementById("tableau").innerHTML=sData;
alert(sData);
@@
Bonjour
Je viens d'utiliser ce tutoriel pour une application javascript.
Je lance une page php qui va insérer les données dans une base de données mysql
Tout fonctionne sauf une chose : Les parametres ne passent pas. Les lignes insérées restent vides.
voici le code :
function insert_bdd(latlng)
{
http = createRequestObject(); http.open('POST', 'f/send_attributs.php', true); http.onreadystatechange = handleAJAXReturn; http.send('attr=12&latlng='+latlng);}
Dans le fichier php je recupere les données avec $_POST'attr' et $_POST'latlng'
A+
J'ai trouvé la réponse
la voici :
function insert_bdd(latlng)
{
http = createRequestObject(); http.open('POST', 'f/send_attributs.php', true);http.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
http.onreadystatechange = handleAJAXReturn; http.send("attr=12&latlng=45"+latlng);}