Jquery中文網 mm6666com单双中特 www.wvbtf.icu
Jquery中文網 >  jQuery  >  jquery 教程  >  正文 jQuery+FormData+文件上傳+上傳進度

长期单双中特:jQuery+FormData+文件上傳+上傳進度

發布時間:2016-09-18   編輯:mm6666com单双中特 www.wvbtf.icu
jquery中文網為您提供jQuery+FormData+文件上傳+上傳進度等資源,歡迎您收藏本站,我們將為您提供最新的jQuery+FormData+文件上傳+上傳進度資源

mm6666com单双中特 www.wvbtf.icu 總結我做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,

XHRupload屬性指向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() {
            //語法錯誤
        }
    }
});

我們可以借助XHRonsendstart事件,如下:

$.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參數,即不能通過。

您可能感興趣的文章:
文件上傳插件 jQuery File Upload
Web文件上傳???Plupload
Web文件上傳???Plupload
jQuery File Upload
jQuery File Upload
jQuery文件上傳插件 jcUpload
jQuery異步上傳插件
Jquery上傳插件 uploadify v3.1使用說明
jQuery異步上傳插件
jquery ajax提交整個表單元素的快捷辦法

[關閉]
pk10在线精准计划包赢 nba常规赛外围在哪投注 来几局百人牛牛有规律不 pk10免费手机版苹果 扑克赌博三公技巧大全 澳洲pk10官网 彩神软件 北京pk10稳赚技巧玩法 欧冠赛程 今晚七乐彩开奖号码 押庄龙虎包赢技巧 扎金花看牌器怎么下载 重庆欢乐生肖五星走势图 二四六天天彩资枓免费 福建时时论坛 pk10模拟投注手机版