XDomainRequest
L'objet XDomainRequest n'est pas standard. C'est un objet créé par Microsoft, utilisable en JavaScript et qui est implémenté dans Internet Explorer 8 et 9 pour échanger des données entre sites différents, comme le fait l'objet XMLHttpRequest entre le navigateur et le serveur sur un seul domaine.
Voici la spécification actuelle de l'objet XDomainRequest.
Attributs
contentType
Cette propriété contient le type du document. Quand on envoie des données, on assigne cette propriété selon le document que l'on envoie. Quand on charge un document, cette propriété contient le type du document qui a été chargé.
xdr = new XDomainRequest();
xdr.contentType = "text/plain";
responseText
Contient le contenu d'un fichier que l'on vient de charger. On doit attendre que l'évènement onload soit survenu pour lire le contenu de cette variable.
alert(xdr.responseText);
timeout
Contient le délai de chargement maximal.(Probablement en millisecondes, ce n'est pas spécifié).
xdr.timeout = 1200:
Evènements
onerror
Déclenché quand la requête ne peut aboutir. On assigne une fonction à l'évènement pour qu'elle soit exécutée s'il se déclenche.
function erreur()
{
alert("La requête a échoué");
}
...
xdr.onerror = erreur;
onload
Déclenché quand le chargement est terminé. Pour l'utiliser, on lui assigne une fonction et cette fonction lit le contenu de l'attribut responseText, qui est lorsqu'il est entièrement assigné provoque le déclenchement de l'évènement.
function chargement()
{
alert(xdr.responseText);
}
xdr.onload = chargement;
onprogress
Se déclenche à intervalles durant le chargement d'un document sur le site distant. Créé pour pouvoir afficher une barre de progression ou informer sur l'avancement de la requête d'une quelconque façon.
var x = 0;
function progression()
{
barre.setState(x++);
}
xdr.onprogress = progression;
Dans cette exemple, on suppose que barre est un objet JavaScript qui affiche la progression. On peut baser le temps restant sur le contenu de responseText car celui-ci est assigné partiellement durant le chargement (et on peut connaître la taille du fichier à charger par ailleurs).
ontimeout
Déclenché lorsque le délai imparti pour le chargement (défini par l'attribut timeout) est dépassé avant la fin du chargement, et donc avant le déclenchement de l'évènement onload.
Méthodes de XDomainRequest
open
Ouvre une connexion avec le serveur en définissant la méthode
et le fichier.
La méthode HTTP peut être:
GET pour charger un document.
POST pour envoyer des données au serveur.
xdr.open(méthode, url);
send
Envoie des données ou déclenche une requête de chargement. En mode POST, contient les données à envoyer en paramètre, en mode GET n'a pas de paramètre ou la chaîne vide "".
xdr.send( [données]);
abort
Cette méthode peut être appelée au cours de l'exécution de la requête pour la faire avorter. On peut l'associer à un bouton de l'interface pour permettre à l'utilisateur d'abandonner l'opération.
xdr.abort();
Exemples
Code complet d'une requête GET avec XDomainRequest.
xdr = new XDomainRequest();
xdr.onload=function()
{
alert(xdr.responseText);
}
xdr.open("GET", "http://www.autresite.fr/monfichier.txt");
xdr.send();
Code complet d'une requête POST.
xdr = new XDomainRequest();
xdr.onload=function()
{
alert("terminé");
}
xdr.open("POST", "http://www.autresite.fr/monscript.php");
xdr.send("données à envoyer");
Conclusion
Il n'y a pas de différence majeure entre les interfaces de XDomainRequest et celle de son prédécesseur, l'objet XMLHttpRequest (créé à l'origine par Microsoft également). On notera cependant deux ajouts utiles: ontimeout et onprogress.
Une autre différence également, l'évènement onload
qui se substitue à onreadystatechange et readyState et
en fait simplifie l'utilisation de l'objet.
Cependant onload et onprogress sont prévus dans la spécification
Level 2 de XHR.
On ne devrait pas utiliser cet objet pour un site d'usage public pour l'instant. D'une part la définition n'en est pas terminée, d'autre part il ne fonctionne que sur Internet Explorer 8 et 9 et est remplacé par XHR 2 sur IE 10. On peut utiliser un substitut tel que décrit dans l'article Ajax entre domaines différents.
Plus d'information
- Conspiration? Microsoft entre en conflit avec le W3C au sujet du successeur de XMLHttpRequest. Selon l'article, la firme n'approuve pas spécification Level 2, qui n'est pas transparente, il est vrai (MAJ: Article maintenant supprimé).
- XDomainRequest et Access Control. Microsoft annonce sur son blog que XDR sera compatible avec la spécification Access Control du W3C.