Eu preciso de uma solução para auto-ajuste do width
e height
de um iframe
a mal cabem seu conteúdo. O ponto é que a largura e a altura podem ser alteradas após o iframe
carregamento. Acho que preciso de uma ação de evento para lidar com a alteração nas dimensões do corpo contida no iframe.
javascript
html
iframe
adjustment
Coração de pedra
fonte
fonte
Respostas:
fonte
DOMContentLoaded
, já queDOMContentReady
não parece ser uma coisa: developer.mozilla.org/en-US/...Plug-in jQuery entre navegadores .
Biblioteca cross-bowser, entre domínios usada
mutationObserver
para manter o tamanho do iFrame no conteúdo epostMessage
para se comunicar entre o iFrame e a página do host. Funciona com ou sem jQuery.fonte
Todas as soluções fornecidas até agora representam apenas um redimensionamento único. Você mencionou que deseja redimensionar o iFrame após a modificação do conteúdo. Para fazer isso, é necessário executar uma função dentro do iFrame (depois que o conteúdo for alterado, você precisará disparar um evento para dizer que o conteúdo foi alterado).
Fiquei preso por um tempo, pois o código dentro do iFrame parecia limitado ao DOM dentro do iFrame (e não conseguia editar o iFrame), e o código executado fora do iFrame estava preso ao DOM fora do iFrame (e não podia ' (pegue um evento vindo de dentro do iFrame).
A solução veio da descoberta (via assistência de um colega) de que o jQuery pode saber qual DOM usar. Nesse caso, o DOM da janela pai.
Assim, um código como esse faz o que você precisa (quando executado dentro do iFrame):
fonte
jQuery("#IDofControlFiringResizeEvent").click(function ()
?solução de uma linha para incorporações: começa com um tamanho mínimo e aumenta para o tamanho do conteúdo. não há necessidade de tags de script.
fonte
scrollHeight/scrollWidth
devem ser um pouco ajustadas para levar em conta as margens do corpo. Os navegadores aplicam margens padrão diferentes de zero para o elemento do corpo dos documentos (e também é aplicável ao conteúdo carregado nos quadros). A solução de trabalho que encontrei é para adicionar o seguinte:parseInt(window.getComputedStyle(this.contentDocument.body).margin
.Se o conteúdo do iframe for do mesmo domínio, isso deve funcionar muito bem. Requer jQuery embora.
Para redimensionar dinamicamente, você pode fazer o seguinte:
Em seguida, na página que o iframe carrega, adicione isto:
fonte
Aqui está uma solução entre navegadores, se você não quiser usar o jQuery:
fonte
Depois de ter tentado tudo na terra, isso realmente funciona para mim.
index.html
fonte
Estou usando esse código para ajustar automaticamente a altura de todos os iframes (com a classe autoHeight) quando eles são carregados na página. Testado e funciona no IE, FF, Chrome, Safari e Opera.
fonte
Esta é uma solução à prova de sólidos
o html
fonte
Modifiquei levemente a ótima solução de Garnaph acima. Parecia que sua solução modificou o tamanho do iframe com base no tamanho imediatamente antes do evento. Para minha situação (envio de e-mail por meio de um iframe), era necessário alterar a altura do iframe logo após o envio. Por exemplo, mostre erros de validação ou mensagem de "agradecimento" após o envio.
Acabei de eliminar a função click () aninhada e a coloquei no meu iframe html:
Funcionou para mim, mas não tenho certeza sobre a funcionalidade entre navegadores.
fonte
Se você pode controlar o conteúdo IFRAME e a janela pai, precisará do iFrame Resizer .
Essa biblioteca permite o redimensionamento automático da altura e largura dos iFrames iguais e de domínio cruzado para ajustar-se ao conteúdo contido. Ele fornece uma variedade de recursos para solucionar os problemas mais comuns do uso de iFrames, incluindo:
fonte
nem tudo pode funcionar usando os métodos acima.
javascript:
html:
Env: IE 10, Windows 7 x64
fonte
Eu descobri outra solução depois de algumas experiências. Inicialmente, tentei o código marcado como 'melhor resposta' para esta pergunta e não funcionou. Meu palpite é que meu iframe no meu programa na época foi gerado dinamicamente. Aqui está o código que usei (funcionou para mim):
Javascript dentro do iframe que está sendo carregado:
Aqui está o html para o iframe:
Aqui está todo o código dentro do meu iframe:
Eu fiz testes no chrome e um pouco no firefox (no windows xp). Ainda tenho mais testes para fazer, então, diga-me como isso funciona para você.
fonte
É assim que eu faria (testado no FF / Chrome):
fonte
Aqui estão vários métodos:
E OUTRA ALTERNATIVA
PARA OCULTAR A ROLAGEM COM 2 ALTERNATIVAS mostradas acima
HACK COM SEGUNDO CÓDIGO
Para ocultar as barras de rolagem do iFrame, o pai é feito "overflow: hidden" para ocultar as barras de rolagem e o iFrame é feito para ir até 150% de largura e altura, o que força as barras de rolagem fora da página e, como o corpo não Para ter barras de rolagem, não se pode esperar que o iframe exceda os limites da página. Isso oculta as barras de rolagem do iFrame com largura total!
fonte: defina a altura automática do iframe
fonte
No caso de alguém chegar aqui: tive um problema com as soluções quando removi divs do iframe - o iframe não ficou mais curto.
Há um plugin Jquery que faz o trabalho:
http://www.jqueryscript.net/layout/jQuery-Plugin-For-Auto-Resizing-iFrame-iFrame-Resizer.html
fonte
Encontrei este redimensionador para funcionar melhor:
Observe que o objeto de estilo foi removido.
fonte
No jQuery, esta é a melhor opção para mim, que realmente me ajuda! Espero que te ajude!
iframe
jQuery
fonte
Contexto
Eu mesmo tive que fazer isso no contexto de uma extensão da web. Essa extensão da Web injeta parte da interface do usuário em cada página, e essa interface fica dentro de uma
iframe
. O conteúdo dentro doiframe
é dinâmico, então tive que reajustar a largura e a altura doiframe
próprio.Uso React, mas o conceito se aplica a todas as bibliotecas.
Minha solução (isso pressupõe que você controla a página e o iframe)
No interior
iframe
, mudei debody
estilo para ter dimensões realmente grandes. Isso permitirá que os elementos internos sejam dispostos usando todo o espaço necessário. Fazerwidth
eheight
100% não funcionou para mim (acho que porque o iframe tem um padrãowidth = 300px
eheight = 150px
)Injetei toda a interface do iframe dentro de uma div e dei alguns estilos
Depois de renderizar meu aplicativo dentro disso
#ui-root
(em React , faço isso dentrocomponentDidMount
), eu calculo as dimensões dessa div e sincronizo-as com a página pai usandowindow.postMessage
:No quadro pai, faço algo assim:
fonte
É possível criar um IFrame "fantasma" que age como se não estivesse lá.
Consulte http://codecopy.wordpress.com/2013/02/22/ghost-iframe-crossdomain-iframe-resize/
Basicamente, você usa o sistema de eventos
parent.postMessage(..)
descrito em https://developer.mozilla.org/en-US/docs/DOM/window.postMessageIsso funciona em todos os navegadores modernos!
fonte
Sei que o post é antigo, mas acredito que essa é outra maneira de fazê-lo. Acabei de implementar no meu código. Funciona perfeitamente no carregamento da página e no redimensionamento da página:
fonte
Javascript a ser colocado no cabeçalho:
Aqui está o código html iframe:
Folha de estilo CSS
>
fonte
Para o atributo da diretiva angularjs:
Observe a porcentagem, eu a inseri para que você possa combater o dimensionamento geralmente feito para iframe, texto, anúncios etc., basta colocar 0 se nenhum dimensionamento for implementado
fonte
Foi assim que fiz isso onload ou quando as coisas mudam.
fonte
Claramente, existem muitos cenários, no entanto, eu tinha o mesmo domínio para o documento e o iframe e pude prendê-lo até o final do meu conteúdo do iframe:
Isso 'localiza' o contêiner pai e define o comprimento adicionando um fator de correção de 50 pixels para remover a barra de rolagem.
Não há nada para 'observar' a alteração da altura do documento; isso não era necessário para o meu caso de uso. Na minha resposta, trago um meio de referenciar o contêiner pai sem usar IDs inseridos no conteúdo pai / iframe.
fonte
Se você puder viver com uma proporção fixa e desejar um iframe responsivo , esse código será útil para você. São apenas regras CSS.
O iframe deve ter uma div como contêiner.
O código fonte é baseado neste site e Ben Marshall tem uma boa explicação.
fonte
Simplicidade:
fonte
Se o conteúdo for apenas um html muito simples, a maneira mais simples é remover o iframe com javascript
Código HTML:
Código Javascript:
fonte
fonte