Estou tentando criar um iframe a partir do JavaScript e preenchê-lo com HTML arbitrário, da seguinte forma:
var html = '<body>Foo</body>';
var iframe = document.createElement('iframe');
iframe.src = 'data:text/html;charset=utf-8,' + encodeURI(html);
Eu esperaria iframe
então conter uma janela e um documento válidos. No entanto, este não é o caso:
> console.log (iframe.contentWindow);
nulo
Experimente você mesmo: http://jsfiddle.net/TrevorBurnham/9k9Pe/
O que eu estou negligenciando?
javascript
iframe
Trevor Burnham
fonte
fonte
Respostas:
A configuração
src
de umiframe
javascript recém-criado não aciona o analisador HTML até que o elemento seja inserido no documento. O HTML é atualizado e o analisador de HTML será chamado e processará o atributo conforme o esperado.http://jsfiddle.net/9k9Pe/2/
Além disso, para responder à sua pergunta, é importante observar que essa abordagem tem problemas de compatibilidade com alguns navegadores. Consulte a resposta de @mschr para obter uma solução entre navegadores.
fonte
encodeURI(...)
não codifica todos os caracteres; portanto, se seu HTML tiver caracteres especiais como#
, isso será interrompido.encodeURIComponent(...)
codifica esses caracteres. Veja esta respostaEmbora você
src = encodeURI
deva funcionar, eu teria seguido um caminho diferente:Como isso não possui restrições no domínio x e é completamente feito por meio do
iframe
identificador, você pode acessar e manipular o conteúdo do quadro posteriormente. Tudo o que você precisa é ter certeza de que o conteúdo foi renderizado, o que (dependendo do tipo do navegador) será iniciado durante / após a emissão do comando .write - mas não será necessário quandoclose()
for chamado.Uma maneira 100% compatível de fazer um retorno de chamada pode ser esta abordagem:
O Iframes possui o evento onload, no entanto. Aqui está uma abordagem para acessar o html interno como DOM (js):
fonte
srcdoc
propriedade . Existe uma desvantagem nadocument.write
abordagem?document.body.appendChild(iframe)
é o necessário para que isso funcione.Obrigado pela sua ótima pergunta, isso me surpreendeu algumas vezes. Ao usar a fonte HTML dataURI, acho que preciso definir um documento HTML completo.
Veja abaixo um exemplo modificado.
anote o conteúdo html envolvido com
<html>
tags e aiframe.src
string.O elemento iframe precisa ser adicionado à árvore DOM para ser analisado.
Você não poderá inspecionar a
iframe.contentDocument
menos que estejadisable-web-security
no seu navegador. Você receberá uma mensagemfonte
Existe uma alternativa para criar um iframe cujo conteúdo seja uma sequência de HTML: o atributo srcdoc . Isso não é suportado em navegadores mais antigos (principalmente entre eles: Internet Explorer e, possivelmente, Safari ?), Mas há um polyfill para esse comportamento, que você pode colocar em comentários condicionais para o IE ou usar algo como has.js para obter uma condição preguiçosa. carregue-o.
fonte
Eu sei que essa é uma pergunta antiga, mas pensei em fornecer um exemplo usando o
srcdoc
atributo, pois agora isso é amplamente suportado e essa pergunta é vista com frequência.Usando o
srcdoc
atributo, você pode fornecer HTML embutido para incorporar. Ele substitui osrc
atributo, se suportado. O navegador retornará aosrc
atributo se não for suportado.Eu também recomendaria o uso do
sandbox
atributo para aplicar restrições extras ao conteúdo no quadro. Isso é especialmente importante se o HTML não for seu.Se você precisar oferecer suporte a navegadores mais antigos, poderá procurar
srcdoc
suporte e fallback para um dos outros métodos de outras respostas.fonte
A abordagem de URL funcionará apenas para pequenos relacionamentos de HTML. A abordagem mais sólida é gerar um URL de objeto a partir de um blob e usá-lo como fonte do iframe dinâmico.
fonte
Faça isso
getIframeWindow é definido aqui
fonte