Puis-je utiliser des préfiltres jQuery pour détecter les événements onreadystatechange où readyState==3 ?

StackOverflow https://stackoverflow.com/questions/6035987

Question

J'essaie d'implémenter la technique Comet de streaming XHR dans jQuery, mais j'ai du mal à détecter le onreadystatechange événement.J'utilise Firefox 4.0.1.

j'utilise préfiltres (disponible depuis jQuery 1.5) pour modifier l'objet XHR natif, notamment pour ajouter un gestionnaire d'événements au onreadystatechange événement.J'en ai une implémentation grossière sur http://jsfiddle.net/Rdx6f/.Ce code ajoute au document le nom de l'objet XHR readyState et responseText attributs lorsque le onreadystatechange l'événement est déclenché.Curieusement, cependant, il semble détecter uniquement le onreadystatechange événement quand readyState est 1.

En d'autres termes, jQuery semble détecter le onreadystatechange événement lorsque l'objet XMLHttpRequest est à l'état "ouvert" (readyState 1), mais pas lorsque l'objet XHR est à l'état "en-têtes reçus" (readyState 2), "loading" (readyState 3), ni "done" (readyState 4) .

Bizarrement, si je alert() dans le gestionnaire d'événements, alors je faire voir le onreadystatechange gestion lorsque readyState est 1, 2, 3 et 4.Voir http://jsfiddle.net/Rdx6f/1/.Même code que http://jsfiddle.net/Rdx6f/, juste alert()au lieu de l'ajouter au document.

Je peux aussi détecter onreadystatechange événements quand readyState est 1, 2, 3 ou 4 en JavaScript natif -- voir http://jsfiddle.net/d7vaH/.(Ce code est tiré presque textuellement de la mise en œuvre du streaming XHR par Dylan Schiemann à la page 115 du livre "Even Faster Websites".)

Est-ce que je fais simplement quelque chose de mal ici, comme utiliser mal les préfiltres Ajax de jQuery ou faire une erreur JavaScript ?Est-ce peut-être un bug de jQuery ?

Était-ce utile?

La solution

POUR VOTRE INFORMATION:J'ai étudié cela assez en profondeur et il s'avère que jQuery (depuis la version 1.5) utilise l'événement onreadystatechange en interne.La conséquence de ceci est que jQuery va toujours écrivez sa fonction interne dans l'événement onreadystatechange, en écrasant ce que vous avez défini.Cela se produit chaque fois que l'appel AJAX est effectivement envoyé, ce qui signifie que la fonction que vous avez écrite pour onreadystatechange fonctionnera jusqu'à ce moment-là (ce qui signifie qu'elle fonctionnera jusqu'à ce que readyState = 1, mais pas plus).

Voici la solution de contournement proposée pour le moment : http://jsfiddle.net/tBTW2/

Pour le moment, je ne vois pas de solution de contournement différente (meilleure) sans soit utiliser jQuery (ou revenir à la version 1.4.4 ou inférieure, où cela fonctionne parfaitement) ni modifier le code jQuery (car tel qu'il est actuellement, ils le feront toujours écrasez tout ce que vous essayez de connecter).

Cependant, dans les versions à venir (très probablement dans la version 1.8), l'équipe jQuery prévoit d'implémenter la prise en charge du déclenchement d'événements en fonction des différents états prêts.Ils utiliseront les différés d’une manière ou d’une autre.

C'est le ticket qui conserve ce changement à venir :

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

Autres conseils

Voici le préfiltrage effectué correctement lié au bug jQuery bugzilla #8327,

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top