【发布时间】:2014-07-12 13:09:19
【问题描述】:
我的应用程序为客户提供即时的部分响应,而不是让他们等待整个响应完成。
所有主流浏览器都能正确处理部分响应,除了 Opera。
这是发生了什么:
已在处理部分响应(又名 readyState 3)的每一行代码上设置断点,如下所示:
if (this.readyState == 3) {
$(".serverResponse").html(xhr.responseText); // Breakpoint set up here
}
每个主流浏览器在每次执行 xhr.onreadystatechange 时,都会一个接一个地抓取块,并将它们填充到 xhr.responseText 中(也在 xhr.response 上,但这不在问题范围内),以便客户端可以逐渐看到响应在任意元素上的进度,为此我给出了一个 serverResponse 类。所以 serverResponse 的增长是这样的:
response1
response1 response2
response1 response2 response3
etc...
现在,Opera 是做什么的?
Opera 在第一次运行 xhr.onreadystatechange 时获取整个响应。第一次运行后,serverResponse 已经是这样的了:
response1 response2 response3
就像 Opera 不等待任何部分响应,或者根本不关心任何响应。它似乎无缘无故地运行 xhr 函数。
为什么会这样?
因为如果我删除断点,serverResponse 将不会得到任何响应。但是,如果我添加断点并且不让脚本运行几秒钟,那么就是这样,整个响应都写在 serverResponse 上。
这一切似乎只是 Opera 的某种奇怪行为,我怀疑这是缓存问题。
有什么方法可以让 Opera 像其他浏览器一样工作?
编辑:为了让事情更清楚,Opera 仍然逐渐获取响应,但它似乎并没有通知 xhr.onreadystatechange 该更改。所有主要的浏览器都会抓住他们看到的第一件事,然后在断点处停止,等待我让脚本继续运行时的下一个块。
他们还多次运行 xhr.onreadystatechange 函数(主要浏览器似乎使该函数在服务器有新块可用时立即循环运行),直到服务器结束响应。 Opera 只运行一次函数,它似乎根本不想等待任何响应,这解释了为什么 serverResponse 只在我让断点激活几秒钟后才得到文本写入它,然后我让脚本再次运行.
【问题讨论】:
标签: javascript xmlhttprequest opera