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

时间:2011-05-17 19:22:43

标签: jquery comet http-streaming onreadystatechange

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

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

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

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

我还可以在原始JavaScript中onreadystatechange为1,2,3或4时检测readyState个事件 - 请参阅http://jsfiddle.net/Rdx6f/。 (该代码几乎是从Dylan Schiemann在“更快的网站”一书的第115页上实施XHR流程中逐字逐句获得的。)

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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