重複の可能性:
コンテンツに基づいて iframe のサイズを変更する
iFrame を読み込んでいて、親が iFrame のコンテンツの高さに基づいて高さを自動的に変更するようにしたいと考えています。
簡単に言えば、すべてのページが同じドメインに属しているため、クロスサイト スクリプティングの問題に遭遇することはありません。
重複の可能性:
コンテンツに基づいて iframe のサイズを変更する
iFrame を読み込んでいて、親が iFrame のコンテンツの高さに基づいて高さを自動的に変更するようにしたいと考えています。
簡単に言えば、すべてのページが同じドメインに属しているため、クロスサイト スクリプティングの問題に遭遇することはありません。
他の要素でscrollHeight
は、DOM オブジェクトの を使用し、それに応じて高さを設定します。これがiframeで機能するかどうかはわかりませんが(すべてについて少し変わっているため)、試してみる価値は確かにあります.
編集:周りを見回した後、一般的なコンセンサスは、次を使用してiframe内から高さを設定することoffsetHeight
です:
function setHeight() {
parent.document.getElementById('the-iframe-id').style.height = document['body'].offsetHeight + 'px';
}
そしてそれを添付して、iframe-body のonLoad
イベントで実行します。
たまたまあなたの質問にたどり着いたのですが、解決策があります。しかし、それはjqueryにあります。シンプルすぎる。
$('iframe').contents().find('body').css({"min-height": "100", "overflow" : "hidden"});
setInterval( "$('iframe').height($('iframe').contents().find('body').height() + 20)", 1 );
ほら!
乾杯!:)
編集: div メソッドではなく iframe メソッドに基づくリッチ テキスト エディターがあり、新しい行ごとに展開する場合は、このコードで十分です。
これは、すべてのブラウザとクロスドメインで機能する非常にシンプルなソリューションです。
まず、これは、iframeを含むhtmlページが100%の高さに設定され、iframeがcssを使用して100%の高さになるようにスタイル設定されている場合、cssはすべてを自動的にサイズ変更するという概念に基づいています。
コードは次のとおりです。
<head>
<style type="text/css">
html {height:100%}
body {
margin:0;
height:100%;
overflow:hidden
}
</style>
</head>
<body>
<iframe allowtransparency=true frameborder=0 id=rf sandbox="allow-same-origin allow-forms allow-scripts" scrolling=auto src="http://www.externaldomain.com/" style="width:100%;height:100%"></iframe>
</body>
@ShripadK による解決策が最も役立つことがわかりましたが、複数の iframe がある場合は機能しません。私の修正は次のとおりです。
function autoResizeIFrame() {
$('iframe').height(
function() {
return $(this).contents().find('body').height() + 20;
}
)
}
$('iframe').contents().find('body').css(
{"min-height": "100", "overflow" : "hidden"});
setTimeout(autoResizeIFrame, 2000);
setTimeout(autoResizeIFrame, 10000);
$('iframe').height($('iframe').contents().find('body').height() + 20)
すべてのフレームの高さを同じ値、つまり最初のフレームのコンテンツの高さに設定します。height()
そのため、値の代わりに関数でjquery を使用しています。このようにして、個々の高さが計算されます+ 20
iframe スクロールバーの問題を回避するためのハックです。この数値は、スクロールバーのサイズよりも大きくする必要があります。ハッキングはおそらく回避できますが、iframe のスクロールバーを無効にします。setTimeout
私の場合、代わりに使用setInterval(..., 1)
してCPU負荷を減らしますIE 5.5 以降では、contentWindow プロパティを使用できます。
iframe.height = iframe.contentWindow.document.scrollHeight;
Netscape 6 (Firefox も想定) では、contentDocument プロパティ:
iframe.height = iframe.contentDocument.scrollHeight
私の解決策(jqueryを使用):
<iframe id="Iframe1" class="tabFrame" width="100%" height="100%" scrolling="no" src="http://samedomain" frameborder="0" >
</iframe>
<script type="text/javascript">
$(function () {
$('.tabFrame').load(function () {
var iframeContentWindow = this.contentWindow;
var height = iframeContentWindow.$(document).height();
this.style.height = height + 'px';
});
});
</script>
background
私の回避策は、CSSとプロパティで予想されるソースページサイズをはるかに超える高さ/幅をiframeに設定することtransparent
です。
iframeでとに設定allow-transparency
します。true
scrolling
no
表示されるのは、使用するソースファイルだけです。IE8、Firefox 3、Safariで動作します。
Oli には、私にとって有効な解決策があります。記録のために、iFrame 内のページは JavaScript によってレンダリングされるため、offsetHeight を報告する前にごくわずかな遅延が必要になります。これらの行に沿ったもののように見えます:
$(document).ready(function(){
setTimeout(setHeight);
});
function setHeight() {
alert(document['body'].offsetHeight);
}
これは、プロトタイプを使用して見つけた最も簡単な方法です。
Main.html:
<html>
<head>
<script src="prototype.js"></script>
<script>
function init() {
var iframe = $(document.getElementById("iframe"));
var iframe_content = $(iframe.contentWindow.document.getElementById("iframe_content"));
var cy = iframe_content.getDimensions().height;
iframe.style.height = cy + "px";
}
</script>
</head>
<body onload="init()">
<iframe src="./content.html" id="iframe" frameBorder="0" scroll="no"></iframe>
<br>
this is the next line
</body>
</html>
content.html:
<html>
<head>
<script src="prototype.js"></script>
<style>
body {
margin: 0px;
padding: 0px;
}
</style>
</head>
<body>
<div id="iframe_content" style="max-height:200px;">
Sub content<br>
Sub content<br>
...
...
...
</div>
</body>
</html>
これは (今のところ) すべての主要なブラウザーで動作するようです。
実際、パトリックのコードは私にとってもうまくいきました。それを行う正しい方法は、これに沿ったものです。
注:先にjqueryが少しあります:
if ($.browser.msie == false) {
var h = (document.getElementById("iframeID").contentDocument.body.offsetHeight);
} else {
var h = (document.getElementById("iframeID").Document.body.scrollHeight);
}