Estoy tratando de crear un iframe desde JavaScript y llenarlo con HTML arbitrario, así:
var html = '<body>Foo</body>';
var iframe = document.createElement('iframe');
iframe.src = 'data:text/html;charset=utf-8,' + encodeURI(html);
Esperaría iframe
contener una ventana y un documento válidos. Sin embargo, este no es el caso:
> console.log (iframe.contentWindow);
nulo
Pruébelo usted mismo: http://jsfiddle.net/TrevorBurnham/9k9Pe/
¿Qué estoy pasando por alto?
javascript
iframe
Trevor Burnham
fuente
fuente
Respuestas:
La configuración
src
de un recién creadoiframe
en javascript no activa el analizador HTML hasta que el elemento se inserte en el documento. El HTML se actualiza y se invoca el analizador HTML y procesa el atributo como se esperaba.http://jsfiddle.net/9k9Pe/2/
Además, para responder a su pregunta, es importante tener en cuenta que este enfoque tiene problemas de compatibilidad con algunos navegadores, consulte la respuesta de @mschr para obtener una solución de navegador cruzado.
fuente
encodeURI(...)
no codifica todos los caracteres, por lo que si su HTML tiene caracteres especiales como#
, esto se romperá.encodeURIComponent(...)
codifica estos caracteres. Ver esta respuestaA pesar de que tu
src = encodeURI
deberías funcionar, yo habría tomado un camino diferente:Como esto no tiene restricciones de dominio x y se realiza completamente a través del
iframe
controlador, puede acceder y manipular el contenido del marco más adelante. Todo lo que debe asegurarse es que los contenidos se hayan procesado, lo que (según el tipo de navegador) comenzará durante / después de que se emita el comando .write, pero no necesariamente cuandoclose()
se llama.Una forma 100% compatible de hacer una devolución de llamada podría ser este enfoque:
Iframes tiene el evento onload, sin embargo. Aquí hay un enfoque para acceder al html interno como DOM (js):
fuente
srcdoc
propiedad . ¿Hay un inconveniente en eldocument.write
enfoque?document.body.appendChild(iframe)
se requiera para que esto funcione.Gracias por tu gran pregunta, esto me ha pillado varias veces. Cuando uso la fuente HTML dataURI, encuentro que tengo que definir un documento HTML completo.
Vea a continuación un ejemplo modificado.
tome nota del contenido html envuelto con
<html>
etiquetas y laiframe.src
cadena.El elemento iframe debe agregarse al árbol DOM para analizarse.
No podrá inspeccionar a
iframe.contentDocument
menos que estédisable-web-security
en su navegador. Recibirás un mensajefuente
Existe una alternativa para crear un iframe cuyo contenido es una cadena de HTML: el atributo srcdoc . Esto no es compatible con navegadores antiguos (el principal de ellos: ¿ Internet Explorer y posiblemente Safari ?), Pero hay un polyfill para este comportamiento, que podría poner en comentarios condicionales para IE, o usar algo como has.js para condicionalmente perezoso cárgalo.
fuente
Sé que esta es una pregunta antigua, pero pensé que proporcionaría un ejemplo usando el
srcdoc
atributo, ya que ahora es ampliamente compatible y esta pregunta se ve a menudo.Usando el
srcdoc
atributo, puede proporcionar HTML en línea para incrustar. Anula elsrc
atributo si es compatible. El navegador volverá alsrc
atributo si no es compatible.También recomendaría usar el
sandbox
atributo para aplicar restricciones adicionales al contenido en el marco. Esto es especialmente importante si el HTML no es tuyo.Si necesita admitir navegadores antiguos, puede buscar
srcdoc
asistencia y recurrir a uno de los otros métodos a partir de otras respuestas.fuente
El enfoque de URL solo funcionará para pequeños fragmentos HTML. El enfoque más sólido es generar una URL de objeto a partir de un blob y usarlo como fuente del iframe dinámico.
fuente
Hacer esto
getIframeWindow se define aquí
fuente