Невозможно получить доступ к следующему: 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