Я пытаюсь создать iframe из JavaScript и заполнить его произвольным HTML, вот так:
var html = '<body>Foo</body>';
var iframe = document.createElement('iframe');
iframe.src = 'data:text/html;charset=utf-8,' + encodeURI(html);
Я ожидал iframe
бы тогда содержать действительное окно и документ. Однако это не так:
> console.log (iframe.contentWindow);
ноль
Попробуйте сами: http://jsfiddle.net/TrevorBurnham/9k9Pe/
Что я пропускаю?
javascript
iframe
Тревор Бернхэм
источник
источник
Ответы:
Установка
src
вновь созданногоiframe
в javascript не запускает анализатор HTML, пока элемент не будет вставлен в документ. Затем HTML обновляется, и HTML-анализатор будет вызываться и обрабатывать атрибут, как ожидается.http://jsfiddle.net/9k9Pe/2/
Также ответьте на свой вопрос. Важно отметить, что у этого подхода есть проблемы с совместимостью с некоторыми браузерами, пожалуйста, смотрите ответ @mschr для кросс-браузерного решения.
источник
encodeURI(...)
кодирование не всех символов, поэтому, если ваш HTML имеет специальные символы, такие как#
, это сломается.encodeURIComponent(...)
кодирует эти символы. Смотрите этот ответНесмотря на то, что вы
src = encodeURI
должны работать, я бы пошел другим путем:Поскольку это не имеет ограничений по x-домену и полностью выполняется через
iframe
дескриптор, вы можете получить доступ к содержимому фрейма и манипулировать им позже. Все, что вам нужно, это убедиться, что содержимое было визуализировано, и оно (в зависимости от типа браузера) запустится во время / после того, как будет выполнена команда .write, но не обязательно приclose()
вызове.100% совместимый способ сделать обратный вызов может быть таким подходом:
Однако у Iframes есть событие onload. Вот подход для доступа к внутреннему html как DOM (js):
источник
srcdoc
свойство . Есть ли обратная сторонаdocument.write
подхода?document.body.appendChild(iframe)
для этого нужно работать.Спасибо за ваш замечательный вопрос, это меня несколько раз застало. При использовании источника HTML dataURI я обнаружил, что должен определить полный HTML-документ.
Смотрите ниже модифицированный пример.
обратите внимание на HTML-содержимое, обернутое
<html>
тегами иiframe.src
строкой.Элемент iframe необходимо добавить в дерево DOM для анализа.
Вы не сможете проверить,
iframe.contentDocument
если вы неdisable-web-security
в вашем браузере. Вы получите сообщениеисточник
Существует альтернатива для создания iframe, содержимое которого представляет собой строку HTML: атрибут srcdoc . Это не поддерживается в старых браузерах (главный из них: Internet Explorer и, возможно, Safari ?), Но для этого поведения есть поли-заливка , которую вы можете поместить в условные комментарии для IE или использовать что-то вроде has.js для условно ленивых загрузить его.
источник
Я знаю, что это старый вопрос, но я подумал, что приведу пример с использованием
srcdoc
атрибута, поскольку сейчас он широко поддерживается, и этот вопрос часто рассматривается.Используя
srcdoc
атрибут, вы можете предоставить встроенный HTML для встраивания. Он переопределяетsrc
атрибут, если поддерживается. Браузер вернется кsrc
атрибуту, если не поддерживается.Я также рекомендовал бы использовать
sandbox
атрибут, чтобы применить дополнительные ограничения к содержимому во фрейме. Это особенно важно, если HTML не ваш собственный.Если вам нужна поддержка более старых браузеров, вы можете проверить
srcdoc
поддержку и использовать один из других методов из других ответов.источник
URL-подход будет работать только для небольших HTML-фреймворков. Более надежный подход заключается в создании URL объекта из большого двоичного объекта и его использовании в качестве источника динамического iframe.
источник
Сделай это
getIframeWindow определяется здесь
источник