Не удается получить доступ к о: пустому iframe в IE после изменения document.domain

Кто-нибудь знает обходные пути для создания about:blank iframe на странице в IE, когда document.domain изменился?

IE, похоже, не разрешает доступ к пустым/динамическим фреймам после изменения свойства document.domain.

Например, представьте, что вы динамически создаете iframe, а затем вставляете в него некоторый HTML-код:

// Somewhere else, some 3rd party code changes the domain 
// from something.foo.com to foo.com 
document.domain = 'jshell.net';

var iframe = document.createElement('iframe');
document.body.appendChild(iframe);

// In IE, we can't access the iframe's contentWindow! Access is denied.
iframe.contentWindow.document.body.style.backgroundColor = 'red';

Вот живой пример jsfiddle: http://jsfiddle.net/XHkUT/

Вы заметите, что он отлично работает в FF/Webkit, но не в IE. Это особенно неприятно, потому что это влияет на iframe, созданные после изменения свойства document.domain (как в приведенном выше примере).

Правило IE выглядит следующим образом: «Если вы создадите динамический/пустой iframe после изменения document.domain, вы не сможете получить доступ к его DOM».

Установка iframe src на about:blank javascript:void(0) или javascript:"" не удалась.


person smithclay    schedule 05.02.2013    source источник
comment
Протокол about: может быть ограничен в зависимости от настроек/версии IE: msdn.microsoft.com/en-us/library/ee330729(v=vs.85).aspx (см. главу «Об ограничении протокола»)   -  person Simon Mourier    schedule 08.02.2013
comment
Примечание. Похоже, что эта ошибка исправлена ​​в IE11.   -  person EricLaw    schedule 13.05.2014


Ответы (3)


Вы рады изменить домен iframe на? Следующие работы (для меня) в IE7,9

document.domain = 'jshell.net';

var iframe = document.createElement('iframe');
document.body.appendChild(iframe);
iframe.src = "javascript:document.write('<script>document.domain=\"jshell.net\"</script>')";

// Now write some content to the iframe
iframe.contentWindow.document.write('<html><body><p>Hello world</p></body></html>');

Редактировать: если это встроенный скрипт на странице, вам нужно разделить закрывающий тег </script>. См. why-split-the-script-tag

person Sean Hogan    schedule 14.02.2013
comment
Это работает, спасибо. Он также хорошо работает в FF/Webkit. Однако вам нужно разбить теги <script> в строке src: jsfiddle.net/gHxjL/4< /а> - person smithclay; 15.02.2013
comment
Да, вам нужно будет разделить закрывающий тег скрипта, если код является встроенным скриптом на странице. Я обновил ответ. - person Sean Hogan; 15.02.2013
comment
К сожалению, логнормального больше нет. Ссылка на Archive.org: https://web.archive.org/web/20130308235154/http://www.lognormal.com/blog/2012/12/12/the-script-loader-pattern/ См. раздел "Междоменные проблемы" внизу. - person EricLaw; 13.05.2014

Я всегда обходил такие проблемы, устанавливая src iframe в пустой файл, который находится в том же домене, что и родительский домен. Если возможно создать такой файл на jshell.net, я бы порекомендовал что-то вроде:

var iframe = document.createElement('iframe');
iframe.src = 'http://jshell.net/blank.html';
document.body.appendChild(iframe);

Где blank.html просто содержит небольшой шаблон, например:

<html><head><title>about:blank</title><head><body></body></html>
person wxactly    schedule 11.02.2013
comment
К сожалению, нет доступа для записи к домену, на котором размещен скрипт (сам код Javascript — это виджет, который нужно запускать везде). - person smithclay; 12.02.2013

Если iframe.src и document.location находятся в разных доменах (или поддоменах), у вас по определению нет доступа от родителя к дочернему. Однако у вас есть доступ от дочернего к родительскому. Один из методов, используемых при загрузке междоменного JavaScript, заключается в использовании того факта, что iframe может вызывать метод в окне контейнера при загрузке.

Только если два документа находятся в разных поддоменах, вы можете настроить document.domain так, чтобы он соответствовал домену iframe.src, чтобы разрешить доступ.

Подробнее о политике одинакового происхождения читайте здесь:

http://en.wikipedia.org/wiki/Same_origin_policy

http://softwareas.com/кросс-доменная-коммуникация-с-iframes

person jornare    schedule 14.02.2013