我正在尝试在jQuery中实现XHR流Comet技术,但在检测onreadystatechange
事件时遇到了一些麻烦。我正在使用Firefox 4.0.1。
我正在使用prefilters(自jQuery 1.5起可用)来修改本机XHR对象,特别是为onreadystatechange
事件添加事件处理程序。我在http://jsfiddle.net/Rdx6f/得到了粗略的实现。当readyState
事件被触发时,该代码会将文档附加到XHR对象的responseText
和onreadystatechange
属性。然而,奇怪的是,当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中的一个错误吗?
答案 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。
这是保持即将发生的变化的票据:
答案 1 :(得分:0)
以下是从jQuery bugzilla bug #8327正确链接的预过滤,