【问题标题】:Multiple XMLHttpRequests At Once一次多个 XMLHttpRequest
【发布时间】:2015-03-11 23:03:20
【问题描述】:

我正在构建一个 php 上传器,并且我为每个选择上传的文件呈现了这个 javascript。

        var formdata = new FormData();
        formdata.append("file1", file);

        var ajax = new XMLHttpRequest();
        ajax.upload.addEventListener("progress", progressHandler, false);
        ajax.open("POST", "fileUploader.php");

        startTime = (new Date()).getTime();
        ajax.send(formdata);

我希望能够为每个请求更新不同的进度条;但是,但我无法弄清楚如何做到这一点。

这是我的进度处理函数

function progressHandler(event) {
document.getElementById("upProgress").value = event.loaded/event.total * 100;
}

如何动态选择进度条而不是总是选择“upProgress”条?

新代码:

var pgb = function(div, progBar) {
            this.div = div;
            this.progBar = progBar;

            var _this = this;

            this.progressHandler = function(event) {
                _this.progBar.value = event.loaded/event.total * 100;
            }
            this.completeHandler = function(event) {
                _this.div.innerHTML += "...done";

                console.log(_this.progBar);
            }
        }

然后对每个文件执行以下操作。

var l_pbg = new pgb(document.getElementById('div_'+index), document.getElementById('up_'+index));

            var ajax = new XMLHttpRequest();
            ajax.upload.addEventListener("progress", l_pbg.progressHandler, false);
            ajax.addEventListener("load", l_pbg.completeHandler, false);
            ajax.addEventListener("error", errorHandler, false);
            ajax.addEventListener("abort", abortHandler, false);
            ajax.open("POST", "fileUploader.php");

            startTime = (new Date()).getTime();
            ajax.send(formdata);

现在的问题是只有最后一个要上传的文件的进度条才会更新;但是这两个文件都被上传了。我可以看到 progressHandler 被称为 all 但是因为我在控制台中打印它,所以只有第一次视觉更新吗?:

【问题讨论】:

    标签: javascript php xmlhttprequest


    【解决方案1】:

    你可以创建一个引用 DOM 元素的类,并有一个 progressHandler 方法:

    var Pgb =  function(elem) {
        this.elem = elem;
    
        var _this = this;
        this.progressHandler = function(event) {
            _this.elem.value = event.loaded/event.total * 100;
        }
    }
    

    然后为每个进度条创建这个类的实例:

    var pgb1 = new Pgb(document.getElementById("upProgress1"));
    var pgb2 = new Pgb(document.getElementById("upProgress2"));
    

    然后将方法作为处理程序传递给每个作为 ajax 事件侦听器:

    ajax.upload.addEventListener("progress", pgb1.progressHandler, false);
    ajax.upload.addEventListener("progress", pgb2.progressHandler, false);
    

    这里的工作示例:https://jsfiddle.net/rrun9ftz/

    【讨论】:

    • 我厌倦了你所说的,但我遇到了另一个问题,即它们都没有在视觉上更新?为什么是这样?您可以看到与第一篇文章相关的任何视觉变化都被忽略了,因为甚至没有显示“...完成”。
    • 我看不出您的代码有问题。但也许这会有所帮助:jsfiddle.net/rrun9ftz 我创建了一个示例。当您单击“上传”时,它会在页面上添加一个进度条,然后启动一个模拟上传过程,该过程使用进度处理程序更新进度条。您可以多次单击并观看多个条独立更新。
    • 可能和XMLHttpRequest有关?
    • 我不会这么认为。当您将console.log(_this.progBar); 添加到progressHandler 时,您会看到每个进度条都调用了它吗?您可以看到正在更新的值吗?但在视觉上,什么都没有改变?
    • 这是对的,看我的帖子。您可以在控制台中看到 up_0 和 up_1 正在更新,而不是进度条
    猜你喜欢
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    相关资源
    最近更新 更多