在IE 8/9中回退FormData

时间:2012-06-01 14:45:44

标签: javascript ajax xmlhttprequest fileapi

IE 8/9中不存在

FormData,但我需要在这些浏览器中使用该功能。这有一个很好的后备吗?

我会尝试发送json数据,但我需要将文件传递给服务器。我将此文件附加到现代浏览器中的formData,只需提交XHR请求即可。因为IE 8/9中不存在FormData,这显然会失败。

// I cant seem to get this to work with a file.
$.ajax({
    url: '/genericHandlers/UploadDocsFile.ashx',
    type: "POST",
    data: model.toJSON(),
    contentType: 'application/json'
    }).done(function  (data) { 
       log('stuff happened!');
    });

也许另一种方法是在js中创建一个假的表单对象然后将数据附加到那个?

3 个答案:

答案 0 :(得分:8)

我只知道一种可能的解决方案,但对于IE来说,它并不是真正的1-1倒退。没有可能的通信API用于发送文件,因为您无法在旧浏览器中绑定输入字段,例如使用FormData的现代浏览器。但您可以使用iframe发送整个表单。对于这种情况,您可以使用支持XHR DataForm和iframe的jquery.form插件(当浏览器不支持FormData API时,数据与iframe一起发送)。

答案 1 :(得分:4)

您可以使用XMLHttpRequests手动发送文件,有关此here的大量信息。

您可以测试浏览器是否可以首先使用FormData对象:

if(typeof FormData !== 'undefined')
   ...

MDN有一个this function,你可以为后备修改:

var XHR = new XMLHttpRequest();
var urlEncodedData = "";
var urlEncodedDataPairs = [];
var name;

// We turn the data object into an array of URL encoded key value pairs.
for(name in data) {
  urlEncodedDataPairs.push(encodeURIComponent(name) + '=' + encodeURIComponent(data[name]));
}

// We combine the pairs into a single string and replace all encoded spaces to 
// the plus character to match the behaviour of the web browser form submit.
urlEncodedData = urlEncodedDataPairs.join('&').replace(/%20/g, '+');

答案 2 :(得分:0)

此答案未严格解决您提出的问题,因此,我了解Mods是否会删除它。

但是,您的问题与我正在研究的一个问题密切相关,该问题是如何通过FormData()提供拖放式上传,并且老版本的浏览器会顺畅降级

有一个很棒的图书馆,名为dropzone.js,可以为我的问题提供完美的解决方案。最好的部分也许是该库提供了开箱即用的优雅降级功能,以支持在旧版浏览器as detailed here上的文件上传。

释义来源:

  

幸运的是,如果不支持浏览器,dropzone.js库将显示一个可自定义的后备类,其中包含一个输入字段和一个提交按钮。

我希望这些信息对像我这样的人有所帮助,以寻求一种易于实现且优雅的文件上传解决方案。