Bu neredeyse her zaman doğrudur. Bununla birlikte, önemli bir fark, işleyicinin genellikle tetiklendiği durumlarda (tipik olarak bir ağ bağlantısı sorunu) onreadystatechange
olay işleyicisinin de tetiklenmesidir . Bu durumda 0 statüsü alır. Bunun en son Chrome, Firefox ve IE'de olduğunu doğruladım.readyState==4
onerror
Bu nedenle onerror
, modern tarayıcıları kullanıyorsanız ve hedefliyorsanız, onreadystatechange
kullanmamalısınız, onload
bunun yerine kullanmalısınız ; bu, yalnızca HTTP isteği başarıyla tamamlandığında (gerçek bir yanıt ve durum kodu ile) çağrılacağı garanti edilir. Aksi takdirde, hata durumunda tetiklenen iki olay işleyicisine sahip olabilirsiniz (bu, bu özel durumu deneysel olarak bu şekilde öğrendim.)
İşte yazdığım bir Plunker test programına , farklı URL'leri test etmenize readyState
ve JavaScript uygulaması tarafından farklı durumlarda görülen gerçek olay ve değer sırasını görmenize olanak tanıyan bir bağlantı . JS kodu da aşağıda listelenmiştir:
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();
}