| [ Web Proxy ] |
| Viewing: https://developer.mozilla.org/fr/docs/Web/API/XMLHttpRequest_API/Using_XMLHttpRequest | [Back] [Original] |
Get to know MDN better
Cette page a t traduite partir de l'anglais par la communaut. Vous pouvez contribuer en rejoignant la communaut francophone sur MDN Web Docs.
Cette fonctionnalit est bien tablie et fonctionne sur de nombreux appareils et versions de navigateurs. Elle est disponible sur tous les navigateurs depuis juillet 2015.
* Certaines parties de cette fonctionnalit peuvent bnficier de prise en charge variables.
Dans ce guide, nous verrons comment utiliser XMLHttpRequest afin d'envoyer des requtes HTTP pour changer des donnes entre le site web et un serveur.
Des exemples d'utilisation seront prsents.
Pour envoyer une requte HTTP, on pourra :
XMLHttpRequestLorsque la transaction sera termine, l'objet XMLHttpRequest contiendra les informations de la rponse, comme son corps et le statut HTTP rsultant.
function reqListener() {
console.log(this.responseText);
}
const req = new XMLHttpRequest();
req.addEventListener("load", reqListener);
req.open("GET", "http://www.example.org/example.txt");
req.send();
XMLHttpRequest entre diffrentes origines
Une requte envoye avec XMLHttpRequest peut rcuprer les donnes de faon asynchrone ou de faon synchrone. Le comportement obtenu est choisi avec le troisime argument optionnel async de la mthode XMLHttpRequest.open(). Lorsque cet argument vaut true ou s'il n'est pas fourni, la requte est traite de faon asynchrone. Sinon, le processus est gr de faon synchrone. Pour en savoir plus sur ces diffrents types de requtes, vous pouvez consulter l'article Requtes synchrones et asynchrones. Les requtes synchrones ne peuvent pas tre utilises en dehors des workers, car elles bloqueraient l'interface principale.
Note :
Le constructeur XMLHttpRequest ne se limite pas aux seuls documents XML. Son nom commence par "XML", car il a t cr lorsque le format d'change principal tait XML.
Il existe plusieurs types d'attributs de rponse dfinis pour le constructeur XMLHttpRequest(). Ces attributs indiquent au client qui a mis la requte des informations importantes quant au statut de la rponse. Pour les cas o il faut grer une rponse qui n'est pas du texte, cela peut ncessiter des manipulations et une analyse que nous allons voir dans les sections suivantes.
responseXMLLorsqu'on utilise XMLHttpRequest pour obtenir le contenu d'un document XML distant, la proprit responseXML sera un objet DOM qui contient le document XML analys. La manipulation et l'analyse d'un tel rsultat n'est pas ncessairement simple. Il existe quatre mthodes principales pour analyser un tel document XML :
XMLSerializer afin de srialiser des arbres DOM en chanes de caractres ou en fichiers.Note :
XMLHttpRequest peut galement interprter un document HTML avec la proprit responseXML. Voir l'article propos de la prise en charge de HTML dans XMLHttpRequest pour apprendre comment faire.
responseText contenant un document HTMLLorsqu'on utilise XMLHttpRequest afin d'obtenir le contenu d'une page HTML distante, la proprit responseText sera une chane de caractres contenant le document HTML brut. La manipulation et l'analyse d'un tel rsultat n'est pas ncessairement simple. Il existe trois mthodes principales pour analyser un tel document HTML :
XMLHttpRequest.responseXML comme indiqu dans l'article Prise en charge de HTML dans XMLHttpRequest.fragment.body.innerHTML et traverser le DOM de ce fragment.Bien que XMLHttpRequest soit gnralement afin d'envoyer et de recevoir des donnes texte, on peut aussi l'utiliser pour envoyer et recevoir des donnes binaires. Il existe plusieurs mthodes pour ce faire, qui utilisent la mthode overrideMimeType() :
const req = new XMLHttpRequest();
req.open("GET", url);
// On rcupre les donnes non-traites comme une chane binaire
req.overrideMimeType("text/plain; charset=x-user-defined");
/* */
D'autres techniques plus modernes existent galement. En effet responseType prend en charge plusieurs types de contenu, permettant ainsi d'envoyer et de recevoir des donnes binaires plus facilement.
Prenons le fragment de code qui suit, qui utilise responseType avec "arraybuffer" afin de rcuprer le contenu distant dans un objet ArrayBuffer qui stocke les donnes binaires.
const req = new XMLHttpRequest();
req.onload = (e) => {
const arraybuffer = req.response; // pas responseText
/* */
};
req.open("GET", url);
req.responseType = "arraybuffer";
req.send();
Pour plus d'exemples, voir la page Envoyer et recevoir des donnes binaires.
XMLHttpRequest permet d'couter diffrents vnements qui se produisent lors du traitement de la requte. Parmi ces vnements, on trouve de quoi notifier l'avancement, les erreurs, etc.
Pour suivre l'volution d'un transfert avec XMLHttpRequest, on utilisera progress qui implmente l'interface ProgressEvent. Les vnements qui peuvent tre couts pour connatre l'avancement de la requte sont :
progressLa quantit de donnes reues a chang.
loadLe transfert est termin. Toutes les donnes sont dsormais crites dans response.
const req = new XMLHttpRequest();
req.addEventListener("progress", updateProgress);
req.addEventListener("load", transferComplete);
req.addEventListener("error", transferFailed);
req.addEventListener("abort", transferCanceled);
req.open();
//
// Avancement du transfert du serveur au client (tlchargements)
function updateProgress(event) {
if (event.lengthComputable) {
const percentComplete = (event.loaded / event.total) * 100;
//
} else {
// Impossible de connatre l'avancement, car la taille
// totale est inconnue
}
}
function transferComplete(evt) {
console.log("Le transfert est termin.");
}
function transferFailed(evt) {
console.log("Une erreur est survenue lors du transfert du fichier.");
}
function transferCanceled(evt) {
console.log("Le transfert a t annul.");
}
Les lignes 3 6 du fragment ci-avant ajoutent les gestionnaires d'vnements pour les diffrents vnements mis propos du transfert des donnes l'aide de XMLHttpRequest.
Note :
Ces gestionnaires d'vnements doivent tre ajouts avant d'appeler open() sur la requte. Sinon, les vnements progress ne seront pas capts.
Le gestionnaire d'vnement pour l'avancement, port par la fonction updateProgress() dans l'exemple, reoit le nombre total d'octets transfrer (total) ainsi que le nombre d'octets transfrs jusqu' prsent (loaded). Toutefois, si le champ lengthComputable vaut false, la longueur totale est inconnue et vaudra 0 par dfaut.
Les vnements d'avancement existent pour les tlchargements (downloads) et les tlversements (uploads). Pour les tlchargements, les vnements sont dclenchs sur l'objet XMLHttpRequest, comme illustr dans l'exemple prcdent. Pour les tlversements, les vnements sont dclenchs sur l'objet XMLHttpRequest.upload, comme ceci :
const req = new XMLHttpRequest();
req.upload.addEventListener("progress", updateProgress);
req.upload.addEventListener("load", transferComplete);
req.upload.addEventListener("error", transferFailed);
req.upload.addEventListener("abort", transferCanceled);
oReq.open();
Note :
Les vnements d'avancement ne sont pas disponibles pour le protocole file:.
Les vnements d'avancements sont mis chaque fragment (chunk) de donnes reu, y compris le dernier fragment pour les cas o le paquet est reu et la connexion ferme avant que l'vnement soit dclench. Dans ce cas, l'vnement progress est automatiquement dclench lorsque l'vnement load se produit pour ce paquet. Cela permet de surveiller l'avancement de faon fiable, l'aide du seul vnement progress.
On peut galement dtecter les trois conditions de fin de chargement (abort, load, ou error) l'aide de l'vnement loadend :
req.addEventListener("loadend", loadEnd);
function loadEnd(e) {
console.log(
"Le transfert est termin (mais on ne sait pas s'il a russi ou non).",
);
}
Il n'y a pas de certitude possible quant l'information reue par l'vnement loadend pour dterminer la condition de l'arrt. Toutefois, cet vnement permet de grer les tches ncessaires la fin des transferts.
function getHeaderTime() {
console.log(this.getResponseHeader("Last-Modified")); // Une date GMTString valide ou null
}
const req = new XMLHttpRequest();
req.open(
"HEAD", // On utilise HEAD, car on ne veut rcuprer que les en-ttes
"votrepage.html",
);
req.onload = getHeaderTime;
req.send();
Crons deux fonctions :
function getHeaderTime() {
const lastVisit = parseFloat(
window.localStorage.getItem(`lm_${this.filepath}`),
);
const lastModified = Date.parse(this.getResponseHeader("Last-Modified"));
if (isNaN(lastVisit) || lastModified > lastVisit) {
window.localStorage.setItem(`lm_${this.filepath}`, Date.now());
isFinite(lastVisit) && this.callback(lastModified, lastVisit);
}
}
function ifHasChanged(URL, callback) {
const req = new XMLHttpRequest();
req.open(
"HEAD" /* On utilise HEAD, car on ne veut rcuprer que les en-ttes */,
URL,
);
req.callback = callback;
req.filepath = URL;
req.onload = getHeaderTime;
req.send();
}
Pour tester cet exemple :
// Testons le fichier "votrepage.html"
ifHasChanged("votrepage.html", function (modified, visit) {
console.log(
`La page '${this.filepath}' a t modifie le ${new Date(
nModified,
).toLocaleString()}!`,
);
});
Si vous souhaitez savoir si la page actuelle a chang, voyez l'article document.lastModified.
XMLHttpRequest entre diffrentes originesLes navigateurs prennent en charge les requtes entre diffrents sites/origines en implmentant le standard CORS (Cross-Origin Resource Sharing (pour partage des ressources entre diffrentes origines ). Tant que le serveur est configur afin d'autoriser les requtes depuis l'origine de votre application web, XMLHttpRequest fonctionnera correctement. Dans le cas contraire, une exception INVALID_ACCESS_ERR sera dclenche.
Pour outrepasser le cache avec une mthode qui fonctionne dans les diffrents navigateurs, on pourra ajouter un horodatage l'URL en s'assurant d'encoder correctement la valeur (avec ? ou & o c'est ncessaire). Ainsi :
http://example.com/truc.html -> http://example.com/truc.html?12345 http://example.com/truc.html?bidule=machin -> http://example.com/truc.html?bidule=machin&12345
Le cache local tant index avec les URL, chaque requte sera ainsi unique et passera outre le cache.
On peut ajuster les URL automatiquement avec le code qui suit :
const req = new XMLHttpRequest();
req.open("GET", url + (/\?/.test(url) ? "&" : "?") + new Date().getTime());
req.send(null);
La mthode recommande pour autoriser les requtes scriptes entre diffrentes origines est d'inclure l'en-tte HTTP Access-Control-Allow-Origin dans la rponse la requte XHR.
Si votre requte XHR se termine avec status=0 et statusText=null, cela signifie que son excution n'a pas t autorise. Elle n'a pas t envoye (UNSENT). Cela se produit gnralement lorsque l'origine de la requte a chang entre la cration et l'ouverture qui suit avec open(). Cela peut par exemple se produire lorsqu'une requte XHR est dclenche pour un vnement onunload d'une fentre. La requte est cre lorsque la fentre fermer existe encore, mais l'envoi qui suit (avec open()) se produit lorsque la fentre a perdu le focus et l'a pass une autre fentre. Pour viter ce problme, le mieux consistera placer un gestionnaire d'vnements DOMActivate sur la nouvelle fentre lorsque la fentre fermer reoit l'vnement unload.
| Spcification |
|---|
| XMLHttpRequest # interface-xmlhttprequest |
XMLHttpRequestXMLHttpRequestCette page a t modifie le 9 oct. 2025 par les contributeurices du MDN.
Certaines parties de ce contenu sont protges par le droit d'auteur 19982026 des contributeurs individuels de mozilla.org. Contenu disponible sous une licence Creative Commons.
| Web Proxy Viewer | New URL | Original Page |