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>