C'est presque toujours vrai. Une différence significative, cependant, est que le onreadystatechangegestionnaire d'événements est également déclenché readyState==4dans les cas où le onerrorgestionnaire 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 onerroret ciblez des navigateurs modernes, vous ne devriez pas utiliser onreadystatechangemais onloadplutô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 readyStatevaleurs 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();
}