Wir hatten diese Art von Problem, aber etwas umgekehrt zu Ihrer Situation - wir haben den iframed-Inhalt für Websites in anderen Domains bereitgestellt, sodass dieselbe Ursprungsrichtlinie ebenfalls ein Problem darstellte. Nach vielen Stunden beim Durchsuchen von Google haben wir schließlich eine (etwas ..) praktikable Lösung gefunden, die Sie möglicherweise an Ihre Bedürfnisse anpassen können.
Es gibt einen Weg, um dieselbe Ursprungsrichtlinie zu umgehen, aber es sind Änderungen sowohl am iframed-Inhalt als auch an der Framing-Seite erforderlich. Wenn Sie also nicht auf beiden Seiten Änderungen anfordern können, ist diese Methode für Sie nicht sehr nützlich. Ich fürchte.
Es gibt eine Browser-Eigenart, mit der wir die gleiche Ursprungsrichtlinie umgehen können - Javascript kann entweder mit Seiten in seiner eigenen Domain oder mit Seiten kommunizieren, die iframed hat, aber niemals mit Seiten, in denen es eingerahmt ist, z.
www.foo.com/home.html, which iframes
|-> www.bar.net/framed.html, which iframes
|-> www.foo.com/helper.html
home.html
kann dann mit framed.html
(iframed) und helper.html
(derselben Domain) kommunizieren .
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
kann Nachrichten an helper.html
(iframed) senden, aber nicht home.html
(Kind kann nicht domänenübergreifend mit Eltern kommunizieren).
Der Schlüssel hier ist , dass helper.html
empfangen können Nachrichten aus framed.html
und kann auch kommunizieren mit home.html
.
Wenn also framed.html
geladen wird, berechnet es im Wesentlichen seine eigene Höhe, sagt helper.html
, an welche die Nachricht weitergeleitet wird home.html
, und kann dann die Größe des Iframes ändern, in dem er sich framed.html
befindet.
Der einfachste Weg, Nachrichten von an framed.html
zu übergeben, helper.html
war ein URL-Argument. Zu diesem framed.html
Zweck wurde ein Iframe mit src=''
angegeben. Wenn es onload
ausgelöst wird, wertet es seine eigene Höhe aus und setzt den src des iframe an dieser Stelle aufhelper.html?height=N
Hier gibt es eine Erklärung, wie Facebook damit umgeht, die vielleicht etwas klarer ist als meine oben!
Code
In www.foo.com/home.html
wird der folgende Javascript-Code benötigt (dieser kann übrigens aus einer .js-Datei in einer beliebigen Domain geladen werden ..):
<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>
Inhalt von 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>