C'est presque toujours vrai. Une différence significative, cependant, est que le onreadystatechange
gestionnaire d'événements est également déclenché readyState==4
dans les cas où le onerror
gestionnaire est généralement déclenché (généralement un problème de connectivité réseau). Il obtient le statut 0 dans ce cas. J'ai vérifié que cela se produit sur les derniers Chrome, Firefox et IE.
Donc, si vous utilisez onerror
et ciblez des navigateurs modernes, vous ne devriez pas utiliser onreadystatechange
mais onload
plutôt utiliser , ce qui semble être garanti uniquement lorsque la requête HTTP s'est terminée avec succès (avec une réponse réelle et un code d'état). Sinon, vous risquez de déclencher deux gestionnaires d'événements en cas d'erreurs (c'est ainsi que j'ai découvert empiriquement ce cas particulier.)
Voici un lien vers un programme de test Plunker que j'ai écrit qui vous permet de tester différentes URL et de voir la séquence réelle des événements et des readyState
valeurs vues par l'application JavaScript dans différents cas. Le code JS est également répertorié ci-dessous:
var xhr;
function test(url) {
xhr = new XMLHttpRequest();
xhr.addEventListener("readystatechange", function() { log(xhr, "readystatechange") });
xhr.addEventListener("loadstart", function(ev) { log(xhr, "loadstart", ev.loaded + " of " + ev.total) });
xhr.addEventListener("progress", function(ev) { log(xhr, "progress", ev.loaded + " of " + ev.total) });
xhr.addEventListener("abort", function() { log(xhr, "abort") });
xhr.addEventListener("error", function() { log(xhr, "error") });
xhr.addEventListener("load", function() { log(xhr, "load") });
xhr.addEventListener("timeout", function(ev) { log(xhr, "timeout", ev.loaded + " of " + ev.total) });
xhr.addEventListener("loadend", function(ev) { log(xhr, "loadend", ev.loaded + " of " + ev.total) });
xhr.open("GET", url);
xhr.send();
}
function clearLog() {
document.getElementById('log').innerHTML = '';
}
function logText(msg) {
document.getElementById('log').innerHTML += msg + "<br/>";
}
function log(xhr, evType, info) {
var evInfo = evType;
if (info)
evInfo += " - " + info ;
evInfo += " - readyState: " + xhr.readyState + ", status: " + xhr.status;
logText(evInfo);
}
function selected(radio) {
document.getElementById('url').value = radio.value;
}
function testUrl() {
clearLog();
var url = document.getElementById('url').value;
if (!url)
logText("Please select or type a URL");
else {
logText("++ Testing URL: " + url);
test(url);
}
}
function abort() {
xhr.abort();
}