Ini hampir selalu benar. Satu perbedaan yang signifikan, bagaimanapun, adalah bahwa onreadystatechange
pengendali kejadian juga dipicu readyState==4
dalam kasus di mana onerror
pengendali biasanya dipicu (biasanya masalah konektivitas jaringan). Ini mendapat status 0 dalam kasus ini. Saya telah memverifikasi ini terjadi di Chrome, Firefox, dan IE terbaru.
Jadi, jika Anda menggunakan onerror
dan menargetkan browser modern, Anda tidak boleh menggunakan onreadystatechange
tetapi harus menggunakan onload
, yang tampaknya dijamin hanya akan dipanggil ketika permintaan HTTP berhasil diselesaikan (dengan respons nyata dan kode status). Jika tidak, Anda mungkin akan mendapatkan dua event handler yang dipicu jika terjadi kesalahan (begitulah cara saya menemukan secara empiris tentang kasus khusus ini.)
Berikut ini tautan ke program uji Plunker yang saya tulis yang memungkinkan Anda menguji URL yang berbeda dan melihat urutan kejadian dan readyState
nilai yang sebenarnya seperti yang terlihat oleh aplikasi JavaScript dalam berbagai kasus. Kode JS juga tercantum di bawah ini:
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();
}