IE9 предлагает пользователю ввести скрытый фрейм - PullRequest
9 голосов
/ 10 февраля 2012

Я отлаживаю наш скрипт выгрузки файлов, который использует скрытый iframe в браузерах, которые не поддерживают отправку данных файлов через объект XMLHttpRequest.

Существует множество статей и вопросов по отправке iframe в IE; (например, этот пост и этот пост ), но все они ссылаются на тот факт, что 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();  

Этот код работает в 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

Я передаю дополнительный параметр при отправке формы из iframe, поэтому я могу использовать одну и ту же функцию на стороне сервера, независимо от того, является ли загрузка фотографий запросом AJAX или скрытым iFrame.

В последнем случае, как рекомендует @Kolink, это позволит получить JSON из iFrame:

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

1 Ответ

10 голосов
/ 10 февраля 2012

photo_upload.json загружается в iframe, но поскольку браузер не знает, что с ним делать, он предполагает, что это файл для загрузки.

В идеале у вас должен быть iframeполучить данные HTML, которые могут содержать <script>, чтобы сообщить родительскому окну, что делать.В качестве альтернативы, если у вас уже есть код в родительском элементе для обработки получения ответа (который выглядит так, как вы), установите Content-Type: text/html в ответе, чтобы браузер воспринимал его как HTML-документ - он автоматически добавит такие основы, кактег <html> и тег <body>, поэтому просто получите доступ к iframe.contentDocument.body.innerHTML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...