Как мне создать iframe с тем же доменом, что и страница в Safari / WebKit

StackOverflow https://stackoverflow.com/questions/1059104

Вопрос

Сцена:Я пишу встраиваемый виджет.Это принимает форму <script> тег, который создает iframe, содержащий все, что ему нужно для отображения.iframe не имеет src, и скрипт записывает в него с theIframe.contentWindow.document.write().Это позволяет сохранить виджет включенным и предотвращает конфликт идентификаторов элементов и скрипта со страницей, на которую встроен виджет.

В чем хитрость:Виджет должен иметь возможность изменять свой размер.Чтобы сделать это, он устанавливает содержащий его iframe style.height.Для этого требуется доступ к DOM внешней страницы.В Firefox и IE, это разрешено, поскольку считается, что документ iframe и внешний документ имеют общий источник.

ПоворотСафари, однако эти два документа рассматриваются не чтобы поделиться источником.Считается, что внутренний документ находится на about:blank, в то время как внешний документ явно использует другой протокол и "домен" (если blank может считаться доменом).

Этот вопрос:Как я могу программно создать iframe, документ которого Safari / WebKit будет считать имеющим то же происхождение, что и документ окна, создающего его?


Редактировать:После дальнейших экспериментов я не могу найти способ программно создать iframe, местоположение которого не about:blank независимо от того, изменю ли я его содержимое.

Если я создам фрейм с document.createElement(), дайте ему src который указывает на реальный HTML-ресурс того же источника под названием "foo.html", и document.body.appendChild() консоль Safari отображает элемент, как и ожидалось в DOM, но содержимое страницы не отображается, а документ указан на боковой панели как "about: пустой".

Если я включу HTML для iframe непосредственно на страницу, содержимое foo.html появится, и "foo.html" появится на боковой панели.

Если я вставлю HTML с помощью document.write(), я получаю тот же результат , что и с document.body.appendChild().

Обе программные версии работают в Firefox.

Это было полезно?

Решение 2

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

theIframe.contentWindow.location = theIframe.src

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top