一、概述
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