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对象readyState
和responseText
属性onreadystatechange
.但奇怪的是,它似乎只onreadystatechange
在readyState
1 时检测到事件.
换句话说,onreadystatechange
当XMLHttpRequest对象处于"打开"状态(readyState 1)时,jQuery似乎检测到事件,但是当XHR对象处于"收到的头"状态(readyState 2),"loading"(readyState 3)时,jQuery似乎没有检测到事件. ),也没有"完成"(readyState 4).
奇怪的是,如果我alert()
在事件处理程序中,那么我确实看到onreadystatechange
readyState为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中的一个错误吗?
仅供参考:我深入研究了这一点,结果发现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