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').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';
}
답변
덜 복잡한 대답은 .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 );
답변
Chrome, Firefox 및 IE11에서 작동하는 다음을 발견했습니다.
$('iframe').load(function () {
$('iframe').height($('iframe').contents().height());
});
Iframes 콘텐츠로드가 완료되면 이벤트가 실행되고 IFrames 높이가 해당 콘텐츠의 높이로 설정됩니다. 이는 IFrame과 동일한 도메인 내의 페이지에서만 작동합니다.
답변
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)
답변
이 작업을 수행하기 위해 iframe 내부에 jquery가 필요하지는 않지만 코드가 훨씬 간단하기 때문에 사용합니다.
이것을 iframe 내부의 문서에 넣으십시오.
$(document).ready(function() {
parent.set_size(this.body.offsetHeight + 5 + "px");
});
작은 창에서 스크롤바를 제거하기 위해 위에 5 개를 추가했지만 크기가 완벽하지는 않습니다.
그리고 이것은 부모 문서 안에 있습니다.
function set_size(ht)
{
$("#iframeId").css('height',ht);
}
답변
이것은 나를 위해 일한 정답입니다
$(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();
});
답변
간단한 한 줄은 기본 최소 높이로 시작하여 내용 크기로 증가합니다.
<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>