FormData類型實際上是在XMLHttpRequest 2級定義的,它是爲序列化表以及建立與表單格式相同的數據(固然是用於XHR傳輸)提供便利。segmentfault
建立一個formData對象實例有幾種方式數組
一、建立一個空對象
實例app
var formData = new FormData();
此時能夠調用append()方法來添加數據異步
二、使用已有的表單來初始化一個對象實例函數
假如如今頁面已經有一個表單post
<form id="myForm" action="" method="post"> <input type="text" name="name">名字 <input type="password" name="psw">密碼 <input type="submit" value="提交"> </form>
咱們能夠使用這個表單元素做爲初始化參數,來實例化一個formData對象url
// 獲取頁面已有的一個form表單 var form = document.getElementById("myForm"); // 用表單來初始化 var formData = new FormData(form); // 咱們能夠根據name來訪問表單中的字段 var name = formData.get("name"); // 獲取名字 var psw = formData.get("psw"); // 獲取密碼 // 固然也能夠在此基礎上,添加其餘數據 formData.append("token","kshdfiwi3rh");
首先,咱們要明確formData裏面存儲的數據形式,一對key/value組成一條數據,key是惟一的,一個key可能對應多個value。若是是使用表單初始化,每個表單字段對應一條數據,它們的HTML name屬性即爲key值,它們value屬性對應value值。spa
咱們能夠經過get(key)/getAll(key)來獲取對應的value,code
formData.get("name"); // 獲取key爲name的第一個值 formData.get("name"); // 返回一個數組,獲取key爲name的全部值
咱們能夠經過append(key, value)來添加數據,若是指定的key不存在則會新增一條數據,若是key存在,則添加到數據的末尾orm
formData.append("k1", "v1"); formData.append("k1", "v2"); formData.append("k1", "v1"); formData.get("k1"); // "v1" formData.getAll("k1"); // ["v1","v2","v1"]
咱們能夠經過set(key, value)來設置修改數據,若是指定的key不存在則會新增一條,若是存在,則會修改對應的value值。
formData.append("k1", "v1"); formData.set("k1", "1"); formData.getAll("k1"); // ["1"]
咱們能夠經過has(key)來判斷是否對應的key值
formData.append("k1", "v1"); formData.append("k2",null); formData.has("k1"); // true formData.has("k2"); // true formData.has("k3"); // false
經過delete(key),來刪除數據
formData.append("k1", "v1"); formData.append("k1", "v2"); formData.append("k1", "v1"); formData.delete("k1"); formData.getAll("k1"); // []
咱們能夠經過entries()來獲取一個迭代器,而後遍歷全部的數據,
formData.append("k1", "v1"); formData.append("k1", "v2"); formData.append("k2", "v1"); var i = formData.entries(); i.next(); // {done:false, value:["k1", "v1"]} i.next(); // {done:fase, value:["k1", "v2"]} i.next(); // {done:fase, value:["k2", "v1"]} i.next(); // {done:true, value:undefined}
能夠看到返回迭代器的規則
每調用一次next()返回一條數據,數據的順序由添加的順序決定
返回的是一個對象,當其done屬性爲true時,說明已經遍歷完全部的數據,這個也能夠做爲判斷的依據
返回的對象的value屬性以數組形式存儲了一對key/value,數組下標0爲key,下標1爲value,若是一個key值對應多個value,會變成多對key/value返回
咱們也能夠經過values()方法只獲取value值
formData.append("k1", "v1"); formData.append("k1", "v2"); formData.append("k2", "v1"); var i = formData.entries(); i.next(); // {done:false, value:"v1"} i.next(); // {done:fase, value:"v2"} i.next(); // {done:fase, value:"v1"} i.next(); // {done:true, value:undefined}
咱們能夠經過xhr來發送數據
var xhr = new XMLHttpRequest(); xhr.open("post","login"); xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); xhr.send(formData);
這種方式能夠來實現文件的異步上傳。
轉自: https://segmentfault.com/a/1190000006716454