У нас была проблема такого типа, но немного обратная вашей ситуации - мы предоставляли контент iframed для сайтов в других доменах, поэтому такая же политика происхождения также была проблемой. После долгих часов траления в Google мы нашли (несколько ..) работоспособное решение, которое вы сможете адаптировать к вашим потребностям.
Существует способ обойти одну и ту же политику происхождения, но она требует изменений как для содержимого iframed, так и для страницы создания кадров, поэтому, если у вас нет возможности запрашивать изменения с обеих сторон, этот метод не будет очень полезен для вас, Боюсь.
Существует особенность браузера, которая позволяет нам обходить ту же политику происхождения - 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
(в рамке), но нет 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
, требуется следующий код 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>
parentIframeResize()
загрузку , я использовал JQuery для отслеживания загрузки страницы и любых событий изменения размера:$(document).ready(iframeResizePipe); $(window).resize(iframeResizePipe);
это позволяет мне устанавливать iframewidth="100%"
и, если ширина окна изменяется, чтобы сделать перенос текста или что-то еще, внутренняя рамка распознает, что ее нужно изменить.Если вам не нужно обрабатывать содержимое iframe из другого домена, попробуйте этот код, он полностью решит проблему и прост:
источник
document.getElementById(id)
вас есть, и упростить код.https://developer.mozilla.org/en/DOM/window.postMessage
Библиотека iFrame-Resizer использует postMessage для сохранения размера iFrame в соответствии с его содержимым вместе с MutationObserver для обнаружения изменений в контенте и не зависит от jQuery.
https://github.com/davidjbradshaw/iframe-resizer
jQuery: совершенство междоменных сценариев
http://benalman.com/projects/jquery-postmessage-plugin/
Имеет демонстрацию изменения размера окна iframe ...
http://benalman.com/code/projects/jquery-postmessage/examples/iframe/
В этой статье показано, как убрать зависимость от jQuery ... Plus содержит много полезной информации и ссылок на другие решения.
http://www.onlineaspect.com/2010/01/15/backwards-compatible-postmessage/
Пример Barebones ...
http://onlineaspect.com/uploads/postmessage/parent.html
HTML 5 рабочий проект для window.postMessage
http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages
Джон Резиг по обмену сообщениями между окнами
http://ejohn.org/blog/cross-window-messaging/
источник
Самый простой способ использования jQuery:
источник
Решение на http://www.phinesolutions.com/use-jquery-to-adjust-the-iframe-height.html прекрасно работает (использует jQuery):
Я не знаю, что вам нужно добавить 30 к длине ... 1 работал для меня.
К вашему сведению : если у вас уже есть атрибут «высота» в вашем iFrame, это просто добавляет style = "height: xxx". Это может быть не то, что вы хотите.
источник
может быть немного поздно, так как все остальные ответы старше :-) но ... вот мое решение. Проверено в реальных FF, Chrome и Safari 5.0.
CSS:
JavaScript:
Надеюсь, это кому-нибудь поможет.
источник
Наконец, я нашел другое решение для отправки данных на родительский сайт из iframe
window.postMessage(message, targetOrigin);
. Здесь я объясняю, как я это сделал.Сайт A = http://foo.com Сайт B = http://bar.com
Сайт B загружается внутри сайта. Сайт
Сайт SiteB имеет эту строку
или
Тогда сайт А имеет следующий код
Если вы хотите добавить безопасное соединение, вы можете использовать это, если условие в
eventer(messageEvent, function (e) {})
Для IE
Внутри IFrame:
За пределами:
источник
Вот простое решение с использованием динамически генерируемой таблицы стилей, обслуживаемой тем же сервером, что и содержимое iframe. Проще говоря, таблица стилей «знает», что находится в iframe, и знает размеры, используемые для стилизации iframe. Это обходит те же ограничения политики происхождения.
http://www.8degrees.co.nz/2010/06/09/dynamically-resize-an-iframe-depending-on-its-content/
Таким образом, поставляемый код iframe будет иметь сопровождающую таблицу стилей, например, так ...
<link href="http://your.site/path/to/css?contents_id=1234&dom_id=iframe_widget" rel="stylesheet" type="text/css" /> <iframe id="iframe_widget" src="http://your.site/path/to/content?content_id=1234" frameborder="0" width="100%" scrolling="no"></iframe>
Это требует, чтобы логика на стороне сервера была способна рассчитать размеры визуализированного содержимого iframe.
источник
Этот ответ применим только для сайтов, которые используют Bootstrap. Функция адаптивного встраивания Bootstrap делает свою работу. Он основан на ширине (а не высоте) содержимого.
jsfiddle: http://jsfiddle.net/00qggsjj/2/
http://getbootstrap.com/components/#responsive-embed
источник
Я внедряю решение ConroyP для фреймов в кадре, чтобы заменить решение, основанное на настройке document.domain, но мне было довольно сложно правильно определить высоту содержимого iframe в разных браузерах (тестирование с FF11, Ch17 и IE9 сейчас ).
ConroyP использует:
Но это работает только при начальной загрузке страницы. Мой iframe имеет динамическое содержимое, и мне нужно изменить размер iframe для определенных событий.
В итоге я использовал разные свойства JS для разных браузеров.
getBrowserData () - функция обнаружения браузера, «вдохновленная» http://docs.sencha.com/core/source/Ext.html#method-Ext-apply функцией Ext Core.
Это хорошо работает для FF и IE, но затем возникли проблемы с Chrome. Одной из них была проблема синхронизации, очевидно, что Chrome требуется некоторое время, чтобы установить / определить высоту фрейма. Кроме того, Chrome также никогда не возвращает правильную высоту содержимого в iframe, если iframe был выше содержимого. Это не будет работать с динамическим контентом, когда высота уменьшается.
Чтобы решить эту проблему, я всегда устанавливаю значение iframe на низкую высоту, прежде чем определять высоту содержимого, а затем устанавливаю правильное значение высоты iframe.
Код не оптимизирован, это из моего тестирования на уровне :)
Надеюсь, кто-то найдет это полезным!
источник
источник
Гаджеты iGoogle должны активно реализовывать изменение размера, поэтому я полагаю, что в междоменной модели вы не сможете сделать это без участия удаленного контента. Если ваш контент может отправить сообщение с новым размером на страницу контейнера с использованием типичных междоменных методов связи, то все остальное просто.
источник
Если вы хотите уменьшить веб-страницу, чтобы она соответствовала размеру фрейма:
Вот пример:
источник
Вот подход jQuery, который добавляет информацию в json через атрибут src iframe. Вот демонстрация, измените размер и прокрутите это окно ... Полученный URL с json выглядит следующим образом ... http://fiddle.jshell.net/zippyskippy/RJN3G/show/# enjdocHeight:5124,windowHeight:1019,scrollHeight: 571} #
Вот скрипта исходного кода http://jsfiddle.net/zippyskippy/RJN3G/
источник
получить высоту содержимого iframe, затем передать его этому iframe
источник
Работа с jquery под нагрузкой (кросс-браузер):
при изменении размера на адаптивной странице:
источник
Используя jQuery:
parent.html
child.html
источник
Это немного сложнее, поскольку вы должны знать, когда страница iframe загрузилась, что затруднительно, когда вы не контролируете ее содержимое. Можно добавить обработчик загрузки в iframe, но я пробовал это в прошлом, и в браузерах он ведет себя совершенно по-разному (не думаю, кто самый раздражающий ...). Возможно, вам придется добавить на страницу iframe функцию, которая выполняет изменение размера, и внедрить некоторый сценарий в контент, который либо прослушивает события загрузки, либо изменяет размер события, который затем вызывает предыдущую функцию. Я думаю добавить функцию на страницу, так как вы хотите убедиться, что она безопасна, но я понятия не имею, насколько легко это будет сделать.
источник
Что-то на линии этого, я верю, должно работать.
Загрузите это с нагрузкой тела на содержание iframe.
источник
У меня есть простое решение, и вы должны определить ширину и высоту в ссылке, попробуйте (это работает с большинством браузеров):
источник