我正在尝试在 jQuery 中实现 XHR 流式 Comet 技术,但是在检测 onreadystatechange 事件。我使用的是火狐4.0.1。

我在用着 预过滤器 (自 jQuery 1.5 起可用)修改本机 XHR 对象,特别是向 onreadystatechange 事件。我有一个粗略的实现 http://jsfiddle.net/Rdx6f/. 。该代码将 XHR 对象的文档附加到 readyStateresponseText 属性时 onreadystatechange 事件被触发。然而奇怪的是,它似乎只检测到 onreadystatechange 事件当 readyState 是 1。

换句话说,jQuery 似乎正在检测 onreadystatechange 当 XMLHttpRequest 对象处于“已打开”状态 (readyState 1) 时发生事件,但当 XHR 对象处于“已收到标头”(readyState 2)、“正在加载”(readyState 3) 状态或“完成”(readyState 4) 状态时不会发生事件。

奇怪的是,如果我 alert() 在事件处理程序中,然后我 看到 onreadystatechange 当readyState为1、2、3、4时的处理。看 http://jsfiddle.net/Rdx6f/1/. 。相同的代码 http://jsfiddle.net/Rdx6f/, , 只是 alert()ing 而不是附加到文档中。

我也可以检测到 onreadystatechange 事件时 readyState 在原生 JavaScript 中是 1、2、3 或 4 -- 请参阅 http://jsfiddle.net/d7vaH/. 。(该代码几乎是逐字摘自《Even Faster Websites》一书第 115 页上 Dylan Schiemann 的 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 团队计划实现对根据不同的 ReadyState 触发事件的支持。他们会以某种方式使用 Deferreds。

这是保留即将发生的更改的票证:

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

其他提示

这是从 jQuery bugzilla bug 正确链接的预过滤 #8327,

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top