Изменение размера фрейма в зависимости от содержимого - PullRequest
490 голосов
/ 30 сентября 2008

Я работаю над iGoogle-подобным приложением. Контент из других приложений (в других доменах) показывается с помощью iframes.

Как изменить размеры фреймов, чтобы они соответствовали высоте содержимого фреймов?

Я пытался расшифровать javascript, который использует Google, но он запутан, и поиск в Интернете до сих пор был бесплодным.

Обновление: Обратите внимание, что контент загружается из других доменов, поэтому применяется политика с тем же происхождением .

Ответы [ 20 ]

1 голос
/ 21 марта 2012

Я внедряю решение ConroyP для покадровой замены вместо решения, основанного на настройке document.domain, но оказалось, что довольно сложно правильно определить высоту содержимого iframe в разных браузерах (тестирование с FF11, Ch17 и IE9 прямо сейчас).

ConroyP использует:

var height = document.body.scrollHeight;

Но это работает только при начальной загрузке страницы. Мой iframe имеет динамическое содержимое, и мне нужно изменить размер iframe для определенных событий.

В итоге я использовал разные свойства JS для разных браузеров.

function getDim () {
    var body = document.body,
        html = document.documentElement;

    var bc = body.clientHeight;
    var bo = body.offsetHeight;
    var bs = body.scrollHeight;
    var hc = html.clientHeight;
    var ho = html.offsetHeight;
    var hs = html.scrollHeight;

    var h = Math.max(bc, bo, bs, hc, hs, ho);

    var bd = getBrowserData();

    // Select height property to use depending on browser
    if (bd.isGecko) {
        // FF 11
        h = hc;
    } else if (bd.isChrome) {
        // CH 17
        h = hc;
    } else if (bd.isIE) {
        // IE 9
        h = bs;
    }

    return h;
}

getBrowserData () - это функция обнаружения браузером, «вдохновленная» Ext Core http://docs.sencha.com/core/source/Ext.html#method-Ext-apply

Это хорошо работало для FF и IE, но затем возникли проблемы с Chrome. Одной из них была проблема синхронизации, очевидно, что Chrome требуется некоторое время, чтобы установить / определить высоту фрейма. Кроме того, Chrome также никогда не возвращает правильную высоту содержимого в iframe, если iframe был выше содержимого. Это не будет работать с динамическим содержимым при уменьшении высоты.

Чтобы решить эту проблему, я всегда устанавливаю значение iframe на низкую высоту, прежде чем определять высоту содержимого, а затем устанавливаю высоту iframe на правильное значение.

function resize () {
    // Reset the iframes height to a low value.
    // Otherwise Chrome won't detect the content height of the iframe.
    setIframeHeight(150);

    // Delay getting the dimensions because Chrome needs
    // a few moments to get the correct height.
    setTimeout("getDimAndResize()", 100);
}

Код не оптимизирован, это из моего тестирования на уровне:)

Надеюсь, кто-нибудь найдет это полезным!

0 голосов
/ 11 декабря 2013

получить высоту содержимого iframe, затем передать его этому iframe

 var iframes = document.getElementsByTagName("iframe");
 for(var i = 0, len = iframes.length; i<len; i++){
      window.frames[i].onload = function(_i){
           return function(){
                     iframes[_i].style.height = window.frames[_i].document.body.scrollHeight + "px";
                     }
      }(i);
 }
0 голосов
/ 23 января 2013

Вот подход jQuery, который добавляет информацию в json через атрибут src iframe. Вот демонстрация, измените размер и прокрутите это окно .. Полученный URL с json выглядит следующим образом ... http://fiddle.jshell.net/zippyskippy/RJN3G/show/#{docHeight:5124,windowHeight:1019,scrollHeight:571}#

Вот скрипта исходного кода http://jsfiddle.net/zippyskippy/RJN3G/

function updateLocation(){

    var loc = window.location.href;
    window.location.href = loc.replace(/#{.*}#/,"") 
        + "#{docHeight:"+$(document).height() 
        + ",windowHeight:"+$(window).height()
        + ",scrollHeight:"+$(window).scrollTop()
        +"}#";

};

//setInterval(updateLocation,500);

$(window).resize(updateLocation);
$(window).scroll(updateLocation);
0 голосов
/ 30 сентября 2008

Что-то на линии этого, я верю, должно работать.

parent.document.getElementById(iFrameID).style.height=framedPage.scrollHeight;

Загрузите это с нагрузкой тела на содержимое iframe.

0 голосов
/ 01 июня 2011

Если вы хотите уменьшить веб-страницу, чтобы она соответствовала размеру фрейма:

  1. Вы должны изменить размер iframe , чтобы он соответствовал содержанию
  2. Затем вы должны уменьшить весь iframe с загруженным содержимым веб-страницы.

Вот пример:

<div id="wrap">
   <IFRAME ID="frame" name="Main" src ="http://www.google.com" />
</div>

<style type="text/css">
    #wrap { width: 130px; height: 130px; padding: 0; overflow: hidden; }
    #frame { width: 900px; height: 600px; border: 1px solid black; }
    #frame { zoom:0.15; -moz-transform:scale(0.15);-moz-transform-origin: 0 0; }
</style>
0 голосов
/ 30 октября 2008

Гаджеты iGoogle должны активно реализовывать изменение размера, поэтому я предполагаю, что в междоменной модели вы не сможете сделать это без участия удаленного контента. Если ваш контент может отправить сообщение с новым размером на страницу контейнера с использованием типичных междоменных методов связи, то все остальное просто.

0 голосов
/ 17 июня 2014

Работа с jquery под нагрузкой (кросс-браузер):

 <iframe src="your_url" marginwidth="0"  marginheight="0" scrolling="No" frameborder="0"  hspace="0" vspace="0" id="containiframe" onload="loaderIframe();" height="100%"  width="100%"></iframe>

function loaderIframe(){
var heightIframe = $('#containiframe').contents().find('body').height();
$('#frame').css("height", heightFrame);
 }  

при изменении размера на адаптивной странице:

$(window).resize(function(){
if($('#containiframe').length !== 0) {
var heightIframe = $('#containiframe').contents().find('body').height();
 $('#frame').css("height", heightFrame);
}
});
0 голосов
/ 20 февраля 2012

У меня есть простое решение, и вы должны определить ширину и высоту в ссылке, попробуйте (работает с большинством браузеров):

<a href='#' onClick=" document.getElementById('myform').src='t2.htm';document.getElementById('myform').width='500px'; document.getElementById('myform').height='400px'; return false">500x400</a>
0 голосов
/ 17 сентября 2015

Использование jQuery:

parent.html

<body>
<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
<style>
iframe {
    width: 100%;
    border: 1px solid black;
}
</style>
<script>
function foo(w, h) {
    $("iframe").css({width: w, height: h});
    return true;  // for debug purposes
}
</script>
<iframe src="child.html"></iframe>
</body>

child.html

<body>
<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
<script>
$(function() {
    var w = $("#container").css("width");
    var h = $("#container").css("height");

    var req = parent.foo(w, h);
    console.log(req); // for debug purposes
});
</script>
<style>
body, html {
    margin: 0;
}
#container {
    width: 500px;
    height: 500px;
    background-color: red;
}
</style>
<div id="container"></div>
</body>
0 голосов
/ 30 сентября 2008

Это немного сложнее, поскольку вы должны знать, когда страница iframe загрузилась, что затруднительно, когда вы не контролируете ее содержимое. Можно добавить обработчик загрузки в iframe, но я пробовал это в прошлом, и в браузерах он ведет себя совершенно по-разному (не думаю, кто самый раздражающий ...). Возможно, вам придется добавить на страницу iframe функцию, которая выполняет изменение размера, и внедрить некоторый сценарий в контент, который либо прослушивает события загрузки, либо изменяет размер события, который затем вызывает предыдущую функцию. Я думаю добавить функцию на страницу, так как вы хотите убедиться, что она безопасна, но я понятия не имею, насколько легко это будет сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...