我正在尝试创建一个函数来显示服务器响应,同时等待ajax完成,案例如下:
Getting data 1 of 10, (total) details obtained...
目前只有4号以上工作,我目前的做法是:
Waiting for active connection
那么我该如何实现呢?因为我的客户端不是基于IT的,我想显示一些进度文本,以便他知道正在处理多少数据。
顺便说一句,目前我只使用加载GIF并在完成ajax时隐藏它。
非常感谢任何帮助或线索,谢谢。
答案 0 :(得分:2)
制作两个函数是一个坏主意,因为即使在同一服务器上并行运行的A()和B()也不能共享它们的变量。你可以只使用一个函数和一些巧妙的缓冲使用来存档该结果。我添加了{ {1}}匹配消耗一些时间的代码。
sleep
注意<?php
set_time_limit(0);
ob_implicit_flush(true);
ob_end_flush();
session_write_close(); // prevents session lockdowns
for($i = 0; $i < 10; $i++){
sleep(1); //Hard work!! zZZ
$p = $i+1;
echo $p . ' of 10 complete '; //get sent immediately
}
sleep(1);
echo '10 of 10 complete';
implicit flush表示只要您回复某些内容,就会立即将发送到浏览器,而不会断开您的连接,这样您就可以获得1,2,3 ...每次循环迭代都是从同一个HTTP连接中逐个进行
接下来是javascript只指向此处需要注意的是ob_implicit_flush(true);
不仅会调用状态更改而是调用来自服务器的每个响应
onreadystatechange
还有一点 var xhr = new XMLHttpRequest();
var prevResponse = '';
xhr.onreadystatechange = function() {
if (this.readyState == 4){
//stuff you want to do when ajax completes
alert('Done!')
}
else if (this.readyState > 2){
var newResponse = this.responseText.substring(prevResponse.length);
document.getElementById("status").innerText = newResponse;
prevResponse = this.responseText;
}
};
xhr.open("GET", "ajax.php", true);
xhr.send();
属性本质上是缓冲即。如果您从服务器发送'A'responseText
会给'A',但现在如果您发送'B'xhr.responseText
则不会是'B'而是'AB'就是我使用过的原因xhr.responseText
保留最后一个响应,以便我可以从当前prevResponse
中减去此次,以便只获得此次服务器发送给我的内容。您甚至可以进一步将其设置为进度条,只需让服务器发送即可JSON中的百分比,在客户端上解码,将responseText
应用于进度条,并使用一些很酷的CSS效果。
对于$ .ajax试试这个
value