Posso usar o jQuery prefilters para detectar onreadystatechange eventos onde readyState==3?
-
14-11-2019 - |
Pergunta
Eu estou tentando implementar o XHR streaming Cometa técnica em jQuery, mas estou tendo alguns problemas para detectar a onreadystatechange
do evento.Estou usando o Firefox 4.0.1.
Eu estou usando prefilters (disponível desde o jQuery 1.5) para modificar o nativo objeto XHR, especificamente para adicionar um manipulador de eventos para o onreadystatechange
do evento.Eu tenho uma implementação crua do que em http://jsfiddle.net/Rdx6f/.Que código acrescenta o documento, o objeto XHR readyState
e responseText
atributos quando o onreadystatechange
evento é acionado.Estranhamente, no entanto, que apenas parece detectar a onreadystatechange
evento quando readyState
1.
Em outras palavras, jQuery parece estar a detectar o onreadystatechange
evento quando o objeto XMLHttpRequest é no estado "aberto" (readyState 1), mas não quando o objeto XHR está no estado "cabeçalhos recebidos" (readyState 2), "carregar" (readyState 3), nem em "done" (readyState 4).
Estranhamente, se eu alert()
no manipulador de eventos, então eu fazer ver o onreadystatechange
tratamento quando readyState é 1, 2, 3 e 4.Ver http://jsfiddle.net/Rdx6f/1/.Mesmo código http://jsfiddle.net/Rdx6f/, só alert()
ing em vez de anexar ao documento.
Eu também pode detectar onreadystatechange
eventos quando readyState
é 1, 2, 3 ou 4 na nativos do JavaScript -- ver http://jsfiddle.net/d7vaH/.(Esse código é retirado quase literalmente de Dylan Schiemann implementação do XHR streaming na página 115 do livro "Ainda mais Rápido de Sites".)
Estou simplesmente fazendo algo errado aqui, como usando jQuery Ajax prefilters errado ou fazer um JavaScript erro?É este, talvez, um erro na sua vida???
Solução
FYI:Eu olhei para isso muito profundamente e o que acontece é que a jQuery (desde 1.5) utiliza o evento onreadystatechange internamente.A consequência disto é que o jQuery vai sempre escrever é função interna para o evento onreadystatechange, substituindo tudo o que você definir.Isso sempre acontece quando a chamada AJAX, na verdade, é enviado, o que significa que a função que você escreveu para onreadystatechange funcionará até que o tempo (o que significa que ele irá trabalhar até o readyState = 1, mas não mais).
Esta é a proposta de solução no momento: http://jsfiddle.net/tBTW2/
No momento, não posso ver um diferente (melhor) solução sem não usando jQuery (ou voltar para 1.4.4 ou versão inferior, onde funciona perfeitamente) ou editando o código jQuery (pois como ela é agora que vai substituir sempre que você tentar gancho).
No entanto, nas próximas versões (mais provável em 1.8), da equipe do jQuery está pensando em implementar o suporte para o acionamento de eventos em função das diferentes readyStates.Eles vão usar Deferreds de alguma forma.
Este é o bilhete que mantém essa alteração futura:
Outras dicas
Aqui é o pré-filtragem feito corretamente ligado e o plugin do erro no bugzilla #8327,