Ajax之魂-WEB中的XMLHttpRequest規(guī)范:附FormData詳解

寫在前面

之所以會有此篇有兩個原因:

  1. FormData對于XMLHttpRequest非常重要,所有以Ajax方式上傳文件的功能都需要用到它。
  2. XMLHttpRequest規(guī)范的內(nèi)容太多了,放到一篇中介紹實現(xiàn)是太過寵大;不僅對于作者來說負擔(dān)太重,對于讀者來說也不宜消化。

基于以上原因,我就把FormData單獨出來了。

此篇一定要結(jié)合Ajax之魂-WEB中的XMLHttpRequest規(guī)范一起看;并且此篇是以
Ajax之魂-WEB中的XMLHttpRequest規(guī)范的附錄出現(xiàn)的,所以如果單獨看了此篇,意義不大。

FormData 定義

以下代碼來自W3C的“XMLHttpRequest Level 1”規(guī)范。

[Constructor(optional HTMLFormElement form )]
interfaceFormData { 

  void append([EnsureUTF16] DOMStringname, Blob value, optional EnsureUTF16] DOMStringfilename );

  void append([EnsureUTF16] DOMStringname, [EnsureUTF16] DOMStringvalue);

};

FormData對象可以描述為是一列表有序的name和value組成的條目(此處為直譯,因為以作者的水平實現(xiàn)不知道應(yīng)該翻譯成中文應(yīng)該使用哪個詞語,英文為:entry)。也就是說,有一組(數(shù)量不定且可變)條目組成了FormData對象,這些條目中和每一個都包含兩個屬性,分別是name和value。

在一個條目中,如果它的value屬性是String類型的,那么這個條目就是String類型的,否則這個條目就是File類型的。如果條目是File類型的,它的文件名存儲在條目的value屬性的name特性(可以說是屬性,這里翻譯為特性僅僅是為了和屬性區(qū)分開)中。

創(chuàng)建FormData對象

fd = new FormData([form]);

參數(shù)form是可選的,如果傳了參數(shù),則form必須是一個HTML 中 form 元素的DOM對象。

創(chuàng)建FormData 對象的示例代碼

調(diào)用無參構(gòu)造函數(shù),創(chuàng)建一個空的FormData對象

// 無參構(gòu)造函數(shù)
fd = new FormData();

利用JavaScript代碼創(chuàng)建一個 form 元素的DOM對象,然后傳參給FormData的構(gòu)造器得到有初始值的FormData對象

// 構(gòu)造 form 元素的DOM對象
form = document.createElement("form"); 
input = document.createElement("input");
input.name = "username";
input.value = "仵士杰";
form.appendChild(input);
fd = new FormData(form);

利用HTML中的form表單獲取 form 元素的DOM對象,然后傳參給FormData的構(gòu)造器得到有初始值的FormData對象

//HTML代碼如下
<!DOCTYPE HTML>
<html>
<head><meta charset="UTF-8" /></head>
<body>
    <form id="myForm">
      <input name="username" value="仵士杰" />
    </form>
</body>
</html>

//JavaScript代碼如下
form = document.getElementById("myForm");
fd = new FormData(form);

FormData 對象的創(chuàng)建過程

FormData對象的構(gòu)造函數(shù)的執(zhí)行步驟如下:

  1. 把 變量 fd 設(shè)置為了個新的FormData對象
  2. 如果傳了form參數(shù),從form表單中構(gòu)造數(shù)據(jù)集,并設(shè)置 fd 的 entries 。
  3. 返回 fd

向FormData對象中加入新的條目

fd.append(name,value [,filename]);

上面的代碼向FormData對象中加入了一個條目

參數(shù)說明

name:添加成功后將其值賦給條目的name屬性,必傳參數(shù);
value:添加成功后將a其值賦給條目的value屬性,必傳參數(shù);
filename:可選參數(shù),如果value的類型為File,filename參數(shù)的值將被賦給條目中value屬性的name特性。

向FormData對象中加新條目的過程

  1. 把 變量 entry 設(shè)置成一個新的 條目對象
  2. 把參數(shù)name的值賦給entry中的name屬性
  3. 如果value是Blob類型的對象,則把value轉(zhuǎn)換成的File對象后將value的name特性值設(shè)為“blob”。
  4. 如果value是File類型的對象,且給定了filename參數(shù),則把filename的值賦給value中的name特性。
  5. 把value賦值給entry的value屬性。
  6. entry 添加到FormData對象的entries列表中。

打完收功

以上就是有關(guān)FormData的全部介紹,作者已經(jīng)盡力寫到最詳盡;如果您還有疑問請留言,作者將盡量改進,以期幫助到更廣大的WEB工程師和愛好者。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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