使用jQuery progressbar显示长时间运行的PHP脚本的进度

时间:2017-03-19 15:41:26

标签: php jquery ajax progress-bar

有时jQuery的文档会让我感到愚蠢。

我有一个应用程序在服务器上使用PHP来处理多个订单的创建(有时超过一千个)。我试图找出如何使用该脚本(通过$ .ajax调用)通知UI其状态。

我理解$ .ajax中的.onprogress,.success和.complete元素,但是我找不到PHP脚本应该为每个事件类型提供数据的示例。

在老式的javascript中,使用ajax.readyState,您可以从脚本中获取PHP.echo()事件以进行进度,然后使用PHP.exit()事件来完成请求。

如何在$ .ajax世界中做到这一点?

非常感谢一只试图学习新技巧的老狗。

1 个答案:

答案 0 :(得分:0)

想出蛮力的方式。

每次从服务器端回显()时,bundle都会以e.target.responseText的形式传递给onprogress处理程序。请注意,responseText会随着每个响应而持续增长,因此您需要一个客户端变量来跟踪其先前的长度:

var this_str, last_len = 0;
...
onprogress: function (e) {
    this_str = e.target.responseText.substr(last_len);
    ...do something with this_str...
    last_len = e.target.responseText.length;
}
...

如果结果是json,则需要解码this_str(而不是responseText)。这最适合使用不同的技术,因为根据服务器更新的频率,您的解析可能会过载。由于您正在发送json对象,因此整个responseText字符串是一系列json对象,由闭合和开放花括号"} {"分隔。所以把它分成几部分,并使用最新的:

var subtext, parts, json;
...
onprogress: function (e) {
    parts = e.target.responseText.split('}{');
    if (parts.length > 1) {
        subtext = '{' + parts[parts.length - 1];
    } else {
        subtext = parts[0];
    }
    json = JSON.parse(subtext);
    ...

成功函数对json采用了类似的方法:

success: function (text) {
    parts = text.split('}{');
    if (parts.length > 1) {
        subtext = '{' + parts[parts.length - 1];
    } else {
        subtext = parts[0];
    }
    json = JSON.parse(subtext);
    ...

请注意,随着事情的开始,会有一些无用的onprogress事件;一定要测试那些并忽略它们。

当您的服务器端函数终止或退出()时,您的success函数和onprogress函数都将收到完整的responseText字符串。如果你想要做一些不同的事情,记得要跟踪responseText中的最后一个字符串。