最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

jQuery+formdata實現(xiàn)上傳進度特效遇到的問題

 更新時間:2016年02月24日 10:10:40   投稿:hebedich  
這篇文章主要介紹了jQuery+formdata實現(xiàn)上傳進度特效遇到的問題的相關(guān)資料,需要的朋友可以參考下

總結(jié)我做HTML5文件上傳插件遇到的技術(shù)問題

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

問題列表

1. JQUERY.AJAX沒有監(jiān)聽上傳進度的ONPROGRESS事件。

2. XMLHTTPREQUEST(XHR)跨域

問題解答

1. JQUERY沒有給出ONPROGRESS事件的接口,必須從其他接口中找到原生XHR對象。

jQuery.ajax()返回的是jqXHR對象。jqXHR模仿XHR(原生),但沒有模仿實現(xiàn)XHR的所有方法和屬性(如:.upload),即使jqXHR增加了一個特有方法(如:.promise())。所以jqXHR并不是XHR的超集。

//下面是截取jQ內(nèi)部的源碼,$.ajax();返回的就是這個jqXHR(偽造XMLHttpRequest)
// Fake xhr
 jqXHR = {

  readyState: 0,


XHR的upload屬性指向XMLHttpRequestUpload(IE10是XMLHttpRequestEventTarget),該對象的onprogress事件可以監(jiān)聽上傳進度。既然jQ沒有給出這個功能的api,但jQ某些數(shù)據(jù)上傳方式是使用XHR的,所以我們可以從其它api中找到XHR。在XHR發(fā)送數(shù)據(jù)之前綁定onprogress事件可以實現(xiàn)上傳進度功能。

我從OPTIONS參數(shù)配置中找到兩個與XHR有關(guān)的屬性:

- XHR:回調(diào)創(chuàng)建XMLHTTPREQUEST對象。

xhr()返回值是XHR,提供給jQ使用,即發(fā)送數(shù)據(jù)就是用這個XHR。我們可以通過xhr創(chuàng)建一個回調(diào)函數(shù)覆蓋它,同樣返回XHR,但在此綁定onprogress事件。

//jQ源碼
// Get a new xhr
var handle, i,
 xhr = s.xhr();//[回調(diào)]在這里,下面是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 );
}

所以我們應(yīng)該這樣做:

$.ajax({
 //.....
 xhr: function() {
  var xhr = $.ajaxSettings.xhr();
  //綁定上傳進度的回調(diào)函數(shù)
  xhr.upload.addEventListener('progress', progress, false);
  return xhr;//一定要返回,不然jQ沒有XHR對象用了
 }
});

- XHRFIELDS:一對“文件名-文件值”組成的映射,用于設(shè)定原生的 XHR對象。

xhrFields屬性指向jQ內(nèi)部創(chuàng)建的XHR,我們可以根據(jù)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)支持跨域,但需要后臺允許。

//后臺需發(fā)送頭部驗證
if($_REQUEST['cros']) {
 header("Access-Control-Allow-Origin:請求的域名");
}

根據(jù)后臺給的接口,我需要增加一個參數(shù)cros。但我將這個參數(shù)與文件同事提交,卻提示跨域限制。最后將這個參數(shù)放在url才行。

原來XHR跨域是有兩次請求的,第一次是驗證請求,瀏覽器根據(jù)請求目的地址自動發(fā)出options請求。若通過,才能發(fā)出自定義的post請求。所以將參數(shù)放在post請求里,第一次請求沒有cros參數(shù),即不能通過。

相關(guān)文章

最新評論

吴川市| 中西区| 化隆| 宜黄县| 肇州县| 察隅县| 禄丰县| 兴海县| 福鼎市| 大竹县| 咸阳市| 五常市| 仙居县| 安达市| 长垣县| 湄潭县| 四会市| 威远县| 宣威市| 呼图壁县| 尤溪县| 邻水| 固始县| 渑池县| 吴江市| 和静县| 湘西| 夏河县| 奇台县| 阿克苏市| 霍州市| 华容县| 乌海市| 庆云县| 绥中县| 长寿区| 祥云县| 枣庄市| 隆尧县| 长顺县| 敖汉旗|