IE9 выдает исключения при загрузке скриптов в iframe. Почему?

Предварительное условие:

У меня есть aspx-страница с iframe внутри. Этот iframe указывает на URL-адрес, обрабатываемый MVC на том же сайте (это гибридный сайт, как стандартный ASP.NET, так и ASP.NET MVC). Результирующая страница, отображаемая MVC, содержит множество ссылок на скрипты.

Проблема:

IE9 выдает исключение для каждого скрипта, загружаемого в iframe. Эти исключения похожи на это:

Error: 'Function' is undefined

То есть он говорит, что самые основные вещи, которые есть в каждом окне, почему-то отсутствуют. После того, как вы щелкнули по всем этим всплывающим окнам, страница будет работать так, как задумано!
Если я загружу URL-адрес из атрибута <iframe /> src в браузере напрямую, все будет работать, как ожидалось.
Если я открою страницу в другом браузере ( Пробовал Opera, Firefox) все работает как положено - ошибок нет.

Итак, чего хочет IE9?


person Eugene Strizhok    schedule 05.12.2011    source источник
comment
Независимо от того, что хочет IE9, этого не будет, судя по тому факту, что мы хотим кода и точных сообщений об ошибках.   -  person Jon    schedule 05.12.2011
comment
Функция не имеет заглавной буквы F в JavaScript. Это проблема?   -  person Diodeus - James MacFarlane    schedule 05.12.2011
comment
Нет. Глобальный объект функции   -  person Eugene Strizhok    schedule 06.12.2011
comment
@Jon Это IE жалуется на отсутствующий «родной» объект. Уменьшить корпус очень сложно. Я знаю, потому что был там.   -  person Stijn de Witt    schedule 30.12.2011
comment
@Diodeus Как говорит Юджин, речь идет не о ключевом слове function, а о глобальном объекте Function. Есть разница. Это также затрудняет поиск по этой теме, поскольку в Google и др. Регистр не учитывается.   -  person Stijn de Witt    schedule 30.12.2011
comment
Интересно, почему нет моего собственного ответа, где описано, что это был случай iframe и UpdatePanel, перемещающего его?   -  person Eugene Strizhok    schedule 03.02.2012


Ответы (6)


Об этой ошибке есть эта страница msdn (или особенность).

Подобные ошибки возникают при перемещении элемента iframe в DOM. В таких случаях мусор IE 9 собирает iframe (вызывая вашу неопределенную ошибку) и перезагружает его в другой позиции.

В общем, вы должны создать элемент, установить его атрибут src только один раз, а затем поместить его где-нибудь в дереве DOM один раз. Это не имеет ничего общего с кодом, который выполняется в самом iframe.

person copy    schedule 31.12.2011
comment
+1 - У меня была именно эта проблема не пять часов назад, и единственное, что я изменил между работающим и неработающим, - это небольшой код, который перемещал фреймы в DOM. Удаление этого фрагмента кода устранило проблему (и я использовал z-index для получения того же эффекта). - person Niet the Dark Absol; 31.12.2011
comment
аналогичный ответ найден в этом сообщении: stackoverflow.com/questions/5514973/ - person ERR0; 06.01.2012
comment
Я был в отпуске, поэтому не мог ответить раньше, но, похоже, это связано. Однако в затронутых областях говорится, что это было изменено с IE8 на IE9, но я также видел недостающее поведение API в IE8 ... Все еще поздравляю с бонусными баллами! :) - person Stijn de Witt; 09.01.2012
comment
Если вы используете Knockout, переместите ‹iframe› за пределы каких-либо элементов с привязкой к данным. - person Grinn; 29.10.2012

Я столкнулся с такой же ситуацией в дикой природе. Основные симптомы:

  • Вы загружаете код скрипта в iframe
  • Код скрипта запускается рано (из раздела головы или верхней части тела)
  • IE жалуется на какой-то отсутствующий родной объект

Я обнаружил, что этого часто можно предотвратить, отложив выполнение кода сценария до загрузки или загрузки DOMContentLoaded ... Я не знаю особой помощи, но это одна из самых сложных ошибок сценариев IE, с которыми я когда-либо сталкивался. Я повысил оценку вашего вопроса, надеюсь, что его найдут и другие, и мы сможем получить более подробный ответ.

Также см. Этот вопрос: Ошибка в Internet Explorer 9 (не в более ранних версиях и других браузерах) при включении jQuery в iframe

person Stijn de Witt    schedule 30.12.2011

Размещение следующего блока сценария в самом верху iFrame html ‹head›, похоже, решает проблему в моем случае. По сути, он заставляет iframe перезагружаться, что, как отметили некоторые, решает проблему. Это кажется относительно безопасным, потому что без таких вещей, как «Объект» и «Дата», javascript по сути бесполезен.

<script type="text/javascript">
    if(typeof(Object)==="undefined"){
        window.location.reload();
    }
</script>
person Scott Paradis    schedule 28.03.2012

Попробуйте загрузить javascript в конце после загрузки всей веб-страницы. Я чувствую, что скрипт выполняется еще до полной загрузки iframe.

для предложения сценариев в IE9 просмотрите приведенную ниже ссылку http://blogs.msdn.com/b/ie/archive/2010/06/25/enhanced-scripting-in-ie9-ecmascript-5-support-and-more.aspx

person Jayprakash S T    schedule 05.01.2012

Дальнейшее расследование показало, что решение состоит в том, чтобы добавить оскорбительный iframe в его местоположение ДО того, как устанавливать атрибут src.

После установки 'src' изменение местоположения iframe в стеке DOM вынуждает IE9 собирать его мусор.

После установки 'src' размер iframe можно изменять с помощью позиционирования css, но не может изменять относительное расположение в стеке DOM.

Часто плагины, такие как диалоги и лайтбоксы, заполняют iframe с src, уже установленным в dom, затем добавляют / добавляют или что-то еще, запуская сборщик мусора.

person Scott Paradis    schedule 05.04.2012

person    schedule
comment
Как это вообще отвечает на вопрос? Это даже не относится к вопросу - person JoseM; 22.01.2015