Chúng tôi đã có loại vấn đề này, nhưng hơi ngược lại với tình huống của bạn - chúng tôi đã cung cấp nội dung có khung cho các trang web trên các tên miền khác, vì vậy chính sách xuất xứ tương tự cũng là một vấn đề. Sau nhiều giờ dành cho việc truy tìm google, cuối cùng chúng tôi cũng tìm thấy một giải pháp khả thi (phần nào đó), mà bạn có thể có thể thích ứng với nhu cầu của mình.
Có một cách xoay quanh cùng một chính sách xuất xứ, nhưng nó yêu cầu thay đổi cả nội dung có khung và trang đóng khung, vì vậy nếu bạn không có khả năng yêu cầu thay đổi ở cả hai bên, phương pháp này sẽ không hữu ích cho bạn, Tôi sợ.
Có một cách giải quyết trình duyệt cho phép chúng tôi tuân theo chính sách xuất xứ tương tự - javascript có thể giao tiếp với các trang trên tên miền của chính nó hoặc với các trang có khung, nhưng không bao giờ có các trang được đóng khung, ví dụ: nếu bạn có:
www.foo.com/home.html, which iframes
|-> www.bar.net/framed.html, which iframes
|-> www.foo.com/helper.html
sau đó home.html
có thể giao tiếp với framed.html
(ifazed) và helper.html
(cùng tên miền).
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
có thể gửi tin nhắn đến helper.html
(có khung) nhưng không home.html
(trẻ em không thể giao tiếp giữa các miền với cha mẹ).
Chìa khóa ở đây là helper.html
có thể nhận tin nhắn từ framed.html
và cũng có thể liên lạc với home.html
.
Vì vậy, về cơ bản, khi framed.html
tải, nó hoạt động theo chiều cao của chính nó helper.html
, sẽ truyền thông điệp đến home.html
, sau đó có thể thay đổi kích thước iframe nằm trong đó framed.html
.
Cách đơn giản nhất mà chúng tôi tìm thấy để chuyển các tin nhắn từ framed.html
đến helper.html
là thông qua một đối số URL. Để làm điều này, framed.html
có một iframe với src=''
chỉ định. Khi onload
kích hoạt, nó đánh giá chiều cao của chính nó và đặt src của iframe tại thời điểm này thànhhelper.html?height=N
Có một lời giải thích ở đây về cách facebook xử lý nó, có thể rõ ràng hơn một chút so với của tôi ở trên!
Mã
Trong www.foo.com/home.html
, mã javascript sau là bắt buộc (có thể được tải từ tệp .js trên bất kỳ tên miền nào, tình 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>
Trong 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>
Nội dung của 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>