Estou confuso sobre o evento de retorno xhr, como posso dizer, não há muito diferente entre onreadystatechange -> readyState == 4 e onload, é verdade?
var xhr = new XMLHttpRequest();
xhr.open("Get", url, false);
xhr.onreadystatechange = function() {
if (xhr.readyState === 4)
{
/* do some thing*/
}
};
xhr.send(null);
ou
xhr.onload = function() { /* do something */ }
javascript
ajax
xmlhttprequest
Huang
fonte
fonte
Respostas:
Deve ser a mesma coisa.
onload
foi adicionado no XMLHttpRequest 2, enquantoonreadystatechange
existe desde a especificação original.fonte
Isso quase sempre é verdade. Uma diferença significativa, no entanto, é que o
onreadystatechange
manipulador de eventos também é acionadoreadyState==4
nos casos em que oonerror
manipulador geralmente é acionado (geralmente um problema de conectividade de rede). Ele obtém o status 0 neste caso. Eu verifiquei que isso acontece no Chrome, Firefox e IE mais recente.Portanto, se você estiver usando
onerror
e estiver direcionando navegadores modernos, não deve usá-lo,onreadystatechange
mas deve usá-loonload
, o que parece ter garantia de ser chamado somente quando a solicitação HTTP for concluída com êxito (com uma resposta real e um código de status). Caso contrário, você poderá obter dois manipuladores de eventos acionados em caso de erros (que é como eu descobri empiricamente esse caso especial).Aqui está um link para um programa de teste do Plunker que escrevi que permite testar diferentes URLs e ver a sequência real de eventos e
readyState
valores, conforme visto pelo aplicativo JavaScript em diferentes casos. O código JS também está listado abaixo:fonte
onload
,readyState === 4
é garantido que é verdade, certo?readyState
pode ser 4error
ouabort
casos também. Esse estado basicamente significa que o processo de carregamento foi concluído, com ou sem êxito. Para uma carga normal e bem-sucedida, a sequência final de eventos é:progress
(com todos os dados carregados),readystatechange
(comreadyState == 4
)load
,,loadend
.onload
também não será desencadeada seNo 'Access-Control-Allow-Origin' header is present on the requested resource.
onerror
manipulador.Não, eles não são os mesmos. Se você encontrar um erro de rede ou interromper a operação,
onload
não será chamado. Na verdade, o evento mais próximoreadyState === 4
serialoadend
. O fluxo fica assim:fonte