it-swarm.com.ru

Изменение размера кросс-доменной высоты Iframe

Я пытаюсь изменить параметр высоты iframe на тот же пиксель страницы, которая загружается в iframe. Страница, которая загружается в iframe, приходит из другого домена.

Внутри iframe будут загружены разные страницы, что приведет к изменению высоты содержимого iframe, поэтому мне нужно будет захватить высоту содержимого iframe и применить ее к параметру высоты iframe.

Вот пример того, о чем я говорю: http://jsfiddle.net/R7Yz9/3/

<div class="site"><a href="http://Amazon.com/" target="_top">Amazon </a></div>
<div class="site"><a href="http://cnn.com/" target="_top">Cnn </a></div>
<div class="site"><a href="http://wikipedia.org/" target="_top">Wikipedia </a></div>
<iframe id="source" src="http://Amazon.com/" frameborder="0" scrolling="no" width="100%" height="100%"></iframe>

,.

$(document).ready(function() {
    var iframe = $( "#source" );
    $( "a[target=_top]" ).click( function(){
        iframe.attr( "src", this.href );
        return false;
    }); 
});
29
user874185

Вот небольшая библиотека, которая решает все проблемы с размером iFrames для их содержимого.

https://github.com/davidjbradshaw/iframe-resizer

Он решает междоменную проблему с помощью API пост-сообщения, а также обнаруживает изменения содержимого iFrame несколькими различными способами.

Работает во всех современных браузерах и IE8 и выше.

EDIT: Для определения междоменной высоты iframe у вас также должен быть доступ к реализации сценария на странице iframe.

26
David Bradshaw

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

На странице встраивания (содержащей iframe):

<iframe frameborder="0" id="sizetracker" src="http://www.hurtta.com/Services/SizeTracker/DE" width="100%"></iframe>
<script type="text/javascript">
  // Create browser compatible event handler.
  var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
  var eventer = window[eventMethod];
  var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message";
  // Listen for a message from the iframe.
  eventer(messageEvent, function(e) {
    if (isNaN(e.data)) return;

    // replace #sizetracker with what ever what ever iframe id you need
    document.getElementById('sizetracker').style.height = e.data + 'px';

  }, false);
</script>

На встроенной странице (iframe):

<script type="text/javascript">
function sendHeight()
{
    if(parent.postMessage)
    {
        // replace #wrapper with element that contains 
        // actual page content
        var height= document.getElementById('wrapper').offsetHeight;
        parent.postMessage(height, '*');
    }
}

// Create browser compatible event handler.
var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
var eventer = window[eventMethod];
var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message";

// Listen for a message from the iframe.
eventer(messageEvent, function(e) {

    if (isNaN(e.data)) return;

    sendHeight();

}, 
false);
</script>
7
MTJ

Вы также должны иметь доступ на сайт, который вы будете iframing. я нашел лучшее решение здесь: https://Gist.github.com/MateuszFlisikowski/91ff99551dcd90971377

yourotherdomain.html

<script type='text/javascript' src="js/jquery.min.js"></script>
<script type='text/javascript'>
  // Size the parent iFrame
  function iframeResize() {
    var height = $('body').outerHeight(); // IMPORTANT: If body's height is set to 100% with CSS this will not work.
    parent.postMessage("resize::"+height,"*");
  }

  $(document).ready(function() {
    // Resize iframe
    setInterval(iframeResize, 1000);
  });
</script>

ваш сайт с iframe

<iframe src='example.html' id='edh-iframe'></iframe>
<script type='text/javascript'>
  // Listen for messages sent from the iFrame
  var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
  var eventer = window[eventMethod];
  var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message";

  eventer(messageEvent,function(e) {
    // If the message is a resize frame request
    if (e.data.indexOf('resize::') != -1) {
      var height = e.data.replace('resize::', '');
      document.getElementById('edh-iframe').style.height = height+'px';
    }
  } ,false);
</script>
2
Joy Picar

Вы получаете высоту содержимого iframe, например как это:

document.getElementById('iframe-id').contentWindow.document.body.scrollHeight

Обновление

Там могут быть проблемы с кросс-доменом, хотя. Вот несколько источников, показывающих разные подходы:

http://css-tricks.com/cross-domain-iframe-resizing/

Как получить высоту кросс-домена iframe

Измените высоту iframe в соответствии с высотой содержимого

Изменение размера фрейма в зависимости от содержимого

Получить значение поля ввода внутри фрейма

Примечание: последние показывают, как получить доступ к полю, но принцип одинаков для доступа к росту.

2
LGSon

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

Добавьте следующий код к загружаемым страницам (возможно, в заголовке). Этот код отправляет сообщение, содержащее высоту HTML-контейнера, каждый раз, когда обновляется DOM (если вы загружаетесь с отложенной загрузкой) или размер окна изменяется (когда пользователь изменяет браузер).

window.addEventListener("load", function(){
    if(window.self === window.top) return; // if w.self === w.top, we are not in an iframe 
    send_height_to_parent_function = function(){
        var height = document.getElementsByTagName("html")[0].clientHeight;
        //console.log("Sending height as " + height + "px");
        parent.postMessage({"height" : height }, "*");
    }
    // send message to parent about height updates
    send_height_to_parent_function(); //whenever the page is loaded
    window.addEventListener("resize", send_height_to_parent_function); // whenever the page is resized
    var observer = new MutationObserver(send_height_to_parent_function);           // whenever DOM changes PT1
    var config = { attributes: true, childList: true, characterData: true, subtree:true}; // PT2
    observer.observe(window.document, config);                                            // PT3 
});

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

<script>
window.addEventListener("message", function(e){
    var this_frame = document.getElementById("healthy_behavior_iframe");
    if (this_frame.contentWindow === e.source) {
        this_frame.height = e.data.height + "px";
        this_frame.style.height = e.data.height + "px";
    }
})
</script>
0
Ulad Kasach

В javascript нет опций для определения высоты междоменной высоты iframe, но вы можете сделать что-то подобное с помощью некоторого программирования на стороне сервера. Я использовал PHP для этого примера

<code>
    <?php
$output = file_get_contents('http://yourdomain.com');
?>
<div id='iframediv'>
    <?php echo $output; ?>
</div>

<iframe style='display:none' id='iframe' src="http://yourdomain.com" width="100%" marginwidth="0" height="100%" marginheight="0" align="top" scrolling="auto" frameborder="0" hspace="0" vspace="0"> </iframe>

<script>
if(window.attachEvent) {
    window.attachEvent('onload', iframeResizer);
} else {
    if(window.onload) {
        var curronload = window.onload;
        var newonload = function(evt) {
            curronload(evt);
            iframeResizer(evt);
        };
        window.onload = newonload;
    } else {
        window.onload = iframeResizer;
    }
}
   function iframeResizer(){
        var result = document.getElementById("iframediv").offsetHeight;

        document.getElementById("iframe").style.height = result;
        document.getElementById("iframediv").style.display = 'none';
        document.getElementById("iframe").style.display = 'inline';
    }
</script>
</code>
0
Santhosh Fernando