Как создать iframe с тем же доменом, что и страница в Safari / WebKit - PullRequest
3 голосов
/ 29 июня 2009

Сцена : Я пишу встраиваемый виджет. Он принимает форму тега <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.

Ответы [ 2 ]

1 голос
/ 29 июня 2009

Лучшее предложение, которое я мог бы дать, - установить на этом же сервере пустую страницу iframe (то есть blank.html), а затем отредактировать содержимое. Боли в тылу, я знаю, но это обходной путь.

Вы также можете попробовать

iframe.contentDocument.open("replace");
iframe.contentDocument.write("<b>This is some content</b>");
iframe.contentDocument.close();

Однако я не уверен, что это работает только в IE. Извините, я не мог быть более полезным, чем это.

0 голосов
/ 29 июня 2009

Aha. Кажется, это ошибка в WebKit. Когда iframe создается программно, его атрибут src игнорируется. Вместо этого фрейм по умолчанию about:blank и должен быть направлен на URL-адрес, чтобы указывать в другом месте. Например:

theIframe.contentWindow.location = theIframe.src
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...