Я делаю закачку файла стиля ajax, публикуя файл в форме к iframe и заметил некоторое странное поведение в IE (кажется, происходит в оба 6 & 8). В основном в IE форма не делает target
iframe правильно так ответ появляется в новом окне (вместо в iframe). Вы можете воспроизвести проблему со следующим минимальным набором HTML/JS:
<html>
<head>
<script src="http://code.jquery.com/jquery-1.3.2.js"></script>
<script>
$(document).ready(function(){
var frameName = "myFrame";
var $iframe = $("<iframe src=\"about:blank\" />")
.attr("name", frameName)
.appendTo("body");
var $uploadForm = $("<form action=\"http://www.google.com/search\" />")
.attr("target", frameName)
.append("<input type=\"text\" name=\"q\" />")
.append("<input type=\"submit\" />")
.appendTo("body");
});
</script>
</head>
<body>
</body>
</html>
Теперь (прежде чем Вы опубликуете ответ), я сделал некоторое расследование (использующий инструменты разработчика IE8), и кажется что .attr("name", frameName)
на самом деле добавляет признак как submitName="myFrame"
вместо просто name="myFrame"
. На основе этого я решил проблему, изменив iframe кодекс создания на немного более противное:
var $iframe = $("<iframe src=\"about:blank\" name=\"" + frameName + "\" />")
.appendTo("body");
Внесение этого изменения превращает почту формы в iframe, как желаемый.
Мои вопросы:
.attr("name", ...)
работа как ожидалось?submitName
признак прибывает из & какова его цель?ошибка в IE (конечно, нет!?!)
Трудно поверить, я знаю, но вот мы.
Исторически (*),установка атрибута name
вызывает много проблем в IE. Он имеет тенденцию держаться только частично. Например, для имен полей формы это не влияет на поиск form.elements [name]
, как должно. Похоже, это еще один случай, когда установка свойства name
ненадежна.
Хотя jQuery пытается обойти подобные ошибки браузера, он не улавливает все, и нет известного способа решить эту проблему полностью.
(*: в IE до 7. Если вы запускаете IE8 в собственном режиме documentMode с использованием стандартного режима doctype и, если необходимо, заголовка / мета X-UA-Compatible, обе эти ошибки не возникают.)
submitName
, появляющееся в инструментах разработчика, представляет собой интересную возможность заглянуть за кулисы ошибки IE, поскольку она вообще не отображается в общедоступной DOM. То же самое происходит при просмотре элемента
или
, атрибут name
которого также был записан после создания.
Таким образом, похоже, что происходит то, что IE-up-to-7 перенаправляет все использование атрибутов с именем name
на невидимое в противном случае свойство с внутренним именем submitName
, которое для поля формы изменяют данные, которые поле будет генерировать как часть отправки формы, но не меняет реальный атрибут name
, используемый для индексации HTMLCollection, радио-группировки, getElementsByName или, в случае [ i] кадры, прицеливание.
Вы видели улучшения создания разметки в jQuery 1.4?
, если вы обнаружите, что Противно, попробуй это:
$('<iframe />',
{
name: frameName,
src: 'about:blank'
}).appendTo("body");
Это не просто проблема jQuery, при настройке вручную она тоже случается.
Если для его установки используется метод setAttribute (), даже без jQuery, он делает то же самое, когда форма или iframe только что были созданы! Таким же образом, используя innerHTML, вы можете исправить это ... да, еще раз, это Microsoft разрушает мой день: /