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.
onloadse agregó en XMLHttpRequest 2 mientras queonreadystatechangeha existido desde la especificación original.fuente
Esto es casi siempre cierto. Sin embargo, una diferencia significativa es que el
onreadystatechangecontrolador de eventos también se activareadyState==4en los casos en losonerrorque 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
onerrory está apuntando a navegadores modernos, no debe usar,onreadystatechangesino que debe usaronloaden 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
readyStatevalores 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 === 4se garantiza que sea verdad?readyStatepuede ser 4 enerroroabortcasos 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.onloadtampoco se activará siNo 'Access-Control-Allow-Origin' header is present on the requested resource.onerrorcontrolador.No, no son lo mismo. Si encuentra un error de red o cancela la operación,
onloadno será llamado. En realidad, el evento más cercanoreadyState === 4seríaloadend. El flujo se ve así:fuente