Actualmente estoy trabajando en un formulario que incluye algunas entradas de archivo para cargar imágenes. Hay un onchange()
evento para esas entradas que envía las imágenes a un iframe
, luego carga dinámicamente las imágenes cargadas en el formulario, con campos para ser modificados para ellos (como nombre y geolocalización ).
Como no puedo anidar formularios, file_input
también está contenido en un iframe
. Al final uso un iframe
interior de otro iframe
. Entonces tengo algo como esto:
<form>
<!-- LOTS OF FIELDS!! -->
<iframe src="file_input_url">
<!-- iframe which loads a page of a form with a file input-->
</iframe>
</form>
y el HTML cargado en iframe
es algo así como (excluyendo las etiquetas html
, head
y body
)
<form target="upload_iframe">
<input type="file" onchange="this.form.submit()">
</form>
<iframe name="upload_iframe"></iframe>
Esto funciona muy bien, excepto por el hecho de que toma un par de segundos cargar el primero iframe
, por lo que la entrada del archivo no se carga con el resto de la página. Esto no es visualmente ideal. Podría resolverlo si pudiera especificar el iframe
contenido sin necesidad de cargar otra página (especificada por file_input_url
en la primera iframe
).
¿Hay alguna forma de especificar el iframe
contenido en el mismo documento, o solo se puede especificar con el src
atributo, requiriendo la carga de otra página?
Respuestas:
Puede
.write()
el contenido en el documento iframe. Ejemplo:<iframe id="FileFrame" src="about:blank"></iframe> <script type="text/javascript"> var doc = document.getElementById('FileFrame').contentWindow.document; doc.open(); doc.write('<html><head><title></title></head><body>Hello world.</body></html>'); doc.close(); </script>
fuente
div
elemento oculto con su contenido y coloque su contenidoiframe
entre<body>
y</body>
.doc.write('<%= html.Replace("\\", "\\\\").Replace("'", "\\'") %>');
.iframe ahora admite srcdoc, que se puede usar para especificar el contenido HTML de la página para mostrar en el marco en línea.
fuente
Puede utilizar la
data:
URL ensrc
:var html = 'Hello from <img src="http://stackoverflow.com/favicon.ico" alt="SO">'; var iframe = document.querySelector('iframe'); iframe.src = 'data:text/html,' + encodeURIComponent(html);
<iframe></iframe>
Diferencia entre srcdoc = “…” y src = “data: text / html,…” en un iframe .
Convierta HTML a datos: enlace de texto / html usando JavaScript .
fuente
src
atributo se puede especificar en línea si se escapa, por ejemplo, usandorawurlencode
PHP:<iframe src="<?php echo htmlspecialchars('data:text/html,' . rawurlencode($content)); ?>"></iframe>
srcdoc
, ysrcdoc
es la mejor manera de hacerlo. Las URL de datos solo son ampliamente compatibles con imágenes y CSS; hasta donde yo sé, ninguna versión de Internet Explorer las admite en un iframe.En combinación con lo que describió Guffa, puede utilizar la técnica descrita en Explicación de <script type = "text / template"> ... </script> para almacenar el documento HTML en un
script
elemento especial (consulte el enlace para obtener una explicación sobre cómo funciona esto). Eso es mucho más fácil que almacenar el documento HTML en una cadena.fuente
<html>
,<body>
,<script>
sólo se confundirían el navegador, rompiendo la prestación del documento.<script>
el navegador ignoraría cualquier cosa dentro de una etiqueta. ¡Gracias por corregirme!