3

简短而甜蜜: 寻找一种调用 PHP 文件并使用 jQuery 和/或 Ajax 显示进度的方法。调用 PHP 文件 upgrade.php?step=1,然后将返回的输出附加到 #upgradestatus。完成后,将调用 upgrade.php?step=2 并附加该输出,直到完成指定数量的步骤。

说明: 我正在尝试为在 PHP 中运行的软件创建一个插件。这个插件将通过 PHP 文件调用每个步骤来升级每个文件等。我希望能够在页面上显示进度而无需重新加载它以向用户显示已完成的操作以及进程所在的位置。

使用我的 PHP 思维过程,我想创建类似的东西:

for (var s=0; s<2; s++){
    $('#upgraderesult').load('upgrade.php', 'step=' + s, function() {
        $('#upgradestatus').append('Upgrade Step ' + s + ' Completed');
    });
}

我也尝试使用 .ajax() ,并且通过这两种方法,我很快就了解到,作为异步,这将变得更加棘手。

我背后的想法是创建一个 FOR 循环,该循环将循环存在的步骤数量。然后,for 循环将生成必要的 jQuery/Ajax 代码,这些代码将使用状态消息附加到现有的 div #upgradestatus。我希望它附加在#upgraderesult 中加载的结果,但为了简单起见,我只是添加了“升级步骤 X 完成”。

所以现在我被卡住了,我想我可能只需要使用 PHP 来生成正确的 jQuery/Ajax 代码,但我想检查一下是否有其他人对如何以不同的方式完成此操作有任何意见或建议,或者即使我在想这完全错了。

我想要的只是能够根据流程中的步骤调用 PHP 文件,然后在浏览器中向用户显示进度……这比我想象的要困难得多。

感谢您的任何意见或建议/建议,我非常感谢!

4

3 回答 3

4

每个人都感谢您的意见,在 Freenode #jQuery 中的一些人的帮助下,我们能够想出这个完美的方法:

var numSteps = 2;
function loadStepAjax(s) {
    $.ajax('upgrade.php', {
        type: 'GET',
        dataType: 'html',
        data: {
           step: s
        },
        success: function(data) {
            $('#upgradestatus').append(data);
            if (s < numSteps)
                loadStepAjax(s+1);
            }
     });
}

然后调用该函数:

loadStepAjax(1);

我们没有使用 FOR 循环,而是创建了一个函数 loadStepAjax,然后在回调中使用 IF 语句来确定是否再次调用该函数。

总是很简单不是吗!不过还是感谢大家的意见,不胜感激。

于 2012-12-30T00:07:02.807 回答
0

您可以设置回调以在使用 ajax() 时运行,(post() 会是更好的选择)。你试过吗?当你尝试 ajax() 时,你还有代码吗?

它应该是这样的。

$.post('upgrade.php?step=1', function() {
    $('#upgradestatus').append('Upgrade Step 1 Completed');
    $.post('upgrade.php?step=2', function() {
        $('#upgradestatus').append('Upgrade Step 2 Completed');
        $.post('upgrade.php?step=2', function() {
                $('#upgradestatus').append('All done!'); }
    }
});

当然,您也可以返回 JSON 并说是的,一切正常或其他,但关键是您正在使用回调等待它完成调用下一步。

于 2012-12-29T23:31:00.577 回答
0

这个问题还有另一种方法。

我写了一个全面的例子来回答这个问题:

在没有浏览器超时的情况下在 PHP 中处理大量数据

PS:我的示例可以扩展为也可以在每个进度上传递消息 - 事实上,它非常灵活;您可以根据服务器上发生的任何情况仅更新您想要的 UI 的一部分,从而使客户端免于不必要的处理。

于 2012-12-29T23:38:57.773 回答