小編給大家分享一下HTML5中FormData怎么用,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
專(zhuān)業(yè)從事成都做網(wǎng)站、網(wǎng)站建設(shè),高端網(wǎng)站制作設(shè)計(jì),小程序定制開(kāi)發(fā),網(wǎng)站推廣的成都做網(wǎng)站的公司。優(yōu)秀技術(shù)團(tuán)隊(duì)竭力真誠(chéng)服務(wù),采用H5頁(yè)面制作+CSS3前端渲染技術(shù),響應(yīng)式網(wǎng)站,讓網(wǎng)站在手機(jī)、平板、PC、微信下都能呈現(xiàn)。建站過(guò)程建立專(zhuān)項(xiàng)小組,與您實(shí)時(shí)在線互動(dòng),隨時(shí)提供解決方案,暢聊想法和感受。
XMLHttpRequest 是一個(gè)瀏覽器接口,通過(guò)它,我們可以使得 Javascript 進(jìn)行 HTTP (S) 通信。XMLHttpRequest 在現(xiàn)在瀏覽器中是一種常用的前后臺(tái)交互數(shù)據(jù)的方式。2008年 2 月,XMLHttpRequest Level 2 草案提出來(lái)了,相對(duì)于上一代,它有一些新的特性,其中 FormData 就是 XMLHttpRequest Level 2 新增的一個(gè)對(duì)象,利用它來(lái)提交表單、模擬表單提交,當(dāng)然最大的優(yōu)勢(shì)就是可以上傳二進(jìn)制文件。下面就具體介紹一下如何利用 FormData 來(lái)上傳文件。
FormData 上傳文件實(shí)例
首先看一下formData的基本用法:FormData對(duì)象,可以把所有表單元素的name與value組成一個(gè)queryString,提交到后臺(tái)。只需要把 form 表單作為參數(shù)傳入 FormData 構(gòu)造函數(shù)即可:
var form = document.getElementById("form1"); var fd = new FormData(form);
這樣就可以直接通過(guò)ajax 的 send() 方法將 fd 發(fā)送到后臺(tái)。
以下創(chuàng)建了一個(gè)表單 form,表單中除了普通的數(shù)據(jù)外,還有文件上傳,我們直接將 form對(duì)象作為參數(shù)傳入FormData對(duì)象:
上述代碼創(chuàng)建一個(gè)form,簡(jiǎn)單的填寫(xiě)一些信息,以及選擇一張圖片作為頭像,設(shè)置一個(gè)p來(lái)存放返回的結(jié)果。
為了簡(jiǎn)便,我們還是采用jquery封裝的ajax來(lái)向后臺(tái)傳輸數(shù)據(jù):
function fsubmit() { var form=document.getElementById("form1"); var fd =new FormData(form); $.ajax({ url: "server.php", type: "POST", data: fd, processData: false, // 告訴jQuery不要去處理發(fā)送的數(shù)據(jù) contentType: false, // 告訴jQuery不要去設(shè)置Content-Type請(qǐng)求頭 success: function(response,status,xhr){ console.log(xhr); var json=$.parseJSON(response); var result = ''; result +="個(gè)人信息:
name:"+json['name']+"
gender:"+json['gender']+"
number:"+json['number']; result += '
頭像:'; $('#result').html(result); } }); return false; }
上述代碼中的 server.php 是服務(wù)器端的文件,接收ajax請(qǐng)求,并將接收結(jié)果返回,具體代碼如下:
填寫(xiě)好信息后,點(diǎn)擊 submit,頁(yè)面中能得到以下效果,去服務(wù)器端對(duì)應(yīng)的文件夾下也能發(fā)現(xiàn)上傳的圖片。
如果你是原生 JavaScript 愛(ài)好者,當(dāng)然一樣能實(shí)現(xiàn)以上功能,下面是簡(jiǎn)單的JavaScript實(shí)現(xiàn)代碼:
function fsubmit() { var form=document.getElementById("form1"); var formData=new FormData(form); alert(formData.name); var oReq = new XMLHttpRequest(); oReq.onreadystatechange=function(){ if(oReq.readyState==4){ if(oReq.status==200){ console.log(typeof oReq.responseText); var json=JSON.parse(oReq.responseText); var result = ''; result +="個(gè)人信息:
name:"+json['name']+"
gender:"+json['gender']+"
number:"+json['number']; result += '
頭像:'; $('#result').html(result); } } }; oReq.open("POST", "server.php"); oReq.send(formData); return false; }
FormData 對(duì)象方法介紹
FormData 除了上面的創(chuàng)建新對(duì)象時(shí)直接將 form 作為參數(shù)傳入外,還有其他的功能。網(wǎng)上大部分關(guān)于 FormData 介紹的文章都只提到了append()方法,那么FormData 對(duì)象到底有些什么方法呢?我們console 一下就知道:
console 之后我們有重大的發(fā)現(xiàn),F(xiàn)ormData 對(duì)象竟然有這么方法,所以還是自己測(cè)試才能發(fā)現(xiàn)真相,下面就對(duì)這些方法一一進(jìn)行講解:
1、append()
append()方法用于向 FormData 對(duì)象中添加鍵值對(duì):
fd.append('key1',"value1"); fd.append('key2',"value2");
fd是 FormData 對(duì)象,可以新建的空的對(duì)象,也可以是已經(jīng)包含 form 表單或其他鍵值對(duì)。
2、set()
設(shè)置對(duì)應(yīng)的鍵 key 對(duì)應(yīng)的值 value(s)
fd.set('key1',"value1"); fd.set('key2',"value2");
看起來(lái)跟append() 方法有點(diǎn)類(lèi)似,這兩者的區(qū)別就是,當(dāng)指定的 key 值存在時(shí),append()方法是將新增的添加的所以的鍵值對(duì)最后,而set()方法將會(huì)覆蓋前面的設(shè)置的鍵值對(duì)。還是通過(guò)實(shí)例來(lái)對(duì)比,我們?cè)谇懊娴?form 的基礎(chǔ)上 append() 或 set() 新的鍵值對(duì):
fd.append('name',"will");
有兩個(gè)key為name的鍵值對(duì):
fd.set('name',"will");
只有一個(gè)key為name的鍵值對(duì):
以上就是 append() 和 set() 的區(qū)別。如果設(shè)置的key值不存在,那么兩者的效果是一樣的。
3、delete()
接收一個(gè)參數(shù),表示你要?jiǎng)h除的 key 值的名字,如果有多個(gè)相同 key 值,會(huì)一并刪除:
fd.append('name','will'); fd.delete('name');
form 中的 name 信息以及通過(guò)append() 新增的name 的信息都被刪除了。
4、get() 和 getAll()
接收一個(gè)參數(shù),表示需要查找的 key 的名稱(chēng),返回第一個(gè)該 key 對(duì)應(yīng)的 value 值。如果有多個(gè)相同的 key, 而且要返回所有的這個(gè) key 對(duì)應(yīng)的 value 值。
同樣以上面的 form 表單為基礎(chǔ):
fd.append('name','will'); console.log(fd.get('name')); // sean
fd.append('name','will'); console.log(fd.getAll('name')); // ["sean", "will"]
5、has()
該方法也接收一個(gè)參數(shù),同樣是 key 的名稱(chēng),返回一個(gè)Boolean 值, 用來(lái)判斷FormData 對(duì)象是否含有該 key。以上面的form為例:
console.log(fd.has('name')); // true console.log(fd.has('Name')); // false
6、keys()
該方法不需要接收參數(shù),返回一個(gè)迭代器,通過(guò)這個(gè)迭代器,我們可以遍歷FormData 對(duì)象中所有的 key。以上面的form為例:
for (var key of fd.keys()) { console.log(key); }
結(jié)果為:
name
gender
number
photo
7、values()
有遍歷 key 的迭代,當(dāng)然也就少不了遍歷 value 的迭代器了。values()就是遍歷value 的迭代器,用法與 keys() 類(lèi)似:
for (var value of fd.values()) { console.log(value); }
結(jié)果:
8、entries()
有遍歷 key 的迭代器,也有遍歷 value 的迭代器,為何不搞一個(gè)兩者一起的呢!entries()就是返回一個(gè)包含鍵值對(duì)的迭代器:
for(var pair of fd.entries()) { console.log(pair[0]+ ', '+ pair[1]); }
結(jié)果:
FormData兼容性問(wèn)題
由于 FormData 是 XMLHttpRequest Level 2 新增的接口,現(xiàn)在 低于IE10 的IE瀏覽器不支持 FormData ,至于 上面介紹的 FormData 對(duì)象的方法經(jīng)過(guò)測(cè)試,在 IE 瀏覽器中都不支持,具體的各大瀏覽器的支持情況可以參照下圖:
看完了這篇文章,相信你對(duì)HTML5中FormData怎么用有了一定的了解,想了解更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!