日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

本篇文章給大家了解ajax實現無刷新上傳和下載,有需要的朋友可以參考一下,希望對你們有所助。


一文講解ajax實現無刷新上傳和下載(代碼詳解)


關于ajax無刷新上傳和下載

這是一個沒什么含量但是又用的比較多又不得不說的問題,其實真的不想說,因為沒什么好說的。

關于上傳

使用Flash, ActiveX上傳 ,略...

自己寫XMLHttpRequest

// 準備FormData
var formData = new FormData();
formData.append("key", value);
 
// 創建xhr對象
var xhr = new XMLHttpRequest();
// 監聽狀態,實時響應
// xhr 和 xhr.upload 都有progress事件,xhr.progress是下載進度,xhr.upload.progress是上傳進度
xhr.upload.onprogress = function (event) {
  if (event.lengthComputable) {
    var percent = Math.round(event.loaded / event.total);
    console.log("%d%", percent);
  }
};
// 傳輸開始事件
xhr.onloadstart = function (event) {
  console.log("load start");
};
// ajax過程成功完成事件
xhr.onload = function (event) {
  console.log("load success");
  console.log(xhr.responseText);
  var ret = JSON.parse(xhr.responseText);
  console.log(ret);
};
// ajax過程發生錯誤事件
xhr.onerror = function (event) {
  console.log("error");
};
// ajax被取消
xhr.onabort = function (event) {
  console.log("abort");
};
// loadend傳輸結束,不管成功失敗都會被觸發
xhr.onloadend = function (event) {
  console.log("load end");
};
// 發起ajax請求傳送數據
xhr.open("POST", "/upload", true);
xhr.send(formData);


使用Jquery

var formData = new FormData();
 
formData.append("key", value); //傳的參和值
$.ajax({
  url: "XXX",
  type: "POST",
  data: formData,
  contentType: false,
  processData: false,
  success: function (res) {},
  error: function () {},
});

這里要說的就是formData,這個狗屎在IE10之后才開始完整的支持,IE9吖的是個半殘品。所以這要說的是第三種結合form和iframe來實現,原理:

隱藏的form和iframe,form的target指向iframe,監聽iframe load,來獲取上傳結果。

優點:兼容該死的ie低版本瀏覽器

缺點:跨域上傳不支持,還需自定義反向代理,因為iframe onload不支持跨域

上傳接口API: 成功返回:

{
  code: 1,
  msg: '上傳成功'
}

失敗返回:

{
  code: 0,
  msg: '上傳失敗'
}

HTML:

<form
  action="xxxx"
  target="upload"
  enctype="multipart/form-data"
  method="post"
  style="display:none; "
>
  ... ..
</form>
<iframe name="upload" id="upload"></iframe>
 
<!-- JS: -->
<script>
  var fm = document.getElementById("upload");
  var load = function () {
    var doc = fm.contentWindow || fm.contentDocument;
    if (doc.document) doc = doc.document;
    var content = doc.body.textContent; //此處的值取決與API 接口返回的值
    var data = JSON.parse(content);
    console.log(content);
  };
  // 兼容低版本瀏覽器監聽判斷
  fm.attachEvent ? fm.attachEvent("onload", load) : (fm.onload = load);
</script>

關于下載:

暴力一點的下載直接

window.open("/rest/donwload/abcd.do");

優點:代碼量少。

缺點:現代瀏覽器會自動識別文件類型,如pdf,會自動在瀏覽器打開

優雅一點的下載:

function download() {
  var a = document.createElement("a");
  var url = "download/?filename=aaa.txt";
  var filename = "data.xlsx";
  a.href = url;
  a.download = filename;
  a.click();
}

優點:解決了暴力下載自動打開文件的缺陷

缺點:不支持post方式下載


使用XMLHttpRequest,BLOB方式

function download() {
  var url = "download/?filename=aaa.txt";
  var xhr = new XMLHttpRequest();
  xhr.open("GET", url, true); // 也可以使用POST方式,根據接口
  xhr.responseType = "blob"; // 返回類型blob
  // 定義請求完成的處理函數,請求前也可以增加加載框/禁用下載按鈕邏輯
  xhr.onload = function () {
    // 請求完成
    if (this.status === 200) {
      // 返回200
      var blob = this.response;
      var reader = new FileReader();
      reader.readAsDataURL(blob); // 轉換為base64,可以直接放入a表情href
      reader.onload = function (e) {
        // 轉換完成,創建一個a標簽用于下載
        var a = document.createElement("a");
        a.download = "data.xlsx";
        a.href = e.target.result;
        $("body").append(a); // 修復firefox中無法觸發click
        a.click();
        $(a).remove();
      };
    }
  };
  // 發送ajax請求
  xhr.send();
}

優點:支持post方式

缺點:還是該死的兼容性問題

所以處理兼容性最好的方式 還是form結合iframe(不考慮兼容性當然還是XMLHttpRequest最好),這種方式不論是上傳和下載 都是完美支持的。上傳下載通用。

最好的上傳下載方式: 你們的Boss不要求兼容ie低版本瀏覽器


分享到:
標簽:ajax上傳 無刷新上傳和下載
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定