Я смущен событием возврата 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 */ }
javascript
ajax
xmlhttprequest
Huang
источник
источник
Ответы:
Должно быть то же самое.
onload
был добавлен в XMLHttpRequest 2, тогда какonreadystatechange
существовал с момента первоначальной спецификации.источник
Это почти всегда правда. Однако одно существенное отличие заключается в том, что
onreadystatechange
обработчик событий также запускаетсяreadyState==4
в тех случаях, когдаonerror
обработчик обычно запускается (обычно проблема сетевого подключения). В этом случае он получает статус 0. Я убедился, что это происходит в последних версиях Chrome, Firefox и IE.Поэтому, если вы используете
onerror
и нацеливаетесь на современные браузеры, вы не должны использовать,onreadystatechange
а должны использоватьonload
вместо них, что, похоже, гарантированно будет вызываться только после успешного завершения HTTP-запроса (с реальным ответом и кодом состояния). В противном случае вы можете получить два обработчика событий, запускаемых в случае ошибки (именно так я эмпирически выяснил об этом особом случае).Вот ссылка на тестовую программу Plunker, которую я написал, которая позволяет вам тестировать разные URL-адреса и видеть фактическую последовательность событий и
readyState
значений, которую видит приложение JavaScript в разных случаях. Код JS также указан ниже:источник
onload
,readyState === 4
это гарантированно правда?readyState
может быть 4error
илиabort
случаев. Это состояние в основном означает, что процесс загрузки завершился успешно или нет. Для нормальной успешной загрузки последняя последовательность событий:progress
(со всеми загруженными данными),readystatechange
(сreadyState == 4
),load
,,loadend
.onload
также не будет срабатывать , еслиNo 'Access-Control-Allow-Origin' header is present on the requested resource.
onerror
обработчик.Нет, они не такие. Если вы столкнетесь с сетевой ошибкой или прервете операцию,
onload
он не будет вызван. Собственно, самое близкое событие, котороеreadyState === 4
могло бы бытьloadend
. Поток выглядит так:источник