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

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

IE, похоже, не разрешает доступ к пустым/динамическим iframes после того, как свойство 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 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:"" не удалась.

Ответ 1

Вы счастливы изменить домен 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 на странице, вам нужно разделить закрывающий тег </script> вверх. См. why-split-the-script-tag

Ответ 2

Я всегда работал над такими проблемами, устанавливая iframe src в пустой файл, который живет в том же домене, что и родительский домен. Если возможно создать такой файл на 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>

Ответ 3

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

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

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

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

http://softwareas.com/cross-domain-communication-with-iframes