【问题标题】:XMLHttpRequest readyState == 3 in OperaOpera 中的 XMLHttpRequest readyState == 3
【发布时间】: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


    【解决方案1】:

    我不喜欢回答我自己的问题,但不管怎样……

    问题出现是因为我使用的是旧版本的 Opera(准确地说是 12.17)。我得到了 Opera 22,它现在可以像其他主要浏览器一样处理部分响应。现在最重要的是检查更改日志以查看他们何时修复了此特定问题,但我不介意。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      • 2015-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-29
      • 1970-01-01
      相关资源
      最近更新 更多