我可以使用jQuery预过滤器来检测readyState == 3的onreadystatechange事件吗?

jqp*_*jqp 1 jquery comet onreadystatechange http-streaming

我正在尝试在jQuery中实现XHR流Comet技术,但是在检测onreadystatechange事件时遇到了一些麻烦.我正在使用Firefox 4.0.1.

我正在使用预过滤器(自jQuery 1.5起可用)来修改本机XHR对象,特别是为事件添加事件处理程序onreadystatechange.我在http://jsfiddle.net/Rdx6f/上有一个粗略的实现.该事件被触发时,该代码会将文档附加到XHR对象readyStateresponseText属性onreadystatechange.但奇怪的是,它似乎只onreadystatechangereadyState1 时检测到事件.

换句话说,onreadystatechange当XMLHttpRequest对象处于"打开"状态(readyState 1)时,jQuery似乎检测到事件,但是当XHR对象处于"收到的头"状态(readyState 2),"loading"(readyState 3)时,jQuery似乎没有检测到事件. ),也没有"完成"(readyState 4).

奇怪的是,如果我alert()在事件处理程序中,那么我确实看到onreadystatechangereadyState为1,2,3和4时的处理.请参阅http://jsfiddle.net/Rdx6f/1/.与http://jsfiddle.net/Rdx6f/相同的代码,只是alert()而不是附加到文档.

我还可以在本机JavaScript中检测1,2,3或4 onreadystatechange时的事件readyState- 请参阅http://jsfiddle.net/d7vaH/.(该代码几乎是从Dylan Schiemann在"Even Faster Websites"一书的第115页上实现的XHR流程中逐字记录的.)

我只是在这里做错了,比如使用jQuery的Ajax前置错误或者出现JavaScript错误?这可能是jQuery中的一个错误吗?

car*_*ist 5

仅供参考:我深入研究了这一点,结果发现jQuery(自1.5起)在内部使用了onreadystatechange事件.这样做的结果是jQuery将始终将其内部函数写入onreadystatechange事件,覆盖您设置的任何内容.无论何时实际发送AJAX调用都会发生这种情况,这意味着您为onreadystatechange编写的函数将一直有效(这意味着它将工作到readyState = 1,但不会更长).

这是目前提议的解决方法:http://jsfiddle.net/tBTW2/

目前,我没有看到不同的(更好的)解决方法,如果没有使用jQuery(或回到1.4.4或更低版本,它完美地工作)或编辑jQuery代码(因为它现在是他们将永远覆盖你试图挂钩的任何东西).

但是,在即将发布的版本中(最有可能是1.8版本),jQuery团队正计划根据不同的readyStates实现对触发事件的支持.他们将以某种方式使用Deferreds.

这是保持即将发生的变化的票证:

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