Questo è quasi sempre vero. Una differenza significativa, tuttavia, è che il onreadystatechange
gestore eventi viene attivato anche readyState==4
nei casi in cui il onerror
gestore viene solitamente attivato (in genere un problema di connettività di rete). In questo caso ottiene uno stato 0. Ho verificato che ciò avvenga sugli ultimi Chrome, Firefox e IE.
Quindi, se stai usando onerror
e stai prendendo di mira i browser moderni, non dovresti usare onreadystatechange
ma dovresti usare onload
invece, che sembra essere garantito per essere chiamato solo quando la richiesta HTTP è stata completata con successo (con una risposta reale e un codice di stato). Altrimenti potresti finire per ottenere due gestori di eventi attivati in caso di errori (che è il modo in cui ho scoperto empiricamente questo caso speciale).
Di seguito è riportato un collegamento a un programma di test Plunker che ho scritto che consente di testare URL diversi e vedere la sequenza effettiva di eventi e readyState
valori così come viene visualizzata dall'app JavaScript in casi diversi. Il codice JS è anche elencato di seguito:
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();
}