FormData使用教程

FormDataAjax2.0(XMLHttpRequest Level2)提供的一種將form表單元素name和value組合成鍵值盗蟆,實現(xiàn)表單數(shù)據(jù)的序列化戈二,從而減少from表單元素的拼接,提高工作效率對的接口喳资,以方便將form表單數(shù)據(jù)通過XMLHttpRequest.send() 方法發(fā)送到后端觉吭,可以使用該對象來處理form表單元素并方便的進行文件上傳。

XMLHttpRequest 是一個瀏覽器接口仆邓,通過它鲜滩,我們可以使用Javascript進行 HTTP (S) 通信。XMLHttpRequest 在現(xiàn)在瀏覽器中是一種常用的前后臺交互數(shù)據(jù)的方式节值。2008年 2 月徙硅,XMLHttpRequest Level 2 草案提出來了,相對于上一代搞疗,它有一些新的特性嗓蘑,其中FormData 就是XMLHttpRequest Level 2 新增的一個對象,利用它來提交表單匿乃、模擬表單提交脐往,當然最大的優(yōu)勢就是可以上傳二進制文件。

一扳埂、FormData主要用途
  1. 將form表單元素的name和value組合成鍵值對业簿,實現(xiàn)表單數(shù)據(jù)序列化,提高開發(fā)效率阳懂。

  2. 異步上傳文件梅尤。

二、FormData用法詳解
  1. FormData方法
  • FormData.append()向 FormData 中添加新的屬性值岩调,F(xiàn)ormData 對應的屬性值存在也不會覆蓋原值巷燥,而是新增一個值,如果屬性不存在則新增一項屬性值号枕。

  • FormData.delete()從 FormData 對象里面刪除一個鍵值對缰揪。

  • FormData.entries()返回一個包含所有鍵值對的iterator對象。

  • FormData.get() 返回在 FormData 對象中與給定鍵關聯(lián)的第一個值葱淳。

  • FormData.getAll()返回一個包含 FormData 對象中與給定鍵關聯(lián)的所有值的數(shù)組钝腺。

  • FormData.has()返回一個布爾值表明 FormData 對象是否包含某些鍵抛姑。

  • FormData.keys()返回一個包含所有鍵的iterator對象。

  • FormData.set()給 FormData 設置屬性值艳狐,如果FormData 對應的屬性值存在則覆蓋原值定硝,否則新增一項屬性值。

  • FormData.values()返回一個包含所有值的iterator對象毫目。

  1. FormData的初始化
//通過FormData()構(gòu)造函數(shù)創(chuàng)建空的formData對象
let formData = new FormData();
//通過append()方法新增屬性
formData.append('userName', 'Iron man');
//通過get()方法對值讀取屬性
console.log(formdata.get("userName"));
//通過delete()方法刪除屬性
formData.delete('userName');
//通過set()方法對值設置屬性
formdata.set("userName","鋼鐵俠");
console.log(formdata.get("userName"));

//通過form表單初始化FormData
//創(chuàng)建表單
<form id="carList">
    <p>商品名稱:<input type="text" name="productName"  value="耐克"></p>
    <p>商品數(shù)量:<select name="productNumber">
        <option value="1">1</option>
        <option value="2">2</option>
        <option value="3">3</option>
        <option value="4">4</option>
    </select></p>
    <p>商品價格:<select name="productPrice">
        <option value="100">100</option>
        <option value="200">200</option>
        <option value="300">300</option>
        <option value="400">400</option>
    </select></p>
    <p><input type="button" id="payment" value="支付"></p>
</form>
//表單原生作為參數(shù)初始化FormData
<script>
    //獲得表單按鈕元素
    var paymentBtn = document.getElementById("payment");
    //為按鈕添加點擊事件
    paymentBtn.onclick=function(){
        //根據(jù)ID獲得頁面當中的form表單元素
        var form = document.querySelector("#carList");
        //將獲得的表單元素作為參數(shù)蔬啡,對formData進行初始化
        var formData = new FormData(form);
        //獲取商品名稱
        console.log(formData.get("productName"));//耐克
        //獲取商品數(shù)量
        console.log(formData.get("productNumber"));//3
        //獲取商品價格
        console.log(formData.get("productPrice"));//400
    }
</script>
  1. 使用詳解
//通過append('key','value')添加新的屬性值,F(xiàn)ormData 對應的屬性值存在也不會覆蓋原值镀虐,而是新增一個值箱蟆,如果屬性不存在則新增一項屬性值
var formData = new FormData();
formData.append('userName','hhp');
formData.append('userName','li');
formData.append('age','20');
formData.append('age','30');
formData.append('gender','man')

//如果一個key寫入多個value 通過get()方法只會獲取到第一個寫入的value
console.log(formData.get("userName"));//hhp
console.log(formData.get("age"));//20

//通過getall()可以讀取當前key所有的值官硝,以數(shù)組的形式輸出
console.log(formData.getAll("userName"));//["hhp", "li"]
console.log(formData.getAll("age"));//["20", "30"]
console.log(formData.getAll("gender"));//["man"]

formData.append('gender','woman');
console.log(formData.getAll('gender'));//["man","woman"]

//通過set()方法給 FormData 設置屬性值念祭,如果FormData 對應的屬性值存在則覆蓋原值,否則新增一項屬性值珠洗。同時如果以前存在多個值都會被set進的新值覆蓋诺核。
formData.set('gender','super man');
console.log(formData.getAll('gender'));//["super man"]
//通過has()方法返回一個布爾值表明 FormData 對象是否包含某些鍵
console.log(formData.has('userName'));//true
console.log(formData.has('stature'));//false
//通過delete()方法從 FormData 對象里面刪除一個鍵值對
formData.append('stature',185);
formData.append('stature',184);
console.log(formData.get('stature'));//185
console.log(formData.getAll('stature'));//["185","184"]
//會刪除當前key下所有的值
console.log(formData.delete('stature'));//undefined
console.log(formData.getAll('stature'));//[]
console.log(formData.values());//返回當前表單數(shù)據(jù)對象所有的值
console.log(formData.entries());//
for (var ele of formData.entries()){
    console.log(ele);//["userName", "hhp"]["userName", "li"]["age", "20"]["age", "30"]["gender", "super man"]
    console.log(ele[0] + '==' + ele[1]);//userName==hhp userName==li age==20 age==30  gender==super man
}
  1. 通過XMLHttpRequest發(fā)送數(shù)據(jù)
var paymentBtn = document.getElementById("payment");
//為按鈕添加點擊事件
paymentBtn.onclick=function(){
    //根據(jù)ID獲得頁面當中的form表單元素 當前元素就是上面第二條的form表單
    var form = document.querySelector("#carList");
    //將獲得的表單元素作為參數(shù)抄肖,對formData進行初始化
    var formData = new FormData(form);
    var xml = new XMLHttpRequest();
    xml.open('POST', "http:172.168.0.1");
    xml.send(formData);
    xml.onload = function (){
        console.log(xml.status);
    }
}
  1. FormData上傳圖片
//將圖片轉(zhuǎn)為blob格式
export function getBlob(url) {
  var xhr = new XMLHttpRequest();
  xhr.open('GET', url);
  xhr.responseType = 'blob';
  xhr.send();
  return new Promise((resolve, reject) => {
    xhr.onreadystatechange = function() {
      if (xhr.readyState === 4) {
        resolve(xhr.response); // 返回值
      }
    };
  });
}
//fileFront.path圖片的臨時路徑
const fileBlob = await getBlob(fileFront.path)
const fileType = fileFront.type === 'image/png' ? '.png' : '.jpg';
const formData = new FormData();
formData.append('url','/nurse-coming-web/upload/imageUpload');
formData.append('file', fileBlob, Date.now() + fileType);
//
const front = await uploadImage(formData).then((data: any) => {
    console.log(data);
})
export function uploadImage(query) {
  return request({
    url: `/nurse-coming-web/upload/imageUpload`,
    options: {
      method: 'POST',
      data: query,
    },
    // headers: {//上傳圖片不需要主動加contenttype
    //   'Content-Type': "multipart/form-data;"
    // },
    api: 'nurseComingApi'

  });
}
  1. 兼容性
    由于 FormData 是 Ajax 2.0 新增的接口,低于IE10 的IE瀏覽器都不支持 FormData 窖杀,IE10以上支持append方法漓摩,其他方法全不支持。


    兼容性
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末入客,一起剝皮案震驚了整個濱河市管毙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌桌硫,老刑警劉巖夭咬,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異铆隘,居然都是意外死亡卓舵,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門膀钠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掏湾,“玉大人,你說我怎么就攤上這事肿嘲∪诨鳎” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵雳窟,是天一觀的道長尊浪。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么拇涤? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任捣作,我火速辦了婚禮,結(jié)果婚禮上工育,老公的妹妹穿的比我還像新娘虾宇。我一直安慰自己搓彻,他們只是感情好如绸,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著旭贬,像睡著了一般怔接。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上稀轨,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天扼脐,我揣著相機與錄音,去河邊找鬼奋刽。 笑死瓦侮,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的佣谐。 我是一名探鬼主播肚吏,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼狭魂!你這毒婦竟也來了罚攀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤雌澄,失蹤者是張志新(化名)和其女友劉穎斋泄,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體镐牺,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡炫掐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了睬涧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卒废。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖宙地,靈堂內(nèi)的尸體忽然破棺而出摔认,到底是詐尸還是另有隱情,我是刑警寧澤宅粥,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布参袱,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏抹蚀。R本人自食惡果不足惜剿牺,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望环壤。 院中可真熱鬧晒来,春花似錦、人聲如沸郑现。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽接箫。三九已至攒读,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間辛友,已是汗流浹背薄扁。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留废累,地道東北人邓梅。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像邑滨,于是被迫代替她去往敵國和親日缨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容

  • FormData的主要用途有兩個:1驼修、將form表單元素的name與value進行組合殿遂,實現(xiàn)表單數(shù)據(jù)的序列化,從而...
    青爭小臺閱讀 442評論 0 0
  • 1. FormData對象的作用 Form對象可以將數(shù)據(jù)編譯成鍵值對的格式乙各,以便于使用XMLHttpRequest...
    Mr_Arc閱讀 1,583評論 1 1
  • 一墨礁、概述 FormData對象的使用: 用一些鍵值對來模擬一系列表單控件:即把form中所有的元素的name與va...
    Juehm閱讀 12,740評論 0 12
  • 一. FormData 利用FormData對象,我們可以通過JavaScript用一些鍵值對來模擬一系列表單控件...
    Harlen_luan閱讀 7,741評論 0 15
  • 推薦指數(shù): 6.0 書籍主旨關鍵詞:特權(quán)县匠、焦點风科、注意力撒轮、語言聯(lián)想、情景聯(lián)想 觀點: 1.統(tǒng)計學現(xiàn)在叫數(shù)據(jù)分析贼穆,社會...
    Jenaral閱讀 5,721評論 0 5