jquery는로드 될 때 iframe 콘텐츠의 높이를 가져옵니다.


84

main.php의 iframe에로드중인 도움말 페이지 help.php가 있습니다. iframe에로드 된 페이지의 높이를 어떻게 알 수 있습니까?

iframe의 높이를 100 % 또는 자동으로 스타일링 할 수 없기 때문에 이것을 묻습니다. 그래서 자바 스크립트를 사용해야한다고 생각합니다. 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>

iFrame의 콘텐츠가 페이지와 동일한 도메인에서 제공됩니까?
Andrew

예,
Andrew

답변:


102

좋아 마침내 좋은 해결책을 찾았습니다.

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

일부 브라우저 (이전 Safari 및 Opera)는 CSS가 렌더링되기 전에 온로드가 완료되었다고보고하므로 마이크로 타임 아웃을 설정하고 비워두고 iframe의 src를 다시 할당해야합니다.

$('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';
}

이 솔루션은 위의 내용이 컨테이너 내의 iframe에서 크기를 가져 real
오면서

2
1 밀리의 setTimout 그냥 잘 작동합니다, 그래서 나는 같은 이벤트 루프의로드 이벤트 트리거를 믿고
조지 마우어

hhmmm 부모를로드 할 때 숨겨진 iframe의 높이를 얻는 방법은 누구나 알고 있습니다. 이 방법은 다시 0으로 제공
JT ...

1
document높이가 아닌 높이를 원할 수 있습니다 body. jQuery를 사용하면 $(this.contentWindow.document).height().
vpiTriumph 2013 년

이전에는 iframe.contentDocument.body.offsetHeight가 작동합니다. stackoverflow.com/questions/2684693/…
user1087079

50

덜 복잡한 대답은 .contents()iframe에 도달하는 데 사용 하는 것입니다. 그러나 흥미롭게도 본문의 패딩으로 인해 원래 답변에서 코드를 사용하여 얻은 것과 다른 값을 반환합니다.

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

이것이 도메인 간 통신을 위해 수행 한 방법이므로 불필요하게 복잡 할 수 있습니다. 먼저 iFrame의 문서에 jQuery를 넣습니다. 이렇게하면 더 많은 메모리를 소비하지만 스크립트를 한 번만로드하면되므로로드 시간이 늘어나서는 안됩니다.

iFrame의 jQuery를 사용하여 가능한 한 빨리 (onDOMReady) iframe 본문의 높이를 측정 한 다음 URL 해시를 해당 높이로 설정합니다. 그리고 상위 문서 onload에서 iframe의 위치를 ​​확인하고 필요한 값을 추출 하는 이벤트를 iFrame 태그에 추가 합니다. onDOMReady는 항상 문서의로드 이벤트 전에 발생하기 때문에 경쟁 조건이 문제를 복잡하게하지 않고 값이 올바르게 전달 될 것이라고 확신 할 수 있습니다.

다시 말해:

... Help.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);

... 그리고 상위 문서에서 :

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 );

안녕 앤드류 지금까지 아주 좋은 도움이 여기에 있습니다. contents ()는 훌륭하게 작동하지만 여전히 대역폭 조절기로 테스트해야합니다. innerHeight () 속성을 사용할 수 있습니다. 해시에 높이를 넣는 솔루션을 사용하여 FF (OSX)에 문제가 있습니다. FF는 무한 루프에서 getDocumentHeight () 함수를 계속로드하는 것 같습니다. Safari는 괜찮습니다 ..
FFish 2010 년

흥미 롭군. 이미 값이있는 경우 해시 설정을 방지하는 검사를 추가했습니다. 당신은 (예를 들어, 당신이 해시 값 Help.php을로드하는 경우이를 조정할 필요가 있습니다 <iframe src="../Help.php#introduction" />)
앤드류

그건 그렇고, 높이의 차이를 조정할 수 있다고 가정하면 해시를 사용하여 iframe 외부로 통신 할 필요가 없을 것입니다. 해시 방법을 사용하는 경우 sleep(5)Help.php에를 넣는 것도 경쟁 조건을 테스트하는 좋은 방법입니다. iframe이 onLoad이전에 어떻게 든 실행 onDOMReady되면 여기에 표시됩니다.
Andrew

23

Chrome, Firefox 및 IE11에서 작동하는 다음을 발견했습니다.

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

Iframes 콘텐츠로드가 완료되면 이벤트가 실행되고 IFrames 높이가 해당 콘텐츠의 높이로 설정됩니다. 이는 IFrame과 동일한 도메인 내의 페이지에서만 작동합니다.


잘 작동하지만 너비에 대해서는 이렇게해야합니다. 그렇지 않으면 내용이 잘립니다. $ ( 'iframe'). width ($ ( 'iframe'). contents (). width () + 30);
Geomorillo 2014

@AminGhaderi 파이어 폭스 40.0.3에서 잘 작동합니다
mixkat

@mixkat 나는이 솔루션 과이 주제의 모든 솔루션을 통해 iframe에 웹 사이트를로드하지만 저에게는 작동하지 않습니다! 이 솔루션은 한 페이지에서 작동하고 웹 사이트를 iframe에로드 할 때 작동하지 않는다고 생각합니다. 내 영어는 매우 나쁘다, 나는 당신이 이해하기를 바랍니다.
Amin Ghaderi 2015 년

@AminGhaderi 내가 이것을 맞으면 사이트의 모든 페이지에서 이것이 작동 할 것으로 기대하지만 물론 프레임을로드 할 때 한 번만 실행되므로 모든 페이지에서 작동하지 않습니다. 따라서 첫 번째 페이지에서는 잘 작동하지만 더 긴 페이지에서 작동하려면 새 페이지로 프레임을 다시로드하거나 다른 지점에서 contents.height를 호출하여 다시 수행해야합니다. 당신의 흐름
mixkat 2015-09-10

9

jQuery없이이 작업을 수행하는 코드는 요즘 사소합니다.

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

이벤트 후크를 해제하려면 :

frame.removeEventListener('load', syncHeight)

3
멋지고 간단합니다! 불행하게도 :( 도메인 간 iframe을 작동하지
TimoSolo

3
네, 운이 좋지 않습니다. 이를 위해 iframe-resizer 라이브러리를 활용합니다. 물론 작동하려면 두 도메인을 모두 제어해야합니다.
cchamberlain

6

이 작업을 수행하기 위해 iframe 내부에 jquery가 필요하지는 않지만 코드가 훨씬 간단하기 때문에 사용합니다.

이것을 iframe 내부의 문서에 넣으십시오.

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

작은 창에서 스크롤바를 제거하기 위해 위에 5 개를 추가했지만 크기가 완벽하지는 않습니다.

그리고 이것은 부모 문서 안에 있습니다.

function set_size(ht)
{
$("#iframeId").css('height',ht);
}

iframe 내에 PDF를 표시하는 경우에도 작동하지 않습니다.
Jason Foglia

죄송하지만 "내부 프레임"의 예는 분명히 jQuery 기반입니다.
T-moty

4

이것은 나를 위해 일한 정답입니다

$(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();
    });

4

간단한 한 줄은 기본 최소 높이로 시작하여 내용 크기로 증가합니다.

<iframe src="http://url.html" onload='javascript:(function(o){o.style.height=o.contentWindow.document.body.scrollHeight+"px";}(this));' style="height:200px;width:100%;border:none;overflow:hidden;"></iframe>



1

iframe 내부에서 SPA와 함께 작동 할 수있는 jQuery 무료 솔루션입니다.

document.getElementById('iframe-id').addEventListener('load', function () {
  let that = this;
  setTimeout(function () {
    that.style.height = that.contentWindow.document.body.offsetHeight + 'px';
  }, 2000) // if you're having SPA framework (angularjs for example) inside the iframe, some delay is needed for the content to populate
});

1

이것은 내 ES6 친화적 인 no-jquery입니다.

document.querySelector('iframe').addEventListener('load', function() {
    const iframeBody = this.contentWindow.document.body;
    const height = Math.max(iframeBody.scrollHeight, iframeBody.offsetHeight);
    this.style.height = `${height}px`;
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.