Abbiamo avuto questo tipo di problema, ma leggermente invertito rispetto alla tua situazione: fornivamo il contenuto iframe a siti su altri domini, quindi anche la stessa politica di origine era un problema. Dopo molte ore trascorse a cercare Google, alla fine abbiamo trovato una soluzione (piuttosto ..) praticabile, che potresti essere in grado di adattare alle tue esigenze.
C'è un modo per aggirare la stessa politica di origine, ma richiede modifiche sia sul contenuto iframe che sulla pagina di inquadramento, quindi se non hai la possibilità di richiedere modifiche su entrambi i lati, questo metodo non ti sarà molto utile, Ho paura.
Esiste una stranezza del browser che ci consente di evitare la stessa politica di origine: javascript può comunicare con pagine del proprio dominio o con pagine con iframe, ma mai con pagine in cui è inquadrato, ad esempio se si dispone di:
www.foo.com/home.html, which iframes
|-> www.bar.net/framed.html, which iframes
|-> www.foo.com/helper.html
quindi home.html
può comunicare con framed.html
(iframe) e helper.html
(stesso 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
può inviare messaggi a helper.html
(iframe) ma non home.html
(il bambino non può comunicare tra domini con il genitore).
La chiave qui è che helper.html
può ricevere messaggi framed.html
e anche comunicare con home.html
.
Quindi, essenzialmente, quando viene framed.html
caricato, viene elaborato la propria altezza, indica a helper.html
chi passa il messaggio home.html
, che può quindi ridimensionare l'iframe in cui si framed.html
trova.
Il modo più semplice che abbiamo trovato per passare i messaggi da framed.html
a helper.html
era attraverso un argomento URL. Per fare questo, framed.html
ha un iframe con src=''
specificato. Quando onload
spara, valuta la propria altezza e imposta a questo punto l'src dell'iframehelper.html?height=N
C'è una spiegazione qui su come gestirlo su Facebook, che potrebbe essere leggermente più chiaro del mio sopra!
Codice
In www.foo.com/home.html
, è richiesto il seguente codice javascript (che può essere caricato da un file .js su qualsiasi dominio, per inciso ..):
<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>
In 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>
Contenuto di 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>