Accueil » Articles » Qu'est-ce qu'AJAX et comment l'utiliser

Qu'est-ce qu'AJAX et comment l'utiliser

AJAX veut dire Asynchronous JavaScript and XML. En clair, c'est un moyen de faire une requête HTML (vers une page, ou un script) et d'afficher (à l'aide du DHTML) le résultat de la requête sans être obligé de recharger la page actuelle. Ça permet d'atteindre un niveau de dynamisme proche à une application standard (comme Word par exemple).

L'idée derrière l'AJAX date de bien longtemps. C'est avec Internet Explorer 5 que Microsoft introduit l'objet XMLHttpRequest qui est toujours utilisé aujourd'hui. Depuis, presque tous les fureteurs supportent cet objet.

Pour comprendre AJAX, il suffit de comprendre ces 3 étapes faciles :

  1. Créer un objet XMLHttpRequest.
  2. Faire une requête à l'aide de celui-ci.
  3. Recevoir et afficher la réponse.

Tout ce passe en JavaScripts.

1 - Créer un objet XMLHttpRequest

Pour créer l'objet, vous devez tenir compte des différents fureteurs. IE utilise un objet ActiveX, les autres fureteurs utilisent l'objet JavaScripts XMLHttpRequest.

Tout d'abord, on essaie de créer l'objet standard en JavaScripts. Si ça ne marche pas, on essaie une des saveurs d'Internet Explorer.

try {
  // Mozilla, Firefox, Opera et le reste du monde.
  req = new XMLHttpRequest();
}
catch (error) {
  try   {
    // IE
    req = new ActiveXObject("Microsoft.XMLHTTP");
  }
  catch (error)   {
    try     {
      // IE
      req = new ActiveXObject("Msxml2.XMLHTTP");
    }
    catch (error)     {
      req = false;
    }
  }
}

À partir de maintenant, l'utilisation de l'objet se fait de la même façon que ce soit la version d'IE ou de Firefox.

XMLHttpRequest

Méthodes et attributs de l'objet XMLHttpRequest
MéthodeDescription
abort() Annule la requête courante.
getAllResponseHeaders() Retourne l'en-tête HTTP sous forme d'une chaîne de caractères.
open(méthode, URL, async) Établis les paramètres de la requête. Quelle méthode utilisée (GET, POST ou HEAD), à quelle URL faire la requête. Et finalement, si la requête sera asynchone. A false, le script va attendre d'avoir reçu la réponse avant de continuer. A true le script poursuit.
send(contenu) Envoie la requête. contenu est habituellement égale à null.
AttributsDescription
readyState Pour connaitre ou en est rendu la requête.
0 = non-initialisé
1 = en chargement
2 = chargé
3 = disponible
4 = terminé
status Retourne le code de statut (200 = ok, 404 = introuvable, etc). Il semblerait que Firefox retourne 200, même si la réponse du serveur est 304 (inchangé).
responseText Retourne, sous le forme d'une string, la réponse (sans le header) de la requête.

2 - Faire une requête

Une fois l'objet créé, on fait une requête avec celui-ci.

req.open("GET", "/hello.php", true);
req.onreadystatechange = a_sFunction;
req.send(null);

La méthode open() prend 3 paramètres :

  1. La méthode HTML (GET ou POST)
  2. L'URL
  3. Si la requête doit être asynchone.

La méthode onreadystatechange() permet d'indiquer, quelle fonction JavaScripts va être appelé une fois la requête lancée. C'est cette fonction qui est responsable de recevoir et afficher le résultat de la requête. (Nous verrons plus bas comment écrire cette fonction.)

La méthode send() lance la requête.

3 - Recevoir et afficher la réponse

Une fois la requête effectuée, nous devons attendre la réponse et agir une fois celle-ci parvenus.

Plus haut nous avons défini avec la méthode onreadystatechange() une fonction qui recevra la réponse. Il est temps de créer celle-ci.

function a_sFunction
{
  if(req.readyState == 4)
  {
    var response = req.responseText;

    document.getElementById(ajaxResponse).innerHTML = response;
  }
}

Pour connaître le statut de la requête, nous devons utiliser la propriété readyState. Une fois la réponse disponible (if(req.readyState == 4)), nous pouvons utiliser la méthode responseText() pour convertir la réponse en string et ensuite afficher celle-ci dans un <div> avec la fonction innerHTML()

Exemple

Voici un exemple plus complet (que vous pouvez tester ici).

ajax_exemple.html
<html>
<head>
<script>
  
  function AJAX(a_sURL, a_sDiv)
  {
    if (a_sURL != undefined)
    {
      this.m_sURL = a_sURL;
    }
    
    if (a_sDiv != undefined)
    {
      this.m_sDiv = a_sDiv;
    }
    
    if (this.m_Request != undefined)
    {
      this.m_Request.abort();
      delete this.m_Request;
    }
    
    this.m_Request = this.createReqestObject();
    
    var m_This = this;
    
    this.m_Request.onreadystatechange = function() {m_This.handleResponse()};
    this.m_Request.open("GET", this.m_sURL, true);
    this.m_Request.send(null);
  }
  
  AJAX.prototype.m_sURL = undefined;
  AJAX.prototype.m_sDiv = undefined;
  AJAX.prototype.m_Request = undefined;
  
  AJAX.prototype.createReqestObject = function()
  {
    var req;
    
    try {
      // Mozilla, Firefox, Opera et le reste du monde.
      req = new XMLHttpRequest();
    }
    catch (error) {
      try   {
        // IE
        req = new ActiveXObject("Microsoft.XMLHTTP");
      }
      catch (error) {
        try {
          // IE
          req = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch (error) {
          req = false;
        }
      }
    }
    
    return req;
  }
  
  AJAX.prototype.handleResponse = function()
  {
    if (this.m_Request.readyState == 4)
    {
      // On regarde pour 0 à cause d'un bug dans Firefox.
      if (this.m_Request.status == "200" || this.m_Request.status == "0")
      {
        var content = getById(this.m_sDiv);
        content.innerHTML = this.m_Request.responseText;
        
        if (this.onDraw != undefined)
        {
          this.onDraw();
        }
      }
      else
      {  
        if (this.onError != undefined)
        {
          this.onError({status:this.m_Request.status, statusText:this.m_Request.statusText});
        }
      }
  
      delete this.m_Request;
    }
    else
    {
      getById(this.m_sDiv).innerHTML = "<img src='/images/working.gif' alt='En traitement...'>";
    }
  }
  
  function getById(a_id)
  {
    if (document.getElementById)
    {
      return document.getElementById(a_id);
    }
    else if (document.all)
    {
      return document.all[a_id];
    }
    else if (document.layers)
    {
      return document.layers[a_id];
    }
  
    return null;
  }
  
</script>

<script>
  function Envoyer()
  {
    var URL = 'ajax_exemple.php?nom=' + escape(document.forms['form'].fNom.value);
    var ajax = new AJAX(URL, 'reponse');
  }
</script>

</head>
<body>
  <form id='form'>
    <p>Veuillez indiquez votre nom : <input type="textbox" id="fNom" onKeyUp="javascript:Envoyer();"</p>
  </form> 
  <div id="reponse"></div>
</body>
</html>
ajax_exemple.php
<?php
  // Desactiver la cache.
  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");

  // Nous devons utiliser urldecode() car javascript transmet le tout à l'aide de la fonction escape() (' ' devient '%20')
  // Nous devons utiliser htmlspecialschars() pour éviter les attaques de type XSS.
  // Et nous utilisons utf8_encode() car à moins de spécifier autre chose dans le header, la réponse retourner doit être en utf-8.
  echo "Bonjour ". utf8_encode(htmlspecialchars(urldecode($_GET['nom'])));
?>
Cet article vous a plu? Lisez mes autres articles pour découvrir d'autres trucs.

Sébastien Brodeur

Il est strictement interdit de reproduire ce texte sans la permission écrite de l'auteur.


Commentaire(s)

Ajouter un commentaire

Les gens qui ont consulter cet article, ont aussi consultez ceux-ci :


Valid XHTML 1.0 Transitional

Valid CSS!