1. 程式人生 > >系統學習前端之FormData詳解

系統學習前端之FormData詳解

pan 3.2 第一個 實例 open password 訪問表 -name 訪問

FormData

1. 概述

FormData類型其實是在XMLHttpRequest 2級定義的,它是為序列化表以及創建與表單格式相同的數據(當然是用於XHR傳輸)提供便利。

2. 構造函數

創建一個formData對象實例有幾種方式

1、創建一個空對象實例

var formData = new FormData();

此時可以調用append()方法來添加數據

2、使用已有的表單來初始化一個對象實例

假如現在頁面已經有一個表單

<form
id="myForm" action="" method="post">
<input type="text" name="name">名字 <input type="password" name="psw">密碼 <input type="submit" value="提交"></form>

我們可以使用這個表單元素作為初始化參數,來實例化一個formData對象

// 獲取頁面已有的一個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");

3. 操作方法

首先,我們要明確formData裏面存儲的數據形式,一對key/value組成一條數據,key是唯一的,一個key可能對應多個value。如果是使用表單初始化,每一個表單字段對應一條數據,它們的HTML name屬性即為key值,它們value屬性對應value值。

keyvalue
k1[v1,v2,v3]
k2v4

3.1 獲取值

我們可以通過get(key)/getAll(key)來獲取對應的value,

formData.get("name"); // 獲取key為name的第一個值formData.get("name"); // 返回一個數組,獲取key為name的所有值

3.2 添加數據

我們可以通過append(key, value)來添加數據,如果指定的key不存在則會新增一條數據,如果key存在,則添加到數據的末尾

formData.append("k1", "v1");formData.append("k1", "v2");formData.append("k1", "v1");formData.get("k1"); // "v1"formData.getAll("k1"); // ["v1","v2","v1"]

3.3 設置修改數據

我們可以通過set(key, value)來設置修改數據,如果指定的key不存在則會新增一條,如果存在,則會修改對應的value值。

formData.append("k1", "v1");formData.set("k1", "1");formData.getAll("k1"); // ["1"]

3.4 判斷是否該數據

我們可以通過has(key)來判斷是否對應的key值

formData.append("k1", "v1");formData.append("k2",null);formData.has("k1"); // trueformData.has("k2"); // trueformData.has("k3"); // false

3.5 刪除數據

通過delete(key),來刪除數據

formData.append("k1", "v1");formData.append("k1", "v2");formData.append("k1", "v1");formData.delete("k1");formData.getAll("k1"); // []

3.6 遍歷

我們可以通過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}

可以看到返回叠代器的規則

  1. 每調用一次next()返回一條數據,數據的順序由添加的順序決定

  2. 返回的是一個對象,當其done屬性為true時,說明已經遍歷完所有的數據,這個也可以作為判斷的依據

  3. 返回的對象的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}

4. 發送數據

我們可以通過xhr來發送數據

var xhr = new XMLHttpRequest();xhr.open("post","login");xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");xhr.send(formData);

這種方式可以來實現文件的異步上傳。

參考

  1. 兼容性查詢

  2. MDN

  3. 《JavaScript高級程序設計》

系統學習前端之FormData詳解