Web前沿——HTML5FormData物件的使用
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> <div id="output"></div> <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請求頭 });
瀏覽器相容性
桌面端:
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | 7+ | 4.0 (2.0) | 10+ | 12+ | 5+ |
支援filename 引數 |
(Yes) | 22.0 (22.0) | ? | ? | ? |
移動端:
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | 3.0 | ? | 4.0 (2.0) | ? |
12+ |
? |
支援filename 引數 |
? | ? | 22.0 (22.0) | ? | ? | ? |
參考文獻:
- MDN:使用 XMLHttpRequest
- MDN:XMLHttpRequest FormData
- XMLHttpRequest 2 新技巧
- MDN:使用 FormData 物件
- W3C:XMLHttpRequest Level 2
本文連結:前端文摘:HTML5 Form Data 物件的使用
編譯來源:夢想天空 ◆ 關注前端開發技術 ◆ 分享網頁設計資源
作者:山邊小溪
主站:yyyweb.com 記住啦:)
歡迎任何形式的轉載,但請務必註明出處。
相關文章
- html 01前沿-web介紹HTMLWeb
- jsoup物件的使用JS物件
- 泛型物件的使用泛型物件
- Flutter現支援Web和桌面,一躍成為前沿大一統框架FlutterWeb框架
- IT最前沿
- 【web前端】用javascript實現物件的深複製Web前端JavaScript物件
- .NET Core 物件池的使用物件
- ASP.NET Web Pages – 物件簡介ASP.NETWeb物件
- web中,利用反射給物件賦值Web反射物件賦值
- 【web前端基礎 | JS基礎】物件Web前端JS物件
- Docker 前沿概述Docker
- ES6的Promise物件的使用Promise物件
- web前端瀏覽器物件模型章節Web前端瀏覽器物件模型
- ASP.NET Web Forms – SortedList 物件簡介ASP.NETWebORM物件
- ASP.NET Web Forms – Hashtable 物件簡介ASP.NETWebORM物件
- ASP.NET Web Forms – ArrayList 物件簡介ASP.NETWebORM物件
- web前端--最好用的切圖方法(轉換為智慧物件)Web前端物件
- 使用ProForm的useRef()物件的注意事項ORM物件
- web worker的介紹和使用Web
- Web前端作為移動網際網路時代的前沿技術,就業前景怎麼樣 ?Web前端就業
- SpringAop中JoinPoint物件的使用方法Spring物件
- GIS前沿技術
- Web前端遍歷物件應該如何操作呢?Web前端物件
- Web Storage API的介紹和使用WebAPI
- java_web:EL表示式的使用JavaWeb
- 使用反射建立窗體物件時,物件為NULL反射物件Null
- Web Worker 使用教程Web
- 使用Intent傳遞物件Intent物件
- javascript使用new建立物件JavaScript物件
- Web前端技術分享:Javascript中的內建物件陣列講解Web前端JavaScript物件陣列
- 前沿科技:量子計算
- go的web框架gin的使用(七):多路由GoWeb框架路由
- js原生dom物件和jQuery物件可以混合使用嗎?JS物件jQuery
- 長沙Web前端培訓:Javascript中的內建物件陣列講解Web前端JavaScript物件陣列
- SpringBoot使用外部Web容器的解決方案Spring BootWeb
- python web開發-flask中日誌的使用PythonWebFlask
- 使用PowerShell更新已存在的組設定物件物件
- 關於 JS 陣列,物件 length 使用的坑JS陣列物件
- .net 中的 Dto 引數封裝物件 使用封裝物件