jquery get height of iFrame content when loaded

Mam stronę pomocy, pomocy.php, które Ładuję wewnątrz iframe w main.php Jak Mogę uzyskać wysokość tej strony po załadowaniu jej do ramki iframe?

Pytam o to, ponieważ nie mogę stylizować wysokości do iframe na 100% lub auto. Dlatego myślę, że muszę używać javascript.. Używam jQuery

CSS:

body {
    margin: 0;
    padding: 0;
}
.container {
    width: 900px;
    height: 100%;
    margin: 0 auto;
    background: silver;
}
.help-div {
    display: none;
    width: 850px;
    height: 100%;
    position: absolute;
    top: 100px;
    background: orange;
}
#help-frame {
    width: 100%;
    height: auto;
    margin:0;
    padding:0;
}

JS:

$(document).ready(function () {
    $("a.open-help").click(function () {
        $(".help-div").show();
        return false;
    })
})

HTML:

<div class='container'>
    <!-- -->
    <div class='help-div'>
        <p>This is a div with an iframe loading the help page</p>
        <iframe id="help-frame" src="../help.php" width="100%" height="100%" frameborder="1"></iframe>
    </div>  <a class="open-help" href="#">open Help in iFrame</a>

    <p>hello world</p>
    <p>hello world</p>
    <p>hello world</p>
    <p>hello world</p>
    <p>hello world</p>
</div>
Author: karthikr, 2010-10-02

7 answers

Ok w końcu znalazłem dobre rozwiązanie:

$('iframe').load(function() {
    this.style.height =
    this.contentWindow.document.body.offsetHeight + 'px';
});

Ponieważ niektóre przeglądarki (starsze Safari i Opera) raport onload zakończone przed CSS renderuje trzeba ustawić Micro Timeout i blank out i ponownie przypisać src iframe.

$('iframe').load(function() {
    setTimeout(iResize, 50);
    // Safari and Opera need a kick-start.
    var iSource = document.getElementById('your-iframe-id').src;
    document.getElementById('your-iframe-id').src = '';
    document.getElementById('your-iframe-id').src = iSource;
});
function iResize() {
    document.getElementById('your-iframe-id').style.height = 
    document.getElementById('your-iframe-id').contentWindow.document.body.offsetHeight + 'px';
}
 93
Author: FFish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-04 05:29:16

Mniej skomplikowaną odpowiedzią jest użycie .contents(), aby dostać się do iframe. Co ciekawe, zwraca inną wartość niż to, co otrzymuję za pomocą kodu w mojej pierwotnej odpowiedzi, ze względu na wyściółkę na ciele, jak sądzę.

$('iframe').contents().height() + 'is the height'

W ten sposób zrobiłem to dla komunikacji między domenami, więc obawiam się, że to może niepotrzebnie skomplikowane. Po pierwsze, umieściłbym jQuery wewnątrz dokumentu iFrame; to pochłonie więcej pamięci, ale nie powinno wydłużyć czasu ładowania, ponieważ tylko skrypt musi być załadowany raz.

Użyj jQuery iFrame 'a, aby zmierzyć wysokość ciała iframe' a tak wcześnie, jak to możliwe (onDOMReady), a następnie Ustaw hash adresu URL na tę wysokość. W dokumencie nadrzędnym Dodaj zdarzenie onload do znacznika iFrame, które spojrzy na lokalizację ramki iframe i wyodrębni potrzebną wartość. Ponieważ onDOMReady będzie zawsze występował przed wydarzeniem ładowania dokumentu, możesz być dość pewien, że wartość zostanie poprawnie przekazana bez warunku wyścigu komplikuje sprawy.

Innymi słowy:

...W pomocy.php:

var getDocumentHeight = function() {
    if (location.hash === '') { // EDIT: this should prevent the retriggering of onDOMReady
        location.hash = $('body').height(); 
        // at this point the document address will be something like help.php#1552
    }
};
$(getDocumentHeight);

...oraz w dokumencie nadrzędnym:

var getIFrameHeight = function() {
    var iFrame = $('iframe')[0]; // this will return the DOM element
    var strHash = iFrame.contentDocument.location.hash;
    alert(strHash); // will return something like '#1552'
};
$('iframe').bind('load', getIFrameHeight );
 44
Author: Andrew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-03 01:44:36

Znalazłem następujące do pracy na Chrome, Firefox i IE11:

$('iframe').load(function () {
    $('iframe').height($('iframe').contents().height());
});

Gdy zawartość ramek iFrame zostanie załadowana, zdarzenie zostanie wywołane i ustawi wysokość ramek iframe na wysokość jego zawartości. Będzie to działać tylko dla stron w tej samej domenie, co w ramce IFrame.

 16
Author: Jack Zach Tibbles,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-11 06:09:12

Nie potrzebujesz do tego jquery wewnątrz ramki iframe, ale używam go, ponieważ kod jest o wiele prostszy...

Umieść to w dokumencie wewnątrz ramki iframe.

$(document).ready(function() {
  parent.set_size(this.body.offsetHeight + 5 + "px");  
});

Dodano pięć powyżej, aby wyeliminować pasek przewijania w małych oknach, nigdy nie jest idealny pod względem rozmiaru.

I to wewnątrz twojego dokumentu rodzica.

function set_size(ht)
{
$("#iframeId").css('height',ht);
}
 5
Author: RkaneKnight,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-26 18:44:38

Kod do zrobienia tego bez jQuery jest obecnie trywialny:

const frame = document.querySelector('iframe')
function syncHeight() {
  this.style.height = `${this.contentWindow.document.body.offsetHeight}px`
}
frame.addEventListener('load', syncHeight)

Aby odłączyć Zdarzenie:

frame.removeEventListener('load', syncHeight)
 4
Author: cchamberlain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-02 14:51:00

To jest poprawna odpowiedź, która zadziałała dla mnie

$(document).ready(function () {
        function resizeIframe() {
            if ($('iframe').contents().find('html').height() > 100) {
                $('iframe').height(($('iframe').contents().find('html').height()) + 'px')
            } else {
                setTimeout(function (e) {
                    resizeIframe();
                }, 50);
            }
        }
        resizeIframe();
    });
 0
Author: Javier Gordo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-15 20:23:05

Zaakceptowana odpowiedź {[1] } spowoduje teraz błąd a.indexOf is not a function. Można aktualizować do:

$('iframe').on('load', function() {
  // ...
});

Kilka innych podobnych do .load przestarzałych od jQuery 1.8: błąd "Uncaught TypeError: a. indexOf nie jest funkcją" podczas otwierania nowego projektu Fundacji

 0
Author: Ryan J. Stout,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-14 19:34:41