您好,欢迎访问一九零五行业门户网

详细分析HTML5 FormData对象的使用

xmlhttprequest level 2 添加了一个新的接口——formdata。利用 formdata 对象,我们可以通过 javascript 用一些键值对来模拟一系列表单控件,我们还可以使用 xmlhttprequest 的 send() 方法来异步的提交表单。与普通的 ajax 相比,使用 formdata 的最大优点就是我们可以异步上传二进制文件。
创建一个formdata对象你可以先创建一个空的 formdata 对象,然后使用 append() 方法向该对象里添加字段,如下:
var omyform = new formdata(); omyform.append("username", "groucho"); omyform.append("accountnum", 123456); // 数字123456被立即转换成字符串"123456" // fileinputelement中已经包含了用户所选择的文件 omyform.append("userfile", fileinputelement.files[0]); var ofilebody = "<a id="a"><b id="b">hey!</b></a>"; // blob对象包含的文件内容 var oblob = new blob([ofilebody], { type: "text/xml"}); omyform.append("webmasterfile", oblob); var oreq = new xmlhttprequest(); oreq.open("post", "http://foo.com/submitform.php"); oreq.send(omyform);
注:字段 "userfile" 和 "webmasterfile" 的值都包含了一个文件。通过 formdata.append() 方法赋给字段 "accountnum" 的数字被自动转换为字符(字段的值可以是一个 blob 对象,file对象或者字符串,剩下其他类型的值都会被自动转换成字符串)。
在该例子中,我们创建了一个名为 omyform 的 formdata 对象,该对象中包含了名为"username","accountnum","userfile" 以及 "webmasterfile" 的字段名,然后使用xmlhttprequest的 send() 方法把这些数据发送了出去。"webmasterfile" 字段的值不是一个字符串,还是一个 blob 对象。
使用html表单来初始化一个formdata对象可以用一个已有的 form 元素来初始化 formdata 对象,只需要把这个 form 元素作为参数传入 formdata 构造函数即可:
var newformdata = new formdata(someformelement);
例如:
var formelement = document.getelementbyid("myformelement"); var oreq = new xmlhttprequest(); oreq.open("post", "submitform.php"); oreq.send(new formdata(formelement));
你还可以在已有表单数据的基础上,继续添加新的键值对,如下:
var formelement = document.getelementbyid("myformelement"); formdata = new formdata(formelement); formdata.append("serialnumber", serialnumber++); oreq.send(formdata);
你可以通过这种方式添加一些不想让用户编辑的固定字段,然后再发送.
使用formdata对象发送文件你还可以使用 formdata 来发送二进制文件.首先在 html 中要有一个包含了文件输入框的 form 元素:
<form enctype="multipart/form-data" method="post" name="fileinfo"> <label>your email address:</label> <input type="email" autocomplete="on" autofocus name="userid" placeholder="email" required size="32" maxlength="64" /><br /> <label>custom file label:</label> <input type="text" name="filelabel" size="12" maxlength="32" /><br /> <label>file to stash:</label> <input type="file" name="file" required /> </form> <p id="output"></p> <a href="javascript:sendform()">stash the file!</a>
然后你就可以使用下面的代码来异步的上传用户所选择的文件:
function sendform() { var ooutput = document.getelementbyid("output"); var odata = new formdata(document.forms.nameditem("fileinfo")); odata.append("customfield", "this is some extra data"); var oreq = new xmlhttprequest(); oreq.open("post", "stash.php", true); oreq.onload = function(oevent) { if (oreq.status == 200) { ooutput.innerhtml = "uploaded!"; } else { ooutput.innerhtml = "error " + oreq.status + " occurred uploading your file.<br \/>"; } }; oreq.send(odata); }
你还可以不借助 html 表单,直接向 formdata 对象中添加一个 file 对象或者一个 blob 对象:
data.append("myfile", myblob);
如果 formdata 对象中的某个字段值是一个 blob 对象,则在发送 http 请求时,代表该 blob 对象所包含文件的文件名的 "content-disposition" 请求头的值在不同的浏览器下有所不同,firefox使用了固定的字符串"blob",而 chrome 使用了一个随机字符串。
你还可以使用 jquery 来发送 formdata,但必须要正确的设置相关选项:
var fd = new formdata(document.getelementbyid("fileinfo")); fd.append("customfield", "this is some extra data"); $.ajax({ url: "stash.php", type: "post", data: fd, processdata: false, // 告诉jquery不要去处理发送的数据 contenttype: false // 告诉jquery不要去设置content-type请求头 });
浏览器兼容性桌面端:
featurechromefirefox (gecko)internet exploreroperasafari
basic support 7+ 4.0 (2.0) 10+ 12+ 5+
支持filename参数 (yes) 22.0 (22.0) ? ? ?
移动端: 
featureandroidchrome for androidfirefox mobile (gecko)ie mobileopera mobilesafari mobile
basic support 3.0 ? 4.0 (2.0) ? 12+
?
支持filename参数 ? ? 22.0 (22.0) ? ? ?
以上就是详细分析html5 formdata对象的使用的详细内容。
其它类似信息

推荐信息