Atualmente estou trabalhando em um formulário que inclui algumas entradas de arquivo para fazer upload de fotos. Há um onchange()
evento para essas entradas que enviam as imagens para um e iframe
, em seguida, carregam dinamicamente as imagens carregadas no formulário, com campos a serem modificados para elas (como nome e geolocalização ).
Como não consigo aninhar formulários, o file_input
também está contido em um iframe
. No final, uso um iframe
dentro do outro iframe
. Então, eu tenho algo assim:
<form>
<!-- LOTS OF FIELDS!! -->
<iframe src="file_input_url">
<!-- iframe which loads a page of a form with a file input-->
</iframe>
</form>
eo HTML carregado no iframe
é algo como (excluindo o html
, head
e body
etiquetas)
<form target="upload_iframe">
<input type="file" onchange="this.form.submit()">
</form>
<iframe name="upload_iframe"></iframe>
Isso funciona muito bem, exceto pelo fato de que leva alguns segundos para carregar o primeiro iframe
, de modo que a entrada do arquivo não carrega com o resto da página. Isso não é visualmente ideal. Eu poderia resolver isso se pudesse especificar o iframe
conteúdo sem precisar carregar outra página (especificada por file_input_url
no primeiro iframe
).
Existe uma maneira de especificar o iframe
conteúdo no mesmo documento, ou ele só pode ser especificado com o src
atributo, exigindo o carregamento de outra página?
Respostas:
Você pode
.write()
inserir o conteúdo no documento iframe. Exemplo:<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>
fonte
div
elemento oculto com seu conteúdo e coloque seu conteúdoiframe
entre<body>
e</body>
.doc.write('<%= html.Replace("\\", "\\\\").Replace("'", "\\'") %>');
.O iframe agora oferece suporte a srcdoc, que pode ser usado para especificar o conteúdo HTML da página a ser exibida no quadro embutido.
fonte
Você pode usar o
data:
URL nosrc
: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>
Diferença entre srcdoc = “…” e src = “data: text / html,…” em um iframe .
Converter HTML em dados: link de texto / html usando JavaScript .
fonte
src
atributo pode ser especificado inline se escapado, por exemplo, usandorawurlencode
em PHP:<iframe src="<?php echo htmlspecialchars('data:text/html,' . rawurlencode($content)); ?>"></iframe>
srcdoc
, esrcdoc
é a melhor maneira de fazer isso. URLs de dados são amplamente suportados apenas para imagens e CSS - pelo que eu sei, nenhuma versão do Internet Explorer oferece suporte para eles em um iframe.Em combinação com o que Guffa descreveu, você poderia usar a técnica descrita em Explicação de <script type = "text / template"> ... </script> para armazenar o documento HTML em um
script
elemento especial (veja o link para uma explicação sobre como isso funciona). Isso é muito mais fácil do que armazenar o documento HTML em uma string.fonte
<html>
,<body>
,<script>
só iria confundir o navegador, quebrando a prestação do documento.<script>
tag seria ignorada pelo navegador. Obrigado por me corrigir!