เรามีปัญหาประเภทนี้ แต่กลับเล็กน้อยกับสถานการณ์ของคุณ - เรากำลังให้เนื้อหา iframed ไปยังเว็บไซต์ในโดเมนอื่น ๆ ดังนั้นนโยบายแหล่งกำเนิดเดียวกันก็เป็นปัญหาเช่นกัน หลังจากใช้เวลาหลายชั่วโมงกับการสืบค้นด้วย google ในที่สุดเราก็พบวิธีแก้ปัญหาที่ใช้การได้ (บ้าง .. ) ซึ่งคุณสามารถปรับให้เข้ากับความต้องการของคุณได้
มีวิธีเกี่ยวกับนโยบายต้นทางเดียวกัน แต่ต้องมีการเปลี่ยนแปลงทั้งเนื้อหา iframed และหน้าเฟรมดังนั้นหากคุณไม่มีความสามารถในการร้องขอการเปลี่ยนแปลงทั้งสองด้านวิธีนี้จะไม่เป็นประโยชน์กับคุณมากนัก ฉันกลัว.
มีการเล่นโวหารเบราว์เซอร์ที่ช่วยให้เราสามารถกำหนดนโยบายต้นกำเนิดเดียวกันได้ - จาวาสคริปต์สามารถสื่อสารกับหน้าเว็บในโดเมนของตัวเองหรือกับหน้าเว็บที่มี iframed แต่ไม่เคยมีหน้าเว็บที่มีกรอบเช่นถ้าคุณมี:
www.foo.com/home.html, which iframes
|-> www.bar.net/framed.html, which iframes
|-> www.foo.com/helper.html
จากนั้นhome.html
สามารถสื่อสารกับframed.html
(iframed) และhelper.html
(โดเมนเดียวกัน)
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
สามารถส่งข้อความไปยังhelper.html
(iframed) แต่ไม่ home.html
(เด็กไม่สามารถสื่อสารข้ามโดเมนกับผู้ปกครอง)
ที่สำคัญนี่คือการที่helper.html
สามารถรับข้อความจากframed.html
และยังสามารถสื่อสารhome.html
กับ
ดังนั้นโดยทั่วไปเมื่อframed.html
โหลดมันจะทำงานออกความสูงของตัวเองบอกhelper.html
ซึ่งส่งข้อความไปยังhome.html
ซึ่งสามารถปรับขนาด iframe ที่framed.html
อยู่
วิธีที่ง่ายที่สุดที่เราพบว่าผ่านข้อความจากframed.html
ถึงhelper.html
คือผ่านอาร์กิวเมนต์ URL ในการทำเช่นนี้framed.html
มี iframe พร้อมsrc=''
ระบุ เมื่อonload
ไฟไหม้มันจะประเมินความสูงของตัวเองและตั้งค่า src ของ iframe ณ จุดนี้เป็นhelper.html?height=N
มีคำอธิบายที่นี่เกี่ยวกับวิธีจัดการ Facebook ซึ่งอาจจะชัดเจนกว่าของฉันเล็กน้อยด้านบน!
รหัส
ในwww.foo.com/home.html
รหัสจาวาสคริปต์ต่อไปนี้เป็นสิ่งจำเป็น (ซึ่งสามารถโหลดได้จากไฟล์. js บนโดเมนใด ๆ โดยบังเอิญ .. ):
<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>
ใน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>
เนื้อหาของ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>