2011-03-31 58 views
34

我正在使用XmlHttpRequests将图像上传到服务器,我想向用户显示这些上传的进度。XmlHttpRequest onprogress间隔

不幸的是,调用我的onprogress-event处理程序之间的间隔太大。对于500k图像,通常只对一次或两次调用进行中。

这里是我的代码:

/* This function is not called often enough */ 
function progress(e){ 
    console.log('Uploading: ' + Math.round((e.loaded/e.total) * 100) + ' %'); 
} 

var xhr = new XMLHttpRequest(); 
xhr.upload.addEventListener('progress', progress, false); 
xhr.send(data); 

可这种行为被改变或在某个地方硬编码在浏览器中实现?

+0

这个怎么样? [如何从XMLHttpRequest取得进展](http://stackoverflow.com/questions/76976/how-to-get-progress-from-xmlhttprequest) – mplungjan 2011-03-31 06:07:20

+0

@mplungjan我的问题是没有取得进展。我的问题是我的事件处理程序被调用的频率。我已更新我的问题以澄清。 – Oscar 2011-03-31 07:50:12

+0

@Oscar - 我意识到,但是我发布的线程有很多各种方式的示例 – mplungjan 2011-03-31 08:17:42

回答

30

W3在其XMLHttpRequest Level 2文件中列出了以下指导原则。显然,不同浏览器之间的一致性水平是可以预料的。

上传:

虽然请求实体正文被上传并上传完成标志是假的,队列的任务在XMLHttpRequestUpload对象火进度事件命名的进度约每50ms或每字节传送,以最不频繁的为准。。 - W3 XMLHttpRequest的2级(粗体表示强调)

下载:

当说取得进展的通知,而下载的进展,队列中的任务火有关进度事件命名的进步每50ms或每接收一个字节,以最不频繁的为准。 - W3 XMLHttpRequest Level 2(强调加粗)

我不知道用于定制此功能的api。

+3

谢谢,由于某种原因,我从来没有发现过检查规格 – Oscar 2011-04-05 04:04:18

+0

在3种不同的浏览器中尝试过,看起来进度事件看起来像是进度条的百分比宽度。没有触发,直到从服务器接收到至少69个字节的数据为止,然后可以每增加一个字节触发一次,看起来浏览器按照这个标准行事,但是只有在收到前69个字节后才会触发 – 2017-01-18 17:55:36

+0

@SamBull很高兴知道!我一直在试图弄清楚为什么我的10,9,8,...倒计时测试在完成之前不会触发任何进度指示器! – Michael 2017-05-25 22:23:33

3

另外,请注意,本地调试HTTP代理(例如Charles)往往会影响进度事件触发间隔。