跳到主要内容

FormData

一、认识


FormData 接口提供了一种表示表单数据的键值对 key/value 的构造方式,并且可以轻松的将数据通过XMLHttpRequest.send() 方法发送出去,本接口和此方法都相当简单直接。如果送出时的编码类型被设为 multipart/form-data,它会使用和表单一样的格式。

二、语法


通过 FormData 创建一个新的 FormData 对象

const formData = new FormData();

技巧

  • formData 对象可直接在 for……of 结构中使用,而不需要使用entries

    const formData = new FormData();
    formData.set("key","value");
    formData.set("age",23);

    for(const [key,value] of formData){
    console.log(key); // key age
    console.log(value); //value 23
    }

三、方法


3.1 formData.append()

formData.append() 向 FormData 中添加新的属性值,FormData 对应的属性值存在也不会覆盖原值,而是新增一个值,如果属性不存在则新增一项属性值。

语法

const formData = new FormData();
formData.append("key","value");

3.2 formData.delete()

formData.delete() 从 FormData 对象里面删除一个键值对。

语法

const formData = new FormData();
formData.append("key","value");
formData.append("age",23);

formData.delete("key");

3.3 formData.entries()

formData.entries() 返回一个包含所有键值对的iterator对象。

语法

const formData = new FormData();
formData.append("key","value");
formData.append("age",23);

const iterator = formData.entries();
console.log(iterator)

场景

const formData = new FormData();
formData.append("key","value");
formData.append("age",23);

const iterator = formData.entries();
for(const item of iterator){
console.log(item) //  ['key', 'value']  ['age', '23']
}

3.4 formData.get()

formData.get() 返回在 FormData 对象中与给定键关联的第一个值。

语法

const formData = new FormData();
formData.append("key","value");
formData.append("age",23);

const value = formData.get("key");
console.log(value);

3.5 formData.getAll()

formData.getAll() 返回一个包含 FormData 对象中与给定键关联的所有值的数组。

语法

const formData = new FormData();
formData.append("key","value1");
formData.append("key","value2");
formData.append("age",23);

const valueList = formData.getAll("key");
console.log(valueList); // ['value1', 'value2']

3.6 formData.has()

formData.has() 返回一个布尔值表明 FormData 对象是否包含某些键。

语法

const formData = new FormData();
formData.append("key","value");
formData.append("age",23);

const isHas = formData.has("key");
console.log(isHas);

3.7 formData.keys()

formData.keys() 给 FormData 设置属性值,如果FormData 对应的属性值存在则覆盖原值,否则新增一项属性值。

语法

const formData = new FormData();
formData.append("key","value");
formData.append("age",23);

const keys = formData.keys();
console.log(keys);

场景

const formData = new FormData();
formData.append("key","value");
formData.append("age",23);

const keys = formData.keys();
for(const key of keys){
console.log(key) // key age
}

3.8 formData.set()

formData.set() 给 FormData 设置属性值,如果FormData 对应的属性值存在则覆盖原值,否则新增一项属性值。

语法

const formData = new FormData();
formData.set("key","value");
formData.set("age",23);

console.log(formData);

3.9 formData.values()

formData.values() 返回一个包含所有值的iterator对象。

语法

const formData = new FormData();
formData.set("key","value");
formData.set("age",23);

const values = formData.values();
console.log(values);

场景

const formData = new FormData();
formData.set("key","value");
formData.set("age",23);

const values = formData.values();
for(const value of values){
console.log(value); // value 23
}

四、场景


4.1 表单序列化

FormData 可以将HTML表单序列化,映射成表单对象。注意仅限表单中带有name属性的表单空间

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Ajax</title>
</head>
<body>
<form id="form">
<div>
<label for="username">用户名:</label>
<input type="text" name="username" />
</div>
<div>
<label for="password">密码:</label>
<input type="password" name="password" />
</div>
<div>
<button id="btn">发送</button>
</div>
</form>
<script>
const btn = document.getElementById("btn");
btn.addEventListener("click", function (e) {
e.preventDefault();
const form = document.getElementById("form");
const formData = new FormData(form);
for (const [key, value] of formData) {
console.log(key, value);
}
});
</script>
</body>
</html>