2

我有一个 div:

<div id="content"></div>

当页面加载时,我调用一个.load(). 此加载大约需要 10 分钟才能完成,并且在执行期间,其 PHP 文件会返回一些有关执行状态的信息,例如 Linux 加载。我想#content动态地将这些信息放入 div 中,但.load()仅在执行结束时放入。有人可以帮我这样做吗?

.load()来电:

$("#content").load("/admin/ajax/analyse.php");
4

3 回答 3

3

jQuery 的 ajax 接口不提供获取响应进度更新的方法(即使它声称是浏览器原生XMLHttpRequest对象的超集)。显然,这样的用例对于 jQuery 开发人员来说是不可想象的

然而,没有提供任何onreadystatechange机制,因为、success和涵盖了所有可能的要求。errorcompletestatusCode

通过直接使用 an ,您可以在事件处理程序XMLHttpRequest中读取响应的当前进度:onreadystatechange

var xhr = new XMLHttpRequest();
xhr.open("GET", "/admin/ajax/analyse.php", true);
xhr.onreadystatechange = function receiveUpdate(e) {
    $("#content").html(this.responseText);
}
xhr.send();

这适用于大多数浏览器的最新版本,包括 IE 10、Chrome 和 Firefox。

演示:

于 2013-01-19T01:30:46.430 回答
0

这只是一个你必须淘汰的想法......

在服务器上,

  1. 用户点击 URL #1,
  2. 如果还没有会话,则开始会话。
  3. 启动生成数据的异步进程。
  4. 当它完成部分数据时,它会排队。更简单地说,它将数据以块的形式放在某处。可能是内存中缓存的数据库。
  5. 当异步任务生成所有数据时,它会使用一些魔术字符串发送文件结束指示。

在服务器上也:

  1. 同一个用户点击 URL #2(你从会话信息中知道)
  2. 你从队列的前面给他一大块数据。
  3. 每次他点击 URL #2 时,您都会给他更多数据。
  4. 当浏览器最后一次请求并且只剩下文件结束指示时,服务器可以返回一些表明没有更多数据的HTTP结果代码,或者它可以返回魔术字符串。

在客户端,

  1. 对 URL #1 执行 ajax 请求以启动服务器生成。
  2. 重复向 URL #2 发出请求。
  3. 每个结果都会附加到页面元素,以便用户可以在它到达时看到它。
  4. 当客户端请求返回“没有更多数据”结果代码(或神奇的文件结尾字符串)时,它会停止请求更多数据并向用户发出信号,方法是在屏幕上显示所有数据都在那里。

那应该对你有用。

于 2013-01-18T22:28:25.017 回答
0

有几种方法可以解决这个问题,但所有这些都需要服务器端的更改。一种解决方案(我认为最适合您想象它的工作方式)是long polling

请参阅有关使用 PHP 和 jQuery 进行长轮询的问题

于 2013-01-18T22:14:48.750 回答