Javascript IE9提示用户提交隐藏的iFrame

Javascript IE9提示用户提交隐藏的iFrame,javascript,jquery,iframe,Javascript,Jquery,Iframe,我正在调试我们的文件上传脚本,它在不支持通过XMLHttpRequest对象发送文件数据的浏览器中使用隐藏的iframe 关于在IE中提交iframe有大量的文章和问题;(如,和),但他们都引用了IE不会为您正确设置“name”属性的事实 下面的代码生成了一个表单,其目标设置为iFrame的名称,但在提交表单时,IE9仍会提示我“是否要打开或保存photo\u upload.json?”,而不是将其加载到iFrame中 var $iframe = $("<iframe id='" + id

我正在调试我们的文件上传脚本,它在不支持通过XMLHttpRequest对象发送文件数据的浏览器中使用隐藏的iframe

关于在IE中提交iframe有大量的文章和问题;(如,和),但他们都引用了IE不会为您正确设置“name”属性的事实

下面的代码生成了一个表单,其目标设置为iFrame的名称,但在提交表单时,IE9仍会提示我“是否要打开或保存photo\u upload.json?”,而不是将其加载到iFrame中

var $iframe = $("<iframe id='" + id + "' name='" + id + "' />");
$('body').append($iframe);

$iframe.load(function () {
  console.log("loaded");  // this never happens in IE9
});

// pretend this form also has a file input object that gets populated
var $form = $('<form />').attr({
  method: "post",
  enctype: "multipart/form-data",
  action: "/photo_upload.json",
  target: id
});

$('body').append($form);
$form.submit();  
当表单从iframe提交时,我会传递一个额外的参数,因此无论照片上传是AJAX请求还是隐藏的iframe,我都可以使用相同的服务器端函数

在后一种情况下,正如@Kolink所建议的,这将从iFrame中获取JSON:

$iframe.load(function () {
  json_string = iframe[0].contentDocument.body.innerHTML;
});

photo_upload.json
正在下载到iframe中,但由于浏览器不知道如何处理它,因此它假定它是一个要下载的文件


理想情况下,您应该让iframe接收HTML数据,其中可能包含一个
来告诉父窗口要做什么。或者,如果您在父级中已经有代码来处理接收响应(看起来您是这样做的),则在响应上设置
内容类型:text/html
,以强制浏览器将其视为html文档-它将自动添加基本内容,如
标记和
标记,所以只要访问iframe.contentDocument.body.innerHTML

就可以了!感谢您的清晰解释,非常感谢,我也很高兴能够真正理解它失败的原因。请注意,“文本/普通”的内容类型也可以,尽管IE会将内容包装在
标记中。
$iframe.load(function () {
  json_string = iframe[0].contentDocument.body.innerHTML;
});