2013-03-27 85 views
23

正如在这里建议的:https://gist.github.com/HenrikJoreteg/2502497,我正在尝试将onprogress功能添加到我的jQuery.ajax()文件上传中。上传工作正常,进行中的事件正在发射,但并非如我所料 - 而是在某个时间间隔内重复发射,而上传完成后它只发射一次。有没有办法指定进行中刷新的频率?或者,我是否想做一些无法完成的事情?这是我的代码:使用xhrFields可以将进度功能添加到jQuery.ajax()中吗?

$.ajax(
{ 
    async: true, 
    contentType: file.type, 
    data: file, 
    dataType: 'xml', 
    processData: false, 
    success: function(xml) 
    { 
     // Do stuff with the returned xml 
    }, 
    type: 'post', 
    url: '/fileuploader/' + file.name, 
    xhrFields: 
    { 
     onprogress: function(progress) 
     { 
      var percentage = Math.floor((progress.total/progress.totalSize) * 100); 
      console.log('progress', percentage); 
      if (percentage === 100) 
      { 
       console.log('DONE!'); 
      } 
     } 
    } 
}); 
+0

我正在尝试使用与您相同的JavaScript文件?在服务器端,我使用PHP。你可以给一些服务器端代码的例子,如何解决该文件?它会帮助我很多。 $ _POST ['文件']不适合我。 – Anam 2013-09-15 04:23:10

回答

3

在发送请求之前,您需要为请求本身添加一个事件处理程序。 jQuery.ajax允许这种通过“beforeSend”属性http://api.jquery.com/jQuery.ajax/

例如: http://www.dave-bond.com/blog/2010/01/JQuery-ajax-progress-HMTL5/

*编辑* 请务必看看这个例子链接的第二个代码示例。我相信第一个与现代版本的jQuery过时了。

$.ajax({ 
    xhr: function() 
    { 
    var xhr = new window.XMLHttpRequest(); 
    //Upload progress 
    xhr.upload.addEventListener("progress", function(evt){ 
     if (evt.lengthComputable) { 
     var percentComplete = evt.loaded/evt.total; 
     //Do something with upload progress 
     console.log(percentComplete); 
     } 
    }, false); 
    //Download progress 
    xhr.addEventListener("progress", function(evt){ 
     if (evt.lengthComputable) { 
     var percentComplete = evt.loaded/evt.total; 
     //Do something with download progress 
     console.log(percentComplete); 
     } 
    }, false); 
    return xhr; 
    }, 
    type: 'POST', 
    url: "/", 
    data: {}, 
    success: function(data){ 
    //Do something success-ish 
    } 
}); 
57

简短的回答:
不,你不能这样做,你想用什么xhrFields

龙答:

有一个XmlHttpRequest对象两份进度事件:

  • 响应研究的进展XmlHttpRequest.onprogress
    这是当浏览器下载从数据服务器。

  • 请求进度XmlHttpRequest.upload.onprogress
    这是当浏览器发送数据到服务器(包括POST参数,Cookie和文件)

在你的代码使用响应进度事件,但您需要的是请求进度事件。这是你如何做到这一点:

$.ajax({ 
    async: true, 
    contentType: file.type, 
    data: file, 
    dataType: 'xml', 
    processData: false, 
    success: function(xml){ 
     // Do stuff with the returned xml 
    }, 
    type: 'post', 
    url: '/fileuploader/' + file.name, 
    xhr: function(){ 
     // get the native XmlHttpRequest object 
     var xhr = $.ajaxSettings.xhr() ; 
     // set the onprogress event handler 
     xhr.upload.onprogress = function(evt){ console.log('progress', evt.loaded/evt.total*100) } ; 
     // set the onload event handler 
     xhr.upload.onload = function(){ console.log('DONE!') } ; 
     // return the customized object 
     return xhr ; 
    } 
}); 

xhr选项参数必须是返回jQuery来使用原生XMLHttpRequest对象的。

+0

如果使用'xhrFields'不可能,那么在Chrome(v34.0)中传递给'onprogress'的是什么[__this object__](http://pastebin.com/embed_iframe.php?i=qSq6KEtm)? – c24w 2014-05-21 09:10:20

+0

@ c24w,我不明白你的意思。这里的问题是使用'xhrFields'你*可以*配置响应进度而不是请求进度。对于后者,你必须以不同的方式做到这一点。 – GetFree 2014-05-22 20:29:31

+0

我想我已经误解了,所以谢谢澄清。所以'xhr.addEventListener('progress',cb)'(在xhr工厂函数中)相当于'xhr.xhrFields.onprogress(cb)'? – c24w 2014-05-23 09:08:15

相关问题