Tuvimos este tipo de problema, pero un poco inverso a su situación: estábamos proporcionando el contenido iframed a sitios en otros dominios, por lo que la misma política de origen también fue un problema. Después de pasar muchas horas buscando en Google, finalmente encontramos una solución (algo ...) viable, que puede adaptar a sus necesidades.
Hay una forma de evitar la misma política de origen, pero requiere cambios tanto en el contenido iframed como en la página de trama, por lo que si no puede solicitar cambios en ambos lados, este método no será muy útil para usted, Me temo que.
Hay una peculiaridad del navegador que nos permite eludir la misma política de origen: JavaScript puede comunicarse con páginas en su propio dominio o con páginas que tiene iframed, pero nunca páginas en las que está enmarcado, por ejemplo, si tiene:
www.foo.com/home.html, which iframes
|-> www.bar.net/framed.html, which iframes
|-> www.foo.com/helper.html
luego home.html
puede comunicarse con framed.html
(iframed) y helper.html
(mismo dominio).
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
puede enviar mensajes a helper.html
(iframed) pero no home.html
(el niño no puede comunicarse entre dominios con el padre).
La clave aquí es que helper.html
puede recibir mensajes framed.html
y también puede comunicarse con ellos home.html
.
Entonces, esencialmente, cuando se framed.html
carga, calcula su propia altura, le dice helper.html
, a quién le pasa el mensaje home.html
, que luego puede cambiar el tamaño del iframe en el que se framed.html
encuentra.
La forma más sencilla de encontrar mensajes de framed.html
a helper.html
fue a través de un argumento de URL. Para hacer esto, framed.html
tiene un iframe con src=''
especificado. Cuando se onload
dispara, evalúa su propia altura y establece el src del iframe en este punto enhelper.html?height=N
¡Aquí hay una explicación de cómo Facebook lo maneja, que puede ser un poco más claro que el mío anterior!
Código
En www.foo.com/home.html
, se requiere el siguiente código javascript (esto se puede cargar desde un archivo .js en cualquier dominio, por cierto ...):
<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>
En 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>
Contenido 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>