一、概述 FormData類型是XMLHttpRequest 2級定義的,它是為序列化表以及創建與表單格式相同的數據提供便利。 作用:1.利用一些鍵值對來模擬一系列表單控制項:即將form中的所有表單元素的name和value組裝成一個queryString;2.非同步上傳二進位文件。 與普通Ajax相 ...
一、概述
FormData類型是XMLHttpRequest 2級定義的,它是為序列化表以及創建與表單格式相同的數據提供便利。
作用:1.利用一些鍵值對來模擬一系列表單控制項:即將form中的所有表單元素的name和value組裝成一個queryString;2.非同步上傳二進位文件。
與普通Ajax相比,使用FormData的最大優點:可以非同步上傳二進位文件。
二、使用
1.創建FormData對象方式
1).let formdata = new FormData(); 創建一個空的FormData對象,可以使用formdata.append(key,value)來添加數據。
2).let formdata = new FormData(form); 使用已有的表單來初始化一個FormData對象。
<form id="upload" method="post" action="">
<input type="text" name="username" value=""/>
<input type="password" name="paw" value=""/>
<input type="button" value="提交"/>
</form>
//獲取一個form表單對象
let form = document.getElementById("form");
//用這個表單對象來初始化FormData對象
let formdata = new FormData(form);
//我們可以通過name來訪問表單中的欄位
formdata.get("username"); //獲取username的值
formdata.get("pwd"); //獲取pwd的值
//我們也可以添加數據
formdata.append("token","fegahgag54");
2.數據形式
首先,我們要明確FormData裡面存儲的數據形式,一對key/value組成一條數據,key是唯一的,一個key可能對應多個value。如果使用表單初始化FormData對象,每一個表單欄位對應一條數據,他們的name屬性值對應key值,value屬性值對應value值。
3.操作方法
3.1獲取數據 formdata.get(key)
formdata.get("username"); //獲取key為username的第一個值
formdata.getAll("username"); //獲取key為username的所有值,返回一個數組
3.2添加數據 formdata.append(key,value)
formdata.append("k1","v1");
formdata.append("k1","v2");
formdata.append("k2","v2");
formdata.getAll("k1"); //["v1","v2"]
formdata.get("k2"); //"v2"
3.3設置/修改數據 formdata.set(key,value)如果key不存在則新增一條數據,如果存在,則會修改對應的value值。
formdata.append("k1","v1");
formdata.set("k1","v2");
formdata.get("k1"); //"v2"
3.4判斷是否存在某條數據 formdata.has(key),存在返回true,不存在返回false。
formdata.append("k1","v1");
formdata.has("k1"); //true
formdata.has("k2"); //false
3.5刪除數據 formdata.delete(key);
formdata.append("k1","v1");
formdata.delete("k1");
formdata.get("k1"); //null
3.6遍歷 通過entries()或values()來獲取一個遍歷器
formdata.append("k1","v1");
formdata.append("k2","v2");
for(let [key,value] of formdata.entries()){
console.log(key +":"+ value)
}
輸出:
"k1:v1"
"k2:v2"
formdata.append("k1","v1");
formdata.append("k2","v2");
for(let value of formdata.values()){
console.log(value)
}
輸出:
"v1"
"v2"
4.發送數據(上傳文件不刷新頁面)
<input type="file" id="upload"/>
<input type="button" id="upload-btn" value="上傳"/>
let btn = document.getElementById("upload-btn"); btn.onclick = function(){ let file = document.getElementById("upload"); let formdata = new FormData(); formdata.append("file",file.files[0]); fetch("https://www.baidu.com",{
method:'POST',
body:formdata
}).then(d=>{
console.log("result is" + d);
alert("上傳成功");
})
}
三、瀏覽器相容性
參考:
https://www.cnblogs.com/lhb25/p/html5-formdata-tutorials.html
https://segmentfault.com/a/1190000012327982
https://segmentfault.com/a/1190000006716454