使用AJAX的Firefox中的进度事件未达到100%

时间:2013-07-29 18:58:49

标签: ajax firefox upload progress

我正在编写一个上传脚本,它将获取文件,处理它,并将其返回给用户。处理可能需要几分钟。我目前正在做的是向用户提供反馈,在实际上传过程中显示上传栏,上传完成后用“处理”消息替换它。文件处理完毕后,将使用指向新文件的链接替换该消息。这在chrome中运行良好,但在Firefox中,我只能将进度条提高到99.9%。在关闭连接之前,有没有办法检查上传是否完成?

这是我目前拥有的

    outter = $(".item_box")[0];//content wrapper
    inner = outter.children[0];//content viewer, will be replaced with messages and content

    var p = document.createElement("progress");
    p.className = "uploadprogress";
    p.value = "0";
    p.max = "100";
    inner.textContent = "";
    inner.appendChild(p);//replace initial "click here" message with progress bar

    var formData new FormData();
    for (var i = 0; i < files.length; i++)//files is defined elsewhere and contains form data
    {
        formData.append('userfile', files[i]);
    }

    // now post a new XHR request
    var xhr = new XMLHttpRequest();
    xhr.open('POST', base_url+'upload/upload_media');//url of php script
    xhr.responseType = "json";
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4)//ajax request complete
        {
            p.value = p.innerHTML = 100;//set progress bar to 100%
            var data = JSON.parse(xhr.responseText);//my returned json object
            outter.removeChild(inner);
            var v = document.createElement("video");
            v.controls = "controls";
            v.innerHtml = data.msg;
            outter.appendChild(v);
        }
    }
    xhr.upload.onprogress = function (e)//handles progress bar value
    {
        if (e.lengthComputable)
        {
            var done = e.position || e.loaded, total = e.totalSize || e.total;
            p.value = p.innerHTML = (Math.floor(done/total*1000)/10);
            if (done == 100)//this never happens in firefox
            {
                inner.removeChild(p);
                inner.textContent = "processing... please wait";
            }
        }
    }
    xhr.send(formData);

2 个答案:

答案 0 :(得分:0)

这也是Firefox中我遇到的奇怪问题。我通过将要执行的代码从onprogress事件移动到xhr.readyState 100%,解决了这个问题。我将其从onprogress事件中删除了,因为如果我将代码放在两个位置,我的代码会产生问题。

答案 1 :(得分:0)

呃...... Firefox还没有解决这个问题。我在FF版本28中遇到同样的问题。就像OP一样,我不能< / strong>从&#34; onprogress&#34;移动代码&#34; onload&#34;的处理程序处理程序,因为&#34; onload&#34;在脚本处理完上传文件之前不会触发 - 这可能比文件上传完成时要晚得多。上传的文件越小,FF就越早停止报告进度(例如:280K文件可能会停止报告84%,而5 MB文件可能会一直达到99% - 但绝不会100%)。由于OP处理的是一致的大文件,他可以将条件设​​置为&#34;(done == 99)&#34;或者一些类似的门槛。不幸的是,这对我或其他处理各种文件的人来说都不起作用。来吧,Firefox!