站長資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        HTML5文件上傳插件遇到的技術(shù)問題

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

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

        問題列表

        1. jquery.ajax沒有監(jiān)聽上傳進(jìn)度的onprogress事件。

        2. XMLHttpRequest(XHR)跨域

        問題解答

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

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

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

        // Fake xhr      jqXHR = {          readyState: 0,

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

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

        – xhr:回調(diào)創(chuàng)建XMLHttpRequest對象。

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

        //jQ源碼

        // Get a new xhrvar 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();        //綁定上傳進(jìn)度的回調(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對象,所以不能以下面方式獲取。

        //錯(cuò)誤例子

        $.ajax({      //......      xhrFields: {          upload.onprogress: function() {              //語法錯(cuò)誤          }      }  });

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

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

        2. XMLHttpRequestⅡ(XHR)支持跨域,但需要后臺允許。

        //后臺需發(fā)送頭部驗(yàn)證

        if($_REQUEST['cros']) {      header("Access-Control-Allow-Origin:請求的域名");  }

        根據(jù)后臺給的接口,我需要增加一個(gè)參數(shù)cros。但我將這個(gè)參數(shù)與文件同事提交,卻提示跨域限制。最后將這個(gè)參數(shù)放在url才行。
        原來XHR跨域是有兩次請求的,第一次是驗(yàn)證請求,瀏覽器根據(jù)請求目的地址自動(dòng)發(fā)出options請求。若通過,才能發(fā)出自定義的post請求。所以將參數(shù)放在post請求里,第一次請求沒有cros參數(shù),即不能通過。

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
        主站蜘蛛池模板: 亚洲精品456播放| 91精品久久久久久无码| 日韩精品无码永久免费网站 | 久久精品毛片免费观看| 国产cosplay精品视频| 青青草国产精品久久久久| 国产精品无码一区二区在线观一 | 999精品视频这里只有精品| 欧美日韩精品在线| 久久精品国产精品亚洲人人| 亚洲码国产精品高潮在线| 国99精品无码一区二区三区| 亚洲欧美日韩精品永久在线| 国内精品久久久久久久久电影网| 亚洲国产精品尤物yw在线| 99久久精品日本一区二区免费| 99爱在线视频这里只有精品| 亚洲精品第一国产综合境外资源| 国99精品无码一区二区三区| 国产欧美精品区一区二区三区| 亚洲精品自在在线观看| 国内精品51视频在线观看 | 亚洲一区爱区精品无码 | 99久久精品午夜一区二区 | 国产啪亚洲国产精品无码| 欧美精品中文字幕亚洲专区| 999久久久免费国产精品播放| 亚洲福利精品一区二区三区| 国产精品久久国产精品99盘| 精品国精品国产自在久国产应用男 | 国产精品毛片一区二区三区| 国产精品自在欧美一区| 精品国产一区二区三区不卡| 精品多毛少妇人妻AV免费久久| 国99精品无码一区二区三区| 免费人妻精品一区二区三区| 国产一成人精品福利网站| 亚洲精品国产高清嫩草影院| 久久久精品午夜免费不卡| 亚洲精品一品区二品区三品区| 91精品国产高清久久久久久国产嫩草|