概述

FormData对象用以将数据编译成键值对,以便用XMLHttpRequest来发送数据。其主要用于发送表单数据,但亦可用于发送带键数据(key data),而独立于表单使用。如果表单enctype属性设为multipart/form-data ,则会使用表单的submit()方法来发送数据,从而,发送数据具有同样形式。key是唯一的,一个key可能对应多个value。如果是使用表单初始化,每一个表单字段对应一条数据,它们的HTML name属性即为key值,它们value属性对应value值。

 

构造函数

1.创建一个空对象实例

  var formData = new FormData();

此时可以调用append()方法来添加数据。

formData.append('user','username');
formData.get('user');  // 获取
formData.delete('user');  // 删除

 

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[0]);

 

因为new FormData需要的是一个HtmlElement类型的数据,而jquery拿到的是HtmlElement集合,所以哪怕只有一个元素,也要用[0]取其第一个元素。 

// 我们可以根据name来访问表单中的字段
var name = formData.get("name"); // 获取名字
var psw = formData.get("psw"); // 获取密码
// 当然也可以在此基础上,添加其他数据
formData.append("token","ccccccc");

 

获取

我们可以通过get(key)/getAll(key)来获取对应的value。

formData.get('name');  // 获取key为name的值

 

添加

我们可以通过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"]

 

设置修改数据

我们可以通过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}

我们也可以通过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}

 

FormData+Ajax

对于包含图片、文件的表单做Ajax提交时,可以用FormData来封装数据,并提交到服务端。

<form id="addFeedbackForm" enctype='multipart/form-data'>
    <div class="form-group">
        作者:<span id="loginName" name="loginName"></span>
    </div>
    <div class="controls">
        <textarea id="describe" name="describe"></textarea>
    </div>
        <input id="f_upload" name="image" type="file" class="file" multiple />
    <div class="pull-left">
        <button type="button" id="submitButton" onclick="submit()" >提交</button>
    </div>
</form>
function submit(){
var formData = new FormData($("#form")[0]);
$.ajax({
        type:'post',
        url:'../../tmarket/updateUserInfo.action',
        data:formData,
        contentType: false,
        processData: false,
        success:function(){
            alert("修改成功");
        },
        error:function () {
            alert("修改失败!");
        }
        });
}

在Action中,可以通过request.getParameter("表单name属性值")方法来获取其中的数据。

如果是Struts2框架,还可以通过为标签的name值赋予" obj.name" 的形式,然后在Action中通过obj.getName()来获取。使用详情参考Struts2的表达式驱动。

posted on 2019-06-24 22:43  FuYingju  阅读(103)  评论(0编辑  收藏  举报