可能性のある複製:
コンテンツに基づいてiframeのサイズを変更
IFrameを読み込んでおり、iFrameのコンテンツの高さに基づいて親が自動的に高さを変更するようにします。
簡単に言うと、すべてのページは同じドメインに属しているため、クロスサイトスクリプティングの問題に遭遇するべきではありません。
他の要素では、DOMオブジェクトのscrollHeight
を使用し、それに応じて高さを設定します。これがiframeで機能するかどうかはわかりませんが(すべてについて少し気味が悪いので)、試してみる価値はあります。
編集:よく見てみると、一般的なコンセンサスは、offsetHeight
を使用してiframe内から高さを設定しています。
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%に設定し、cssを使用してiframeの高さを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>
これは ソリューション が私にとって最もうまくいきました。 jQueryとiframeの「.load」イベントを使用します。
私の解決策(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>
@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)
は、すべてのフレームの高さを同じ値、つまり最初のフレームのコンテンツの高さに設定します。そのため、値ではなく関数でjqueryのheight()
を使用しています。そのようにして、個々の高さが計算されます+ 20
_は、iframeスクロールバーの問題を回避するためのハックです。数値は、スクロールバーのサイズよりも大きくする必要があります。ハッキングはおそらく回避できますが、iframeのスクロールバーを無効にします。setInterval(..., 1)
の代わりにsetTimeout
を使用して、私の場合のCPU負荷を減らします。IE 5.5+では、contentWindowプロパティを使用できます。
iframe.height = iframe.contentWindow.document.scrollHeight;
Netscape 6では(Firefoxも想定)、contentDocumentプロパティ:
iframe.height = iframe.contentDocument.scrollHeight
実は-パトリックのコードも私にとってはうまくいきました。それを行う正しい方法は、これに沿ったものです:
注:少し先にjqueryがあります:
if ($.browser.msie == false) {
var h = (document.getElementById("iframeID").contentDocument.body.offsetHeight);
} else {
var h = (document.getElementById("iframeID").Document.body.scrollHeight);
}
私の回避策は、iframeにCSSで予想されるソースページサイズをはるかに超える高さ/幅を設定し、background
プロパティを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>
これは、これまでのところ、すべての主要なブラウザーで機能するようです。