1

我正在尝试在 jQuery 中实现 XHR 流彗星技术,但在检测onreadystatechange事件时遇到了一些问题。我正在使用 Firefox 4.0.1。

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

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

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

我还可以在原生 JavaScript 中检测 1、2、3 或 4 的onreadystatechange事件——参见http://jsfiddle.net/d7vaH/。(该代码几乎一字不差地取自 Dylan Schiemann 在“Even Faster Websites”一书第 115 页上的 XHR 流的实现。)readyState

我只是在这里做错了什么,比如使用 jQuery 的 Ajax 预过滤器错误或 JavaScript 错误?这可能是 jQuery 中的错误吗?

4

2 回答 2

5

仅供参考:我对此进行了深入研究,结果发现 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

于 2012-03-06T00:46:11.227 回答
0

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

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

于 2011-05-17T20:35:05.760 回答