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???

Foi útil?

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:

http://bugs.jquery.com/ticket/9883

Outras dicas

Aqui é o pré-filtragem feito corretamente ligado e o plugin do erro no bugzilla #8327,

http://jsfiddle.net/d8ckU/1/

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top