[解決済み] コンテンツに応じたiframeのサイズ変更
質問内容
iGoogleのようなアプリケーションを制作しています。他のアプリケーション(他のドメイン上)のコンテンツは、iframeを使用して表示されます。
iframeのコンテンツの高さに合うようにiframeのサイズを変更するにはどうすればよいですか?
Googleが使用しているjavascriptを解読しようとしましたが、難読化されており、ウェブで検索しても今のところ実りませんでした。
更新しました。 なお、コンテンツは他のドメインから読み込まれるので セイムオリジンポリシー が適用されます。
解決方法は?
私たちもこの種の問題を抱えていましたが、あなたの状況とは少し逆で、他のドメインのサイトにiframedコンテンツを提供していました。 同一生成元ポリシー も問題でした。何時間もグーグル検索に費やした後、最終的に(多少なりとも)実行可能な解決策を発見しました。
同一生成元ポリシーを回避する方法もありますが、iframedコンテンツとフレーミングページの両方を変更する必要があるので、両側で変更を要求する能力がない場合、この方法はあまり役に立たないと思います。
ブラウザの癖で、同じオリジンポリシーを回避することができます。javascriptは、独自ドメインのページ、またはフレーム化されたページと通信できますが、フレーム化されたページと通信することはできません。
www.foo.com/home.html, which iframes
|-> www.bar.net/framed.html, which iframes
|-> www.foo.com/helper.html
では
home.html
との通信が可能です。
framed.html
(イフレーミング)と
helper.html
(同一ドメイン)です。
Communication options for each page:
+-------------------------+-----------+-------------+-------------+
| | home.html | framed.html | helper.html |
+-------------------------+-----------+-------------+-------------+
| www.foo.com/home.html | N/A | YES | YES |
| www.bar.net/framed.html | NO | N/A | YES |
| www.foo.com/helper.html | YES | YES | N/A |
+-------------------------+-----------+-------------+-------------+
framed.html
にはメッセージを送ることができます。
helper.html
(iframed)が
ではなく
home.html
(子は親とクロスドメインで通信できない)。
ここで重要なのは
helper.html
からのメッセージを受信することができます。
framed.html
であり、かつ
は通信もできます。
で
home.html
.
つまり、基本的には
framed.html
を読み込むと、自分自身の高さを計算し、それを
helper.html
へのメッセージとなります。
home.html
が含まれる iframe のサイズを変更することができます。
framed.html
が座っています。
からメッセージを渡す最も簡単な方法を見つけました。
framed.html
から
helper.html
は、URLの引数を介していました。これを行うには
framed.html
は、iframe に
src=''
が指定されています。その
onload
が起動されると、自身の高さが評価され、この時点での iframe の src が
helper.html?height=N
ここに説明があります facebookの処理方法は、上記の私のよりも少し分かりやすいかもしれませんね。
コード
で
www.foo.com/home.html
の場合、以下のjavascriptコードが必要です(ちなみに、これはどのドメイン上の.jsファイルからも読み込むことができます)。
<script>
// Resize iframe to full height
function resizeIframe(height)
{
// "+60" is a general rule of thumb to allow for differences in
// IE & and FF height reporting, can be adjusted as required..
document.getElementById('frame_name_here').height = parseInt(height)+60;
}
</script>
<iframe id='frame_name_here' src='http://www.bar.net/framed.html'></iframe>
で
www.bar.net/framed.html
:
<body onload="iframeResizePipe()">
<iframe id="helpframe" src='' height='0' width='0' frameborder='0'></iframe>
<script type="text/javascript">
function iframeResizePipe()
{
// What's the page height?
var height = document.body.scrollHeight;
// Going to 'pipe' the data to the parent through the helpframe..
var pipe = document.getElementById('helpframe');
// Cachebuster a precaution here to stop browser caching interfering
pipe.src = 'http://www.foo.com/helper.html?height='+height+'&cacheb='+Math.random();
}
</script>
の内容
www.foo.com/helper.html
:
<html>
<!--
This page is on the same domain as the parent, so can
communicate with it to order the iframe window resizing
to fit the content
-->
<body onload="parentIframeResize()">
<script>
// Tell the parent iframe what height the iframe needs to be
function parentIframeResize()
{
var height = getParam('height');
// This works as our parent's parent is on our domain..
parent.parent.resizeIframe(height);
}
// Helper function, parse param from request string
function getParam( name )
{
name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
var regexS = "[\\?&]"+name+"=([^&#]*)";
var regex = new RegExp( regexS );
var results = regex.exec( window.location.href );
if( results == null )
return "";
else
return results[1];
}
</script>
</body>
</html>
関連
-
要素ツリー制御によるvueTreeテーブル
-
元のイベントが実行されなかった後に要素を追加するためのjQueryソリューション
-
[解決済み】JavaScriptの配列でforEachが関数でない不具合
-
[解決済み】JavaScriptでインラインIF文の書き方は?
-
[解決済み] IFrameからボーダーを取り除く
-
フロントエンド null のプロパティ 'disabled' を読み取れない 問題が解決された
-
OSSアップロードエラーを解決する: net::ERR_SSL_PROTOCOL_ERROR
-
[解決済み] jQuery/JavaScript:iframeのコンテンツにアクセスする
-
[解決済み] ウェブページがiframe内に読み込まれているのか、それともブラウザのウィンドウに直接読み込まれているのかを識別するにはどうしたらよいですか?
-
[解決済み] 親ページからiframe内のJavaScriptコードを呼び出す
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
JavaScriptの関数この指摘の問題を説明
-
vue3.0プロジェクトのアーキテクチャを構築するための便利なツール
-
vueディレクティブv-bindの使用と注意点
-
Vueでルートネスティングを実装する例
-
[解決済み】awaitは非同期関数でのみ有効です。
-
[解決済み】"フォームが接続されていないため、フォームの送信がキャンセルされました "というエラーの取得について
-
[解決済み】Node.jsで "Cannot find module "エラーを解決するには?
-
[解決済み】JavaScript TypeError: null のプロパティ 'style' を読み取ることができない
-
Uncaught TypeError: null のプロパティ 'offsetHeight' を読み取れませんでした。
-
JSクリックイベント - Uncaught TypeError: プロパティ 'onclick' に null を設定できません。