我可以使用 jQuery 预过滤器来检测 readyState==3 的 onreadystatechange 事件吗?
-
14-11-2019 - |
题
我正在尝试在 jQuery 中实现 XHR 流式 Comet 技术,但是在检测 onreadystatechange
事件。我使用的是火狐4.0.1。
我在用着 预过滤器 (自 jQuery 1.5 起可用)修改本机 XHR 对象,特别是向 onreadystatechange
事件。我有一个粗略的实现 http://jsfiddle.net/Rdx6f/. 。该代码将 XHR 对象的文档附加到 readyState
和 responseText
属性时 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。
这是保留即将发生的更改的票证:
其他提示
这是从 jQuery bugzilla bug 正确链接的预过滤 #8327,