jquery ajax 自定义计算的进展

jquery ajax progress with custom calculation

我在执行处理图片的长 PHP 脚本时需要有关 ajax 进度条的建议。 我知道已经有很多关于 Whosebug 的问题

我看到的大部分例子都是用文件大小来计算进度的。 但就我而言,我想根据 images_treated / total_images 计算百分比。

所以我还是没能如愿以偿。

在 JS 波纹管中,我评论了我从另一个问题和 dataType: 'json' 中获取的无效进度函数用于测试,但我更希望我仍然可以使用 JSON return。

问题

  1. console.log() 只会记录一次 - 当完整的脚本完成时。我做错了吗?
  2. 我应该写什么来代替评论?
  3. 在某些答案中,PHP header 设置为 header('Content-Type: application/octet-stream');它是强制性的还是更好?

Javascript:

        $.ajax(
        {
            type: 'GET',
            // dataType: 'json',
            url: formAction,
            data: 'addImagesToArticle',
            cache: false,
            xhr: function()
            {
                var xhr = new window.XMLHttpRequest();

                // Download progress.
                xhr.addEventListener("progress", function(e)
                {
                    console.log(e);
                    // I saw this piece of code from another question it is supposed to work... Maybe my PHP?
                    /*var lines = e.currentTarget.response.split("\n");
                    var progress = lines.length ? lines[lines.length-1] : 0;

                    $('#progress').text(progress);*/
                }, false);
               return xhr;
            }
        });

我的 PHP 很大,所以我快速解释一下:在图片循环中我有变量 $images_treated$total_images。在循环之后,摘要通过 JSON 以 object 形式 return 编辑到 JS,例如 {error: bool, message: string, ...} 所以如果有一种方法可以在不回显但设置 a 的情况下使进度工作JSON 完美的变量!

感谢您的帮助!

[编辑] 添加上下文详细信息。

我想在管理方面使用它,在具有所见即所得的文章版本中,我有 dropzone 来处理我的多张图片上传。

然后我看到图像的预览,同时每张图像都放在服务器上的临时文件夹中。然后我可以根据需要删除一些图像,一旦所有图像都是确定的,我单击一个按钮来处理它们以调整 2 种尺寸,并在文章所见即所得编辑器中注入带有 img 的图形标签。

哇,我找到了解决办法!

我很高兴发现我不知道的新事物 PHP 并与同样不知道的人分享(在下面的第 3 步中)!

@riccardo 谈论套接字是正确的——我不太了解——但我不需要走那么远。

因此,在接近我的目标之前,我有很多事情需要解决。

  1. 不使用 xhr.addEventListener("progress"...,而是在计时器中调用第二个 ajax:它在资源消耗方面也会更轻。

  2. 而不是使用像 setIntervalsetTimeout 这样的计时器——因为请求是异步的,它可能以不需要的顺序出现——在第一次调用的回调中使用递归调用,例如:

    function trackProgress()
    {
        $.getJSON('create-a-new-page.html', 'ajaxTrackProgress=1', function(response)
        {
            var progress = response.progress;
            $('#progress').text(progress);
    
            if (progress < 100) trackProgress();
        });
    }
    
  3. 然后意识到我的第二个脚本调用仍然被第一个脚本延迟 运行?是的。所以这里的关键是session_write_close()! 由于这个好 post,我可以用这种方式挖掘:

我post在这里举了一个非常简单的例子来回答另一个问题:

感谢你们在评论中提供的所有帮助,这让我找到了这个解决方案。 ;)