Kami memiliki masalah seperti ini, tetapi sedikit berlawanan dengan situasi Anda - kami menyediakan konten yang dibingkai untuk situs di domain lain, sehingga kebijakan asal yang sama juga menjadi masalah. Setelah menghabiskan berjam-jam trawl google, kami akhirnya menemukan (agak ..) solusi yang bisa diterapkan, yang Anda mungkin dapat beradaptasi dengan kebutuhan Anda.
Ada cara di sekitar kebijakan asal yang sama, tetapi membutuhkan perubahan pada konten berbingkai dan halaman pembingkaian, jadi jika Anda tidak memiliki kemampuan untuk meminta perubahan di kedua sisi, metode ini tidak akan sangat berguna bagi Anda, saya takut.
Ada kekhasan browser yang memungkinkan kita untuk merangkai kebijakan asal yang sama - javascript dapat berkomunikasi baik dengan halaman di domainnya sendiri, atau dengan halaman yang telah dibingkai, tetapi tidak pernah halaman di mana ia dibingkai, misalnya jika Anda memiliki:
www.foo.com/home.html, which iframes
|-> www.bar.net/framed.html, which iframes
|-> www.foo.com/helper.html
kemudian home.html
dapat berkomunikasi dengan framed.html
(iframed) dan helper.html
(domain yang sama).
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
dapat mengirim pesan ke helper.html
(iframed) tetapi tidak home.html
(anak tidak dapat berkomunikasi lintas domain dengan orang tua).
Kuncinya di sini adalah helper.html
dapat menerima pesan dari framed.html
, dan juga dapat berkomunikasi dengan home.html
.
Jadi pada dasarnya, ketika framed.html
memuat, ia berhasil ketinggiannya sendiri, memberitahu helper.html
, yang meneruskan pesan ke home.html
, yang kemudian dapat mengubah ukuran iframe di mana framed.html
duduk.
Cara paling sederhana yang kami temukan untuk meneruskan pesan dari framed.html
ke helper.html
adalah melalui argumen URL. Untuk melakukan ini, framed.html
memiliki iframe dengan yang src=''
ditentukan. Ketika onload
menyala, ia mengevaluasi ketinggiannya sendiri, dan mengatur src iframe pada saat ini menjadihelper.html?height=N
Ada penjelasan di sini tentang bagaimana facebook menanganinya, yang mungkin sedikit lebih jelas daripada saya di atas!
Kode
Di www.foo.com/home.html
, kode javascript berikut diperlukan (ini dapat diambil dari file .js di domain apa pun, secara tidak sengaja ..):
<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>
Dalam 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>
Isi dari 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>