Версия Javascript внутри iframe в IE9 - PullRequest
2 голосов
/ 04 октября 2011

У меня есть веб-приложение, которое помещает веб-приложение Outlook в iframe. Это работает довольно хорошо в большинстве браузеров, но не работает в IE9 с ошибкой в ​​JavaScript внешнего вида:

SCRIPT438: Object doesn't support property or method '__defineGetter__' 
uglobal.js, line 1 character 975667

Кажется, что происходит то, что функция __defineGetter__ устарела и отсутствует в IE9, хотя большинство других браузеров ее поддерживают. Почтовое приложение обычно работает в стандартном режиме IE7 - если я открываю веб-почту самостоятельно и нажимаю F12 (средства разработки), я вижу Browser Mode: IE9, Document Mode: IE7 standards и проблем нет.

Однако, когда я запускаю приложение, в котором есть почта Outlook, в iframe, я вижу Browser Mode: IE9, Document Mode: IE9 standards. Это относится к внешнему сайту, и нет очевидного способа узнать, как iframe рендерится в IE9.

Источник фрейма имеет заголовки, которые я ожидал:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "ht`tp://www.w3.org/TR/html4/strict.dtd">

Похоже, что JavaScript внутри iframe работает так, как будто это не так в отношении версии. Конечно, он все еще изолирован, поэтому я не могу подключить эту функцию в соответствии с этим хаком .

Как заставить содержимое iframe запускать JavaScript в режиме IE7, в отличие от остальной части веб-сайта? Мы не хотим редактировать код внутри iframe? Мы не хотим этого делать, так как это просто веб-приложение со стандартным внешним видом. И если бы нам пришлось пойти туда, мы бы просто исправили их JavaScript, а не метаданные.

Ответы [ 3 ]

2 голосов
/ 06 октября 2011

Я отвечу на свой вопрос, основываясь на том, что мы знаем сегодня. По сути, мы попали в зловредное взаимодействие нескольких нежелательных функций.

1) Согласно этой записи , IE9 игнорирует тип документа для страниц внутри фреймов и вместо него всегда использует тип документа родительской страницы.

IE9 заставляет дочернюю страницу к тому же DOCTYPE, что и родительская страница. нет от того, что. ... Microsoft отвечает, что работает так, как задумано.

Я надеюсь, что кто-то может подтвердить или опровергнуть эту информацию, одно сообщение на форуме не так много, но оно соответствует тому, что мы видели.

2) Веб-приложение MS Outlook версии 2011 (версия: 14.1.287.0) несовместимо с Internet Explorer 9. Чтобы показать это, попробуйте следующее: найдите работающее веб-приложение Outlook например, http://mail.mycompany.com подключиться к нему с помощью IE9. Войдите в систему. Нажмите F12, чтобы вызвать инструменты разработчика. Обратите внимание, что в правом верхнем углу у вас есть «Режим документа: стандарты IE7». IE9 эмулирует IE7 для запуска сайта.

Вы можете изменить этот режим: щелкните по нему и выберите «Режим документа: стандарты IE9». Обратите внимание, что на вкладке «Консоль» теперь отображается вышеупомянутая ошибка, связанная с отсутствующим методом __defineGetter__, и что некоторые части веб-приложения не работают - щелкнув по сообщениям в списке или нажав кнопку ответа, теперь ничего не происходит.

Спасибо команде Outlook за то, что она не использует стандарты и не ориентируется на текущую версию вашего собственного браузера.

3) Метод __defineGetter__ не работает в IE9. Это устарело, и вместо него следует использовать defineProperty. Это достаточно справедливо, но __defineGetter__ все еще присутствует в текущих версиях Firefox и Chrome, и поэтому Outlook работает. В IE9 он отсутствует, если только IE9 не претендует на то, чтобы быть более старой версией IE.

2 голосов
/ 06 января 2012

Вы просто должны разместить эту мету на своей странице / главной странице:

<meta http-equiv="X-UA-Compatible" content="IE=8" />

Xam666

0 голосов
/ 04 октября 2011

Просмотрите это. Метатеги могут помочь

http://blogs.msdn.com/b/askie/archive/2009/03/23/understanding-compatibility-modes-in-internet-explorer-8.aspx

Документы предназначены для IE8. должны дать указатели и для IE9.

На веб-странице можно указать режим совместимости, используя метатег или отправив заголовок http. Мета-тег имеет приоритет над заголовком http, когда оба присутствуют.

1) META-тег - Вы можете разместить следующий HTML-тег в элементе HEAD вашей веб-страницы:

2) Заголовок HTTP - вы можете настроить свой сервер таким образом, чтобы с каждой страницы отправлялся следующий заголовок HTTP

X-UA-совместимый: IE = 7

...