Странное поведение атрибута iframe `name`, установленного jQuery в IE - PullRequest
10 голосов
/ 21 января 2010

Я делаю выгрузку файла в стиле 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", ...) не работает должным образом?
  • Это ошибка в jQuery, ошибка в IE (конечно, нет!?!) или я упускаю что-то очевидное?
  • Откуда берется атрибут submitName и какова его цель?

Ответы [ 4 ]

16 голосов
/ 21 января 2010

ошибка в IE (конечно, нет!?!)

Трудно поверить, я знаю, но мы здесь.

Исторически (*), установка атрибута name имеет много проблем в IE. Это имеет тенденцию только частично держать. Например, для имен полей формы это не влияет на поиск form.elements[name] так, как должно. Похоже, это еще один случай, когда установка свойства name ненадежна.

Хотя jQuery пытается обойти подобные ошибки браузера, он не улавливает все, и не существует известного способа его полного устранения.

(*: в IE до 7. Если вы запускаете IE8 в собственном DocumentMode, используя тип документа в стандартном режиме и, при необходимости, заголовок / мета, совместимые с X-UA, обе эти ошибки не возникают.)

submitName, появляющийся в инструментах разработки, представляет собой интересный проблеск за кулисами IE, поскольку он вообще не появляется в публично видимом DOM. Это делает то же самое, если вы посмотрите на элемент <input> или <form>, чей атрибут name также был записан после создания.

Похоже, что IE-до-7 перенаправляет все использование атрибутов, называемых name, в невидимое в противном случае свойство, внутренне называемое submitName, которое для полей формы изменяет данные, которые поле будет генерировать как часть отправки формы, но это не меняет действительный атрибут name, используемый для индексации HTMLCollection, радиогруппировки, getElementsByName или, в случае [i] кадров, нацеливания.

4 голосов
/ 14 июня 2011

создаем такой элемент

$("<iframe name='frameName' />")

решил проблему для меня

2 голосов
/ 20 августа 2010

Это не просто проблема jQuery, при ручной настройке это тоже случается.

Если вы используете метод setAttribute () для его установки, даже без jQuery, он делает то же самое, когда форма или iframe только что были созданы! Точно так же, используя innerHTML, вы можете это исправить ... да, еще раз, это Microsoft разрушает мой день: /

0 голосов
/ 21 января 2010

Вы видели улучшения создания разметки в jQuery 1.4?

Если вы нашли это противное, попробуйте это:

$('<iframe />',
{
   name: frameName,
   src: 'about:blank'
}).appendTo("body");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...