Pregunta

Estoy intentando implementar la técnica Comet de transmisión XHR en jQuery, pero tengo problemas para detectar el onreadystatechange evento.Estoy usando Firefox 4.0.1.

Estoy usando prefiltros (disponible desde jQuery 1.5) para modificar el objeto XHR nativo, específicamente para agregar un controlador de eventos al onreadystatechange evento.Tengo una implementación cruda de eso en http://jsfiddle.net/Rdx6f/.Ese código se adjunta al documento del objeto XHR. readyState y responseText atributos cuando el onreadystatechange Se dispara el evento.Curiosamente, sin embargo, sólo parece detectar el onreadystatechange evento cuando readyState es 1.

En otras palabras, jQuery parece estar detectando el onreadystatechange evento cuando el objeto XMLHttpRequest está en estado "abierto" (readyState 1), pero no cuando el objeto XHR está en estado "encabezados recibidos" (readyState 2), "cargando" (readyState 3), ni "hecho" (readyState 4) .

Curiosamente, si yo alert() en el controlador de eventos, entonces yo hacer ver el onreadystatechange manejo cuando readyState es 1, 2, 3 y 4.Ver http://jsfiddle.net/Rdx6f/1/.Mismo código que http://jsfiddle.net/Rdx6f/, justo alert()ing en lugar de anexarlo al documento.

yo también puedo detectar onreadystatechange eventos cuando readyState es 1, 2, 3 o 4 en JavaScript nativo; consulte http://jsfiddle.net/d7vaH/.(Ese código está tomado casi palabra por palabra de la implementación de Dylan Schiemann de la transmisión XHR en la página 115 del libro "Even Faster Websites".)

¿Simplemente estoy haciendo algo mal aquí, como usar mal los prefiltros Ajax de jQuery o cometer un error de JavaScript?¿Es esto quizás un error en jQuery?

¿Fue útil?

Solución

Para su información:Investigué esto con bastante profundidad y resulta que jQuery (desde 1.5) usa el evento onreadystatechange internamente.La consecuencia de esto es que jQuery siempre escriba su función interna en el evento onreadystatechange, sobrescribiendo lo que haya configurado.Esto sucede cada vez que se envía la llamada AJAX, lo que significa que la función que escribió para onreadystatechange funcionará hasta ese momento (lo que significa que funcionará hasta que readyState = 1, pero no más).

Esta es la solución propuesta en este momento: http://jsfiddle.net/tBTW2/

Por el momento, no puedo ver una solución diferente (mejor) sin usar jQuery (o volver a la versión 1.4.4 o inferior, donde funciona perfectamente) o editar el código jQuery (porque, como está ahora, siempre lo harán). sobrescribe todo lo que intentes conectar).

Sin embargo, en las próximas versiones (probablemente en la 1.8), el equipo de jQuery planea implementar soporte para activar eventos dependiendo de los diferentes estados preparados.Utilizarán Diferidos de alguna manera.

Este es el ticket que mantiene este próximo cambio:

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

Otros consejos

Aquí está el prefiltrado realizado correctamente vinculado desde el error jQuery bugzilla #8327,

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top