Как мне создать iframe с тем же доменом, что и страница в Safari / WebKit
-
21-08-2019 - |
Вопрос
Сцена:Я пишу встраиваемый виджет.Это принимает форму <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.Извините, что я не смог быть более полезным, чем это.