Wystąpił tego rodzaju problem, ale nieco odwrotnie niż w twojej sytuacji - dostarczaliśmy zawartość iframed do witryn w innych domenach, więc problem dotyczył również tej samej zasady pochodzenia . Po wielu godzinach spędzonych na przeszukiwaniu Google, w końcu znaleźliśmy (nieco ..) wykonalne rozwiązanie, które możesz być w stanie dostosować do swoich potrzeb.
Istnieje sposób obejścia tej samej zasady pochodzenia, ale wymaga ona zmian zarówno w treści iframed, jak i na stronie kadrowania, więc jeśli nie możesz poprosić o zmiany po obu stronach, ta metoda nie będzie dla ciebie bardzo przydatna, obawiam się.
Istnieje dziwactwo przeglądarki, które pozwala nam ominąć tę samą zasadę pochodzenia - javascript może komunikować się ze stronami w swojej własnej domenie lub ze stronami, które mają iframed, ale nigdy stronami, na których jest oprawiony, np. Jeśli masz:
www.foo.com/home.html, which iframes
|-> www.bar.net/framed.html, which iframes
|-> www.foo.com/helper.html
następnie home.html
może komunikować się z framed.html
(iframed) i helper.html
(ta sama domena).
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
może wysyłać wiadomości do helper.html
(iframed), ale nie home.html
(dziecko nie może komunikować się między domenami z rodzicem).
Kluczem tutaj jest to, że helper.html
może odbierać wiadomości framed.html
i może się z nimi komunikowaćhome.html
.
Zasadniczo, gdy framed.html
ładuje, oblicza swoją własną wysokość, mówi helper.html
, który przekazuje komunikat home.html
, który może następnie zmienić rozmiar iframe, w którym framed.html
siedzi.
Najprostszym sposobem na przekazanie wiadomości od framed.html
do helper.html
było użycie argumentu adresu URL. Aby to zrobić, framed.html
ma iframe zsrc=''
określony . Gdy onload
strzela, ocenia swoją wysokość i ustawia w tym miejscu element src iframe nahelper.html?height=N
Tutaj jest wyjaśnienie jak radzi sobie z tym Facebook, co może być nieco jaśniejsze niż moje powyżej!
Kod
W www.foo.com/home.html
programie wymagany jest następujący kod javascript (można go załadować z pliku .js w dowolnej domenie, nawiasem mówiąc ...):
<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>
W 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>
Zawartość 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>