Является ли onload равным readyState==4 в XMLHttpRequest?
я путаю о событии возврата xhr, как я могу сказать, между onreadystatechange --> readyState == 4 и onload, это правда?
var xhr = new XMLHttpRequest();
xhr.open("Get", url, false);
xhr.onreadystatechange = function() {
if (xhr.readyState === 4)
{
/* do some thing*/
}
};
xhr.send(null);
или
xhr.onload = function() { /* do something */ }
3 ответа:
Это должно быть то же самое.
onload
был добавлен в XMLHttpRequest 2 тогда какonreadystatechange
существует с момента первоначальной спецификации.
Это почти всегда верно. Однако одно существенное различие заключается в том, что обработчик событий onreadystatechange также запускается с помощью readyState==4 в тех случаях, когда обычно запускается обработчик onerror (обычно это проблема сетевого подключения). В этом случае он получает статус 0. Я проверил, что это происходит на последних Chrome, Firefox и IE.
поэтому, если вы используете onerror и ориентируетесь на современные браузеры, вы не должны использовать onreadystatechange но вместо этого следует использовать onload, который, как представляется, гарантированно вызывается только тогда, когда HTTP-запрос успешно завершен (с реальным ответом и кодом состояния). В противном случае вы можете получить два обработчика событий, срабатывающих в случае ошибок (именно так я эмпирически узнал об этом частном случае.)
вот ссылка на программы Test Plunker Я написал, что позволяет тестировать различные URL-адреса и видеть фактическую последовательность событий и значения readyState, как видно приложение JavaScript в разных случаях. Код JS также указан ниже:
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(); }