formdata的强大

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值。


key value
k1 [v1,v2,v3]
k2 v4
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"); // true
formData.has("k2"); // true
formData.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}
可以看到返回迭代器的规则


每调用一次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}
4. 发送数据
我们可以通过xhr来发送数据


var xhr = new XMLHttpRequest();
xhr.open("post","login");
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xhr.send(formData);
这种方式可以来实现文件的异步上传。
### 使用FormData对象进行表单数据传参 #### 创建并初始化FormData对象 为了创建`FormData`对象,通常会基于现有的HTML `<form>`元素来构建。这可以通过获取该表单对应的DOM对象实现。 ```javascript let formElement = document.getElementById('myForm'); let formData = new FormData(formElement); ``` 这里需要注意的是,在使用jQuery选择器的情况下,由于`new FormData()`接受的是原生DOM对象而不是jQuery对象,因此需要通过索引访问实际的DOM节点[^1]: ```javascript let formData = new FormData($('#myForm')[0]); ``` #### 添加额外的数据到FormData对象 除了自动收集来自关联表单字段的信息外,还可以手动向`FormData`实例追加键值对: ```javascript formData.append('extraField', 'value'); ``` 此操作允许动态增加不在原始表单内的参数,这对于处理文件上传或多部分请求特别有用[^4]。 #### 发送带有FormData的对象 一旦准备好要发送的数据包,则可以借助XMLHttpRequest或Fetch API将其提交给服务器端点。下面展示了采用传统XHR方式的例子: ```javascript var xhr = new XMLHttpRequest(); xhr.open('POST', '/submit-url', true); xhr.onload = function () { console.log(xhr.responseText); }; xhr.send(formData); ``` 对于现代浏览器环境而言,推荐使用更简洁且功能强大的fetch()函数来进行网络通信: ```javascript fetch('/submit-url', { method: 'POST', body: formData }) .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error('Error:', error)); ``` 上述代码片段中并未显式指定`Content-Type`头信息,因为当body为`FormData`类型时,默认情况下浏览器会正确设置其MIME类型为`multipart/form-data`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值