jQuery+formdata实现上传进度特效遇到的问题


Posted in Javascript onFebruary 24, 2016

总结我做HTML5文件上传插件遇到的技术问题

先贴上源码:fileupload-html5.js(PS:公司使用seajs框架)

问题列表

1. JQUERY.AJAX没有监听上传进度的ONPROGRESS事件。

2. XMLHTTPREQUEST(XHR)跨域

问题解答

1. JQUERY没有给出ONPROGRESS事件的接口,必须从其他接口中找到原生XHR对象。

jQuery.ajax()返回的是jqXHR对象。jqXHR模仿XHR(原生),但没有模仿实现XHR的所有方法和属性(如:.upload),即使jqXHR增加了一个特有方法(如:.promise())。所以jqXHR并不是XHR的超集。

//下面是截取jQ内部的源码,$.ajax();返回的就是这个jqXHR(伪造XMLHttpRequest)
// Fake xhr
 jqXHR = {

  readyState: 0,

XHR的upload属性指向XMLHttpRequestUpload(IE10是XMLHttpRequestEventTarget),该对象的onprogress事件可以监听上传进度。既然jQ没有给出这个功能的api,但jQ某些数据上传方式是使用XHR的,所以我们可以从其它api中找到XHR。在XHR发送数据之前绑定onprogress事件可以实现上传进度功能。

我从OPTIONS参数配置中找到两个与XHR有关的属性:

- XHR:回调创建XMLHTTPREQUEST对象。

xhr()返回值是XHR,提供给jQ使用,即发送数据就是用这个XHR。我们可以通过xhr创建一个回调函数覆盖它,同样返回XHR,但在此绑定onprogress事件。

//jQ源码
// Get a new xhr
var handle, i,
 xhr = s.xhr();//[回调]在这里,下面是open方法

// Open the socket
// Passing null username, generates a login popup on Opera (#2865)
if ( s.username ) {
 xhr.open( s.type, s.url, s.async, s.username, s.password );
} else {
 xhr.open( s.type, s.url, s.async );
}

所以我们应该这样做:

$.ajax({
 //.....
 xhr: function() {
  var xhr = $.ajaxSettings.xhr();
  //绑定上传进度的回调函数
  xhr.upload.addEventListener('progress', progress, false);
  return xhr;//一定要返回,不然jQ没有XHR对象用了
 }
});

- XHRFIELDS:一对“文件名-文件值”组成的映射,用于设定原生的 XHR对象。

xhrFields属性指向jQ内部创建的XHR,我们可以根据xhrFields获得XMLHttpRequest。由于xhrFields的值只能是json对象,所以不能以下面方式获取。

//错误例子
$.ajax({
 //......
 xhrFields: {
  upload.onprogress: function() {
   //语法错误
  }
 }
});

我们可以借助XHR的onsendstart事件,如下:

$.ajax({
 //......
 xhrFields: {
  onsendstart: function() {
   //this是指向XHR
   this.upload.addEventListener('progress', progress, false);
  }
 }
});

2. XMLHTTPREQUESTⅡ(XHR)支持跨域,但需要后台允许。

//后台需发送头部验证
if($_REQUEST['cros']) {
 header("Access-Control-Allow-Origin:请求的域名");
}

根据后台给的接口,我需要增加一个参数cros。但我将这个参数与文件同事提交,却提示跨域限制。最后将这个参数放在url才行。

原来XHR跨域是有两次请求的,第一次是验证请求,浏览器根据请求目的地址自动发出options请求。若通过,才能发出自定义的post请求。所以将参数放在post请求里,第一次请求没有cros参数,即不能通过。

Javascript 相关文章推荐
javascript实现的网页局布刷新效果
Dec 01 Javascript
zeroclipboard复制到剪切板的flash
Aug 04 Javascript
JavaScript中的null和undefined解析
Apr 14 Javascript
js动态生成指定行数的表格
Jul 11 Javascript
用jQuery获取IE9下拉框默认值问题探讨
Jul 22 Javascript
js之onload事件的一点使用心得
Aug 14 Javascript
js和jquery如何获取图片真实的宽度和高度
Sep 28 Javascript
javascript面向对象之共享成员属性与方法及prototype关键字用法
Jan 13 Javascript
JQuery和html+css实现带小圆点和左右按钮的轮播图实例
Jul 22 jQuery
Vue路由history模式解决404问题的几种方法
Sep 29 Javascript
详解关于Angular4 ng-zorro使用过程中遇到的问题
Dec 05 Javascript
Vue.directive 实现元素scroll逻辑复用
Nov 29 Javascript
JQuery EasyUI的使用
Feb 24 #Javascript
使用jQuery监听DOM元素大小变化
Feb 24 #Javascript
JavaScript中的闭包
Feb 24 #Javascript
jQuery中判断对象是否存在的方法汇总
Feb 24 #Javascript
jquery中键盘事件小结
Feb 24 #Javascript
javascript实现九宫格相加数值相等
May 28 #Javascript
Javascript类型转换的规则实例解析
Feb 23 #Javascript
You might like
用PHP与XML联手进行网站编程代码实例
2008/07/10 PHP
利用php获取服务器时间的实现代码
2013/06/07 PHP
使用php方法curl抓取AJAX异步内容思路分析及代码分享
2014/08/25 PHP
Ecshop 后台添加新功能栏目及管理权限设置教程
2017/11/21 PHP
jquery下操作HTML控件的实现代码
2010/01/12 Javascript
javascript在事件监听方面的兼容性小结
2010/04/07 Javascript
jquery在Chrome下获取图片的长宽问题解决
2013/03/20 Javascript
jquery点击页面任何区域实现鼠标焦点十字效果
2013/06/21 Javascript
js实现的常用的左侧导航效果
2013/10/17 Javascript
浅析offsetLeft,Left,clientLeft之间的区别
2013/11/30 Javascript
jQuery中:hidden选择器用法实例
2014/12/30 Javascript
JS实现仿微博可关闭弹出层效果
2015/09/21 Javascript
JS for...in 遍历语句用法实例分析
2016/08/24 Javascript
AngularJs Injecting Services Into Controllers详解
2016/09/02 Javascript
解决webpack dev-server不能匹配post请求的问题
2018/08/24 Javascript
浅谈vue中get请求解决传输数据是数组格式的问题
2020/08/03 Javascript
js实现鼠标滑动到某个div禁止滚动
2020/09/17 Javascript
[54:10]完美世界DOTA2联赛PWL S2 Magma vs FTD 第二场 11.29
2020/12/03 DOTA
Python的Bottle框架中获取制定cookie的教程
2015/04/24 Python
Python中使用装饰器时需要注意的一些问题
2015/05/11 Python
基于Python如何使用AIML搭建聊天机器人
2016/01/27 Python
Python实现的多项式拟合功能示例【基于matplotlib】
2018/05/15 Python
python爬取内容存入Excel实例
2019/02/20 Python
详解Python 函数如何重载?
2019/04/23 Python
使用python和pygame制作挡板弹球游戏
2019/12/03 Python
opencv设置采集视频分辨率方式
2019/12/10 Python
Python+Selenium随机生成手机验证码并检查页面上是否弹出重复手机号码提示框
2020/09/21 Python
python实现计算器简易版
2020/12/17 Python
你不知道的葡萄干处理法、橙蜜处理法、二氧化碳酵母法
2021/03/17 冲泡冲煮
澳大利亚优质的家居用品和生活方式公司:Bed Bath N’ Table
2019/04/16 全球购物
毕业证丢失证明
2014/01/15 职场文书
体育课外活动总结
2014/07/08 职场文书
党员民主评议个人总结
2014/10/20 职场文书
升学宴答谢词
2015/01/05 职场文书
风雨哈佛路观后感
2015/06/03 职场文书
严以用权学习心得体会
2016/01/12 职场文书