IE9提示用户提交隐藏的iFrame

gog*_*n13 9 javascript iframe jquery

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

关于在IE中提交iframe的文章和问题过多; (比如这篇文章这篇文章),但他们都引用了IE不能为你正确设置'name'属性这一事实.

下面的代码生成一个表单,其目标设置为iFrame的名称,但在提交表单时,IE9仍然提示我"你想打开还是保存photo_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();  
Run Code Online (Sandbox Code Playgroud)

此代码适用于FF和Chrome,但在IE9中,系统会提示您打开或保存" photo_upload.json ".如果我打开文件,IE9获得的响应是​​准确的.

有没有人有任何见解?是否有任何我缺少的iframe提交要通过?我是否需要设置某种标题来告诉IE不要这样打开它?谢谢!

解:

感谢@Kolink为我解决了这个问题的代码.

Rails服务器端代码,在photo_upload函数中:

if params[:from_iframe]
  render :json => @temp_photo, :content_type => "text/html"
else
  render :json => @temp_photo
end
Run Code Online (Sandbox Code Playgroud)

我从iframe提交表单时传递了一个额外的参数,因此无论照片上传是AJAX请求还是隐藏的iFrame,我都可以使用相同的服务器端功能.

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

$iframe.load(function () {
  json_string = iframe[0].contentDocument.body.innerHTML;
});
Run Code Online (Sandbox Code Playgroud)

Nie*_*sol 10

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

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