У нас виникли подібні проблеми, але дещо зворотно до вашої ситуації - ми надавали контент із рамками на веб-сайтах інших доменів, тому та сама політика щодо походження також була проблемою. Після багатьох годин, котрих гуляли в Google, ми врешті-решт знайшли (дещо ..) дієве рішення, яке ви, можливо, зможете адаптувати під свої потреби.
Існує однакова політика щодо оригіналу, але вона вимагає змін як у вкладеному кадрі, так і на сторінці обрамлення, тому якщо у вас немає можливості вимагати змін з обох сторін, цей метод не буде дуже корисним для вас, Я боюся.
Існує химерність веб-переглядача, яка дозволяє нам знімати ту саму політику походження - javascript може спілкуватися як зі сторінками на власному домені, так і зі сторінками, на яких є рамкова рамка, але ніколи зі сторінками, на яких вона створена, наприклад, якщо у вас є:
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
Тут є пояснення, як фейсбук поводиться з цим, що може бути дещо чіткіше, ніж моє вище!
Код
У www.foo.com/home.html
цьому випадку необхідний наступний код javascript (його можна завантажити з .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>