Сцена : Я пишу встраиваемый виджет. Он принимает форму тега <script>
, который создает iframe, содержащий все, что нужно для отображения. У iframe нет src
, и скрипт записывает в него значение theIframe.contentWindow.document.write()
. Это удерживает содержащийся виджет и не позволяет идентификаторам элементов и сценариям конфликтовать со страницей, на которой встроен виджет.
Хитрость : виджет должен иметь возможность изменять свой размер. Для этого он устанавливает содержащий iframe style.height
. Для этого требуется доступ к DOM внешней страницы. В Firefox и IE это разрешено, поскольку считается, что документ iframe и внешний документ имеют общий источник.
Поворот : в Safari , однако, два документа считаются , а не для совместного использования источника. Внутренний документ считается about:blank
, тогда как внешний документ явно использует другой протокол и «домен» (если blank
можно считать доменом).
Вопрос : Как программно создать iframe, чей документ Safari / WebKit будет иметь тот же источник, что и документ создавшего его окна?
Редактировать : После дальнейших экспериментов я не могу найти способ программно создать iframe, местоположение которого не равно about:blank
, независимо от того, изменяю ли я его содержимое.
Если я создаю фрейм с document.createElement()
, присваиваем ему src
, который указывает на реальный ресурс HTML с тем же источником, называемым "foo.html", и document.body.appendChild()
, консоль Safari показывает элемент, как и ожидалось в DOM, но содержимое страницы не отображается, а документ отображается на боковой панели как «about: blank».
Если я включу HTML-код для iframe непосредственно на странице, появится содержимое foo.html
, а на боковой панели появится «foo.html».
Если я вставлю HTML с помощью document.write()
, я получу тот же результат, что и с document.body.appendChild()
.
Обе программные версии работают в Firefox.