Estoy confuso sobre el evento de retorno xhr, como puedo decir, no hay mucha diferencia entre onreadystatechange -> readyState == 4 y onload, ¿es cierto?
var xhr = new XMLHttpRequest();
xhr.open("Get", url, false);
xhr.onreadystatechange = function() {
if (xhr.readyState === 4)
{
/* do some thing*/
}
};
xhr.send(null);
o
xhr.onload = function() { /* do something */ }
javascript
ajax
xmlhttprequest
Huang
fuente
fuente
Respuestas:
Debería ser lo mismo.
onload
se agregó en XMLHttpRequest 2 mientras queonreadystatechange
ha existido desde la especificación original.fuente
Esto es casi siempre cierto. Sin embargo, una diferencia significativa es que el
onreadystatechange
controlador de eventos también se activareadyState==4
en los casos en losonerror
que normalmente se activa el controlador (normalmente un problema de conectividad de red). Obtiene un estado de 0 en este caso. He verificado que esto sucede en las últimas versiones de Chrome, Firefox e IE.Por lo tanto, si está usando
onerror
y está apuntando a navegadores modernos, no debe usar,onreadystatechange
sino que debe usaronload
en su lugar, que parece estar garantizado para ser llamado solo cuando la solicitud HTTP se haya completado con éxito (con una respuesta real y un código de estado). De lo contrario, es posible que se activen dos controladores de eventos en caso de errores (que es cómo descubrí empíricamente este caso especial).Aquí hay un enlace a un programa de prueba de Plunker que escribí que le permite probar diferentes URL y ver la secuencia real de eventos y
readyState
valores tal como la ve la aplicación JavaScript en diferentes casos. El código JS también se enumera a continuación:fuente
onload
, ¿readyState === 4
se garantiza que sea verdad?readyState
puede ser 4 enerror
oabort
casos también. Este estado básicamente significa que el proceso de carga ha finalizado, ya sea con éxito o no. Para una carga normal y exitosa, la secuencia final de eventos es:progress
(con todos los datos cargados),readystatechange
(conreadyState == 4
)load
,,loadend
.onload
tampoco se activará siNo 'Access-Control-Allow-Origin' header is present on the requested resource.
onerror
controlador.No, no son lo mismo. Si encuentra un error de red o cancela la operación,
onload
no será llamado. En realidad, el evento más cercanoreadyState === 4
seríaloadend
. El flujo se ve así:fuente