XMLHttpRequest
XMLHttpRequest (souvent abrĂ©gĂ© XHR) est un objet du navigateur accessible en JavaScript qui permet d'obtenir des donnĂ©es au format XML, JSON, mais aussi HTML, ou mĂȘme un simple texte Ă l'aide de requĂȘtes HTTP.
Avantages et inconvénients
L'avantage principal est dans le cĂŽtĂ© asynchrone. La page entiĂšre ne doit plus ĂȘtre rechargĂ©e en totalitĂ© lorsqu'une partie doit changer[1], ce qui entraĂźne un gain de temps et une meilleure interaction avec le serveur et donc le client.
Les inconvénients résident dans le fait que :
- XMLHttpRequest en version originale, avant la version 2, ne pouvait se connecter qu'Ă un seul domaine serveur en utilisant le protocole HTTP (ou HTTPS) ;
- les internautes Ă navigation « spĂ©ciale » (notamment via l'utilisation d'un navigateur vocal) ont du mal Ă savoir ce qui doit ĂȘtre lu (ce qui a changĂ©) sur la page : c'est un problĂšme d'accessibilitĂ© (il y a des spĂ©cifications dans la norme WAI-ARIA[2] pour Ă©viter ce genre de problĂšmes).
Le contenu dynamique affichĂ© par l'utilisation de JavaScript explique pourquoi le navigateur ne peut pas avoir le mĂȘme comportement qu'une page html chargĂ©e dans sa totalitĂ© (enregistrement des liens, marque-page, bouton retour).
D'autres différences existent :
- le dĂ©bogage du JavaScript est pratiquement impossible en utilisant une fenĂȘtre (alert), une zone div ou la ligne de commande (console), mais des outils comme Chrome, Firebug ou Visual studio amĂ©liorent le dĂ©bogage ;
- le nombre de requĂȘtes pouvant s'exĂ©cuter en mĂȘme temps dĂ©pend du navigateur.
Le point de vue du programmeur
Création d'un objet XMLHttpRequest
Quel que soit le navigateur :
function createXhrObject()
{
if (window.XMLHttpRequest)
return new XMLHttpRequest();
if (window.ActiveXObject)
{
var names = [
"Msxml2.XMLHTTP.6.0",
"Msxml2.XMLHTTP.3.0",
"Msxml2.XMLHTTP",
"Microsoft.XMLHTTP"
];
for(var i in names)
{
try{ return new ActiveXObject(names[i]); }
catch(e){}
}
}
window.alert("Votre navigateur ne prend pas en charge l'objet XMLHTTPRequest.");
return null; // non supporté
}
xhr = createXhrObject();
Chargement de code exécutable
Du code JavaScript présent dans la page chargée via XMLHttpRequest ne sera pas exécuté au moment du chargement.
Il faut insérer le code JavaScript chargé dans la page courante pour qu'il soit exécuté.
Le code suivant peut aussi exécuter le JavaScript présent entre des balises <script></script> dans la page fille, aprÚs l'avoir chargé comme décrit précédemment :
if (XHR.readyState == 4)
{
document.getElementById('contenu').innerHTML = XHR.responseText;
var js = document.getElementById('contenu').getElementsByTagName('script');
for( var i in js )
{
eval(js[i].text);
}
}
Historique
XMLHttpRequest a d'abord été développé par Microsoft, en tant qu'objet ActiveX, pour Internet Explorer 5.0. (septembre 1998). Il a ensuite été repris et implémenté successivement sous Mozilla 1.0 (), Safari 1.2 (), Opera 7.60 TP1[3] () puis Konqueror 3.4 ().
En avril 2006, il a été proposé pour devenir une recommandation[4] du W3C.
L'utilisation de XMLHttpRequest nécessite l'utilisation du langage JavaScript.
Les navigateurs l'implĂ©mentent de diffĂ©rentes façons : ActiveX pour Internet Explorer, objet pour les autres. La crĂ©ation de l'objet se fait donc diffĂ©remment selon le navigateur. De plus, pour crĂ©er l'ActiveX sous Internet Explorer, il est nĂ©cessaire de tester plusieurs versions. Toutefois, aprĂšs la crĂ©ation de l'objet, les mĂ©thodes et attributs sont les mĂȘmes pour tous les navigateurs.
Microsoft a été le premier à incorporer (septembre 1998) des fonctionnalités XMLHttp dans son navigateur web Internet Explorer (5 à 7) sous forme d'un ActiveX (Internet Explorer < 7) sous le nom MSXML.
Les développeurs du projet Mozilla ont alors implémenté leur version de XMLHTTP sous le nom XMLHttpRequest dans la version Mozilla 1.0 (). D'autres navigateurs ont ensuite implémenté XMLHttp à leur tour : Safari 1.2 (), Konqueror 3.4 (), Opera 8.0 (), icab 3.0b352.
Le World Wide Web Consortium essaie alors de standardiser les API (Interface de programmation) en publiant les spécifications de l'API dans sa version 1 sous le nom XMLHttpRequest le et version 2 le . Ainsi plusieurs implémentations de XMLHttpRequest existent. Pour supporter toutes ces versions une API javascript (AJAX) de haut niveau permet de faire abstraction des différentes implémentations et versions de XMLHttpRequest.
Toutefois à cette époque (en 2007), XMLHttpRequest a été critiqué car il nuisait à l'accessibilité du web.
La norme XMLHttpRequest a un successeur, XMLHttpRequest Level 2 et d'autres technologies le remplacent Ă©galement:
- Le W3C avait proposé Access control pour échanger des données avec des serveurs sur des domaines différents,
- Microsoft avait proposé XDomainRequest depuis Internet Explorer 8 maintenant remplacé par la version 2 du standard.
- WebSocket offre les possibilités de l'objet et bien plus.
Ă voir aussi
Articles connexes
Liens externes
Notes et références
- site Mozilla (MDN) - API XMLHttpRequest
- If items in a managed widget are loaded, for example, via the XMLHttpRequest object, and not present in the DOM at all times, authors should use aria-level, aria-posinset and aria-setsize, and ensure that aria-owns is not required to convey membership with the widget.
- « Changelog for Opera 7.60 Technical Preview 1 for Windows », (version du 21 janvier 2012 sur Internet Archive)
- (fr) L'objet XMLHttpRequest, ou (en) W3C - XMLHttpRequest Working Draft