Opera中的XMLHttpRequest readyState == 3

时间:2014-07-12 13:09:19

标签: javascript xmlhttprequest opera

我的应用程序为客户提供即时的部分响应,而不是让他们等待整个响应完成。

除Opera之外,所有主流浏览器都能正确处理部分响应。

这里发生了什么:

已经在处理部分响应的每行代码(a.k.a.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时获取了WHOLE响应。第一次运行后,serverResponse就像这样:

response1 response2 response3

它不像Opera那样等待任何部分响应,或者根本不关心任何响应。它似乎无缘无故地运行xhr函数。

为什么会这样?

因为如果删除断点,serverResponse将不会在其上写入任何响应。但是,如果我添加断点并且不让脚本运行几秒钟,那就是整个响应写在serverResponse上。

这一切似乎都是Opera的一种奇怪行为,我怀疑这是一个缓存问题。

有没有办法让Opera的行为与其他浏览器一样?

编辑:为了使事情更清楚,Opera仍然逐渐抓住响应,但它似乎并没有通知xhr.onreadystatechange的变化。所有主流浏览器都抓住了他们看到的第一件事,只是在断点处停下来,一旦我让脚本继续运行就等待下一个块。

他们还多次运行xhr.onreadystatechange函数(主要的浏览器似乎只要服务器有新的块就可以使这个函数在循环中运行),直到服务器结束响应。 Opera只运行ONCE函数,它似乎根本不想等待任何响应,这解释了为什么serverResponse只有在我让断点激活几秒钟之后才会在其上写入文本又跑了。

1 个答案:

答案 0 :(得分:-1)

我不想回答我自己的问题,但无论如何它仍然存在......

问题出现了,因为我使用的是较早版本的Opera(准确地说是12.17)。我得到了Opera 22,它现在可以处理部分响应,就像其他主流浏览器一样。现在顶部的樱桃将检查更改日志以查看他们何时解决了这个特定问题,但我并不打扰它。

最新的浏览器解决了很多问题。保持浏览器的更新!