2011-11-27 95 views
5

进出口试图在JS来发布表单数据:通过JS中的XMLHttpRequest对象发布formdata? (跨浏览器)

我有这样的代码:

var formData = new FormData(); 
    formData.append("username", "Groucho"); 
    formData.append("accountnum", 123456); 
    formData.append("afile", "2"); 

var xhr = new XMLHttpRequest(); 
xhr.open("POST", "http://xxxxx/xx.ashx",true); 
xhr.send(formData); 

FORMDATA根据MDN是不是在IE可用(或未知)。

当我尝试这FF

enter image description here(我认为它很好...)。

当我尝试在IE

enter image description here

解决投递表单数据(或我的数据,但客观地)跨浏览什么是什么?

回答

3

你没有说你正在使用哪个版本的IE。 form9对象在IE9或更低版本中不受支持。 XMLHttpRequest2中(其中包含FORMDATA对象)应在IE10支持(http://caniuse.com/xhr2

跨浏览器的AJAX文件上传很辛苦,现在做的事。你可能尝试建立你自己的表单标题/边界在JavaScript(见答案:XMLHttpRequest POST multipart/form-data),但个人而言,我不认为这是值得的努力。

7

我写了一个简单的包装,你可以用它来在IE中发送FormData(并且它不会搞乱webkit/gecko中的任何东西)。只需提供以下JS尝试之前使用FORMDATA:

var ieFormData = function ieFormData(){ 
if(window.FormData == undefined) 
{ 
    this.processData = true; 
    this.contentType = 'application/x-www-form-urlencoded'; 
    this.append = function(name, value) { 
     this[name] = value == undefined ? "" : value; 
     return true; 
    } 
} 
else 
{ 
    var formdata = new FormData(); 
    formdata.processData = false; 
    formdata.contentType = false; 
    return formdata; 
} 

}

现在只需切换所有新FORMDATA()调用新的ieFormData(),并切换

processData: false, 
contentType: false, 

processData: formdata.processData, 
contentType: formdata.contentType, 
cache: false, 

而且你们全都定了。当然,这不会让你包含文件(你仍然需要iframe hack),但它可以让你在IE中模仿FormData。

+0

我有一个类似的问题,但我不确定如何解决这个问题,如果它是var,我的代码会发生什么变化。 \t \t var formElement = document.getElementById(“formID”); \t \t var form = new FormData(formElement); \t \t form.append('postedFile',postedFile); \t \t request.open(“POST”,“/ Admin/SaveQuestion /”,true); \t \t request.send(form); – Jay

+0

我甚至不太担心发布的文件,我只是希望能够提交表单数据的其余部分 – Jay