Tivemos esse tipo de problema, mas ligeiramente ao contrário da sua situação - estávamos fornecendo o conteúdo com iframes para sites em outros domínios, portanto, a mesma política de origem também era um problema. Depois de muitas horas vasculhando o Google, finalmente encontramos uma solução (um pouco ..) viável, que você pode adaptar às suas necessidades.
Existe uma maneira de contornar a mesma política de origem, mas exige alterações no conteúdo iframed e na página de enquadramento. Portanto, se você não puder solicitar alterações nos dois lados, esse método não será muito útil para você, Estou com medo.
Existe uma peculiaridade do navegador que nos permite contornar a mesma política de origem - o javascript pode se comunicar com páginas em seu próprio domínio ou com páginas com iframed, mas nunca com páginas em que está enquadrado, por exemplo, se você tiver:
www.foo.com/home.html, which iframes
|-> www.bar.net/framed.html, which iframes
|-> www.foo.com/helper.html
então home.html
pode se comunicar com framed.html
(iframed) e helper.html
(mesmo domínio).
Communication options for each page:
+-------------------------+-----------+-------------+-------------+
| | home.html | framed.html | helper.html |
+-------------------------+-----------+-------------+-------------+
| www.foo.com/home.html | N/A | YES | YES |
| www.bar.net/framed.html | NO | N/A | YES |
| www.foo.com/helper.html | YES | YES | N/A |
+-------------------------+-----------+-------------+-------------+
framed.html
pode enviar mensagens para helper.html
(iframed), mas não home.html
(o filho não pode se comunicar entre domínios com o pai).
A chave aqui é que helper.html
pode receber mensagens de framed.html
e também pode se comunicar com home.html
.
Então, essencialmente, quando framed.html
carrega, ele calcula sua própria altura, diz helper.html
, que passa a mensagem para home.html
, o que pode redimensionar o iframe no qual framed.html
está sentado.
A maneira mais simples pela qual descobrimos transmitir mensagens de framed.html
para helper.html
foi através de um argumento de URL. Para fazer isso, framed.html
possui um iframe src=''
especificado. Quando é onload
acionado, ele avalia sua própria altura e define o src do iframe neste momento comohelper.html?height=N
Há uma explicação aqui de como o Facebook lida com isso, o que pode ser um pouco mais claro do que o meu acima!
Código
Em www.foo.com/home.html
, é necessário o seguinte código javascript (isso pode ser carregado a partir de um arquivo .js em qualquer domínio, aliás ..):
<script>
// Resize iframe to full height
function resizeIframe(height)
{
// "+60" is a general rule of thumb to allow for differences in
// IE & and FF height reporting, can be adjusted as required..
document.getElementById('frame_name_here').height = parseInt(height)+60;
}
</script>
<iframe id='frame_name_here' src='http://www.bar.net/framed.html'></iframe>
Em www.bar.net/framed.html
:
<body onload="iframeResizePipe()">
<iframe id="helpframe" src='' height='0' width='0' frameborder='0'></iframe>
<script type="text/javascript">
function iframeResizePipe()
{
// What's the page height?
var height = document.body.scrollHeight;
// Going to 'pipe' the data to the parent through the helpframe..
var pipe = document.getElementById('helpframe');
// Cachebuster a precaution here to stop browser caching interfering
pipe.src = 'http://www.foo.com/helper.html?height='+height+'&cacheb='+Math.random();
}
</script>
Conteúdo de www.foo.com/helper.html
:
<html>
<!--
This page is on the same domain as the parent, so can
communicate with it to order the iframe window resizing
to fit the content
-->
<body onload="parentIframeResize()">
<script>
// Tell the parent iframe what height the iframe needs to be
function parentIframeResize()
{
var height = getParam('height');
// This works as our parent's parent is on our domain..
parent.parent.resizeIframe(height);
}
// Helper function, parse param from request string
function getParam( name )
{
name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
var regexS = "[\\?&]"+name+"=([^&#]*)";
var regex = new RegExp( regexS );
var results = regex.exec( window.location.href );
if( results == null )
return "";
else
return results[1];
}
</script>
</body>
</html>
parentIframeResize()
carga do corpo a ser chamada , usei o JQuery para capturar o carregamento da página e qualquer evento de redimensionamento:$(document).ready(iframeResizePipe); $(window).resize(iframeResizePipe);
Isso permite definir o iframewidth="100%"
e se a largura da janela mudar para tornar o texto quebrado ou algo assim, O quadro interno reconhecerá que precisa ser redimensionado.Se você não precisar manipular o conteúdo iframe de um domínio diferente, tente este código, ele resolverá o problema completamente e é simples:
fonte
document.getElementById(id)
você possui e simplificar o código.https://developer.mozilla.org/en/DOM/window.postMessage
A biblioteca do iFrame-Resizer usa o postMessage para manter um tamanho do iFrame em seu conteúdo, juntamente com o MutationObserver para detectar alterações no conteúdo e não depende do jQuery.
https://github.com/davidjbradshaw/iframe-resizer
jQuery: qualidade de script entre domínios
http://benalman.com/projects/jquery-postmessage-plugin/
Tem demonstração de redimensionamento da janela de iframe ...
http://benalman.com/code/projects/jquery-postmessage/examples/iframe/
Este artigo mostra como remover a dependência do jQuery ... Plus possui muitas informações e links úteis para outras soluções.
http://www.onlineaspect.com/2010/01/15/backwards-compatible-postmessage/
Exemplo de Barebones ...
http://onlineaspect.com/uploads/postmessage/parent.html
Rascunho de trabalho do HTML 5 em window.postMessage
http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages
John Resig em Mensagens entre janelas
http://ejohn.org/blog/cross-window-messaging/
fonte
A maneira mais simples de usar o jQuery:
fonte
A solução em http://www.phinesolutions.com/use-jquery-to-adjust-the-iframe-height.html funciona muito bem (usa jQuery):
Não sei se você precisa adicionar 30 ao comprimento ... trabalhei para mim.
FYI : Se você já possui um atributo "height" no seu iFrame, isso apenas adiciona style = "height: xxx". Pode não ser o que você deseja.
fonte
pode ser um pouco tarde, pois todas as outras respostas são mais antigas :-) mas ... aqui está a minha solução. Testado no real FF, Chrome e Safari 5.0.
css:
javascript:
Espero que isso ajude alguém.
fonte
Finalmente, encontrei outra solução para enviar dados para o site pai do iframe usando
window.postMessage(message, targetOrigin);
. Aqui eu explico como eu fiz.Site A = http://foo.com Site B = http://bar.com
O siteB está carregando dentro do site
SiteB site tem esta linha
ou
Então siteA tem este código a seguir
Se você deseja adicionar uma conexão de segurança, use esta condição se
eventer(messageEvent, function (e) {})
Para o IE
Dentro do IFrame:
Lado de fora:
fonte
Aqui está uma solução simples, usando uma folha de estilos gerada dinamicamente e atendida pelo mesmo servidor que o conteúdo do iframe. Simplesmente a folha de estilos "sabe" o que está no iframe e conhece as dimensões a serem usadas para estilizar o iframe. Isso contorna as mesmas restrições de política de origem.
http://www.8degrees.co.nz/2010/06/09/dynamically-resize-an-iframe-depending-on-its-content/
Portanto, o código iframe fornecido teria uma folha de estilos que o acompanha ...
<link href="http://your.site/path/to/css?contents_id=1234&dom_id=iframe_widget" rel="stylesheet" type="text/css" /> <iframe id="iframe_widget" src="http://your.site/path/to/content?content_id=1234" frameborder="0" width="100%" scrolling="no"></iframe>
Isso requer que a lógica do servidor seja capaz de calcular as dimensões do conteúdo renderizado do iframe.
fonte
Esta resposta é aplicável apenas a sites que usam o Bootstrap. O recurso de incorporação responsivo do Bootstrap faz o trabalho. É baseado na largura (não na altura) do conteúdo.
jsfiddle: http://jsfiddle.net/00qggsjj/2/
http://getbootstrap.com/components/#responsive-embed
fonte
Estou implementando a solução frame-in-frame da ConroyP para substituir uma solução com base na configuração document.domain, mas achei bastante difícil determinar a altura do conteúdo do iframe corretamente em diferentes navegadores (testando com FF11, Ch17 e IE9 agora )
O ConroyP usa:
Mas isso só funciona no carregamento da página inicial. Meu iframe tem conteúdo dinâmico e preciso redimensionar o iframe em determinados eventos.
O que acabei fazendo foi usar propriedades JS diferentes para os diferentes navegadores.
getBrowserData () é a função de detecção de navegador "inspirada" pelo http://docs.sencha.com/core/source/Ext.html#method-Ext-apply do Ext Core
Isso funcionou bem para o FF e o IE, mas houve problemas com o Chrome. Uma delas foi um problema de tempo, aparentemente leva um tempo para o Chrome definir / detectar a altura do iframe. E o Chrome também nunca retornou a altura do conteúdo no iframe corretamente se o iframe fosse maior que o conteúdo. Isso não funcionaria com conteúdo dinâmico quando a altura é reduzida.
Para resolver isso, sempre defino o iframe para uma altura baixa antes de detectar a altura do conteúdo e, em seguida, defina a altura do iframe para o valor correto.
O código não é otimizado, é do meu teste de desenvolvimento :)
Espero que alguém ache isso útil!
fonte
fonte
Os gadgets do iGoogle precisam implementar ativamente o redimensionamento. Portanto, em um modelo entre domínios, você não pode fazer isso sem que o conteúdo remoto participe de alguma forma. Se o seu conteúdo puder enviar uma mensagem com o novo tamanho para a página do contêiner usando técnicas típicas de comunicação entre domínios, o resto será simples.
fonte
Quando você deseja diminuir o zoom de uma página da Web para ajustá-la ao tamanho do iframe:
Aqui está um exemplo:
fonte
Aqui está uma abordagem jQuery que adiciona as informações em json através do atributo src do iframe. Aqui está uma demonstração, redimensione e role esta janela .. o URL resultante com json se parece com isso ... http://fiddle.jshell.net/zippyskippy/RJN3G/show/#{docHeight:5124,windowHeight:1019,scrollHeight: 571} #
Aqui está o código fonte http://jsfiddle.net/zippyskippy/RJN3G/
fonte
obter a altura do conteúdo do iframe e atribuí-lo a esse iframe
fonte
Trabalhe com jquery on load (cross browser):
ao redimensionar na página responsiva:
fonte
Usando jQuery:
parent.html
child.html
fonte
Isso é um pouco complicado, pois você precisa saber quando a página iframe foi carregada, o que é particularmente difícil quando você não controla o conteúdo. É possível adicionar um manipulador de onload ao iframe, mas eu tentei isso no passado e ele tem um comportamento muito diferente entre os navegadores (não adivinhe quem é o mais irritante ...). Você provavelmente teria que adicionar uma função à página iframe que executa o redimensionamento e injetar algum script no conteúdo que ouve para carregar eventos ou redimensionar eventos, que então chama a função anterior. Estou pensando em adicionar uma função à página, pois você deseja garantir sua segurança, mas não tenho ideia de como será fácil fazê-lo.
fonte
Algo nas linhas deste que eu acredito deve funcionar.
Carregue isso com seu corpo carregado no conteúdo do iframe.
fonte
Eu tenho uma solução fácil e requer que você determine a largura e a altura no link, tente (funciona com a maioria dos navegadores):
fonte