[JavaScript]JavaScriptでiframeの中身の操作
前回、「iframe」タグを用いたメニューの作成方法をご紹介しました。この方法だとIEでも後ろの「select」タグがきちんと隠れるように表示できます。
しかし、この方法だと「div」タグを使用した方法のように表示のサイズをないように応じて動的に変更させたい場合には、うまくいきません。
今回は、それを回避できる方法をご紹介したいと思います。ただし、この方法はIE以外ではあまりうまくいかないのでブラウザごとに処理を分けてIEでのみ実施したほうがいいです。
方法といってもそれほど難しい方法ではなく単純に「iframe」タグの中身を動的にJavaScriptで書き換えるのと「iframe」タグのスタイルで「width」と「height」に値をあたえて大きさを調整するといった方法です。
では、実際のサンプルです。メニューは、サブメニューのリンクをクリックして閉じてください。
中身を見ていくと
<iframe id="sample3" class="submenu" style="display:none;z-index:1000;" frameborder="0"></iframe>
function show_iframe( id )
{
var target = document.getElementById( id );
var idoc = null;
if( target.contentDocument )
idoc = target.contentDocument;
else
idoc = document.frames[id].document;
html = '<html><head><title></title><head><body style="margin:0px">\r\n';
html += '<table style="width:100%;margin:0px">\r\n';
html += '<tr><td style="white-space:nowrap"><a href="#" onclick="window.parent.close_iframe( \'sample\' )">サブメニュー1</a></td></tr>\r\n';
html += '<tr><td style="white-space:nowrap"><a href="#" onclick="window.parent.close_iframe( \'sample\' )">サブメニュー2</a></td></tr>\r\n';
html += '<tr><td style="white-space:nowrap"><a href="#" onclick="window.parent.close_iframe( \'sample\' )">サブメニュー3</a></td></tr>\r\n';
html += '<tr><td style="white-space:nowrap"><a href="#" onclick="window.parent.close_iframe( \'sample\' )">ちょっと長くなったサブメニュー4</a></td></tr>\r\n';
html += '<tr><td style="white-space:nowrap"><a href="#" onclick="window.parent.close_iframe( \'sample\' )">さらにちょっと長くなったサブメニュー5</a></td></tr>\r\n';
html += '</table>\r\n';
html += '</body></html>\r\n';
idoc.open();
idoc.write( html );
idoc.close();
target.style.display = '';
idoc.body.offsetHeight;
idoc.body.offsetWidth;
target.style.height = idoc.body.scrollHeight;
target.style.width = idoc.body.scrollWidth;
}
function close_iframe( id )
{
var target = document.getElementById( id );
target.style.display = 'none';
}
JavaScriptの内容は、iframe内のdocumentオブジェクトを取得してそれにHTMLの内容を書き込んでいます。ドキュメントとの取得方法は、IEとFireFoxで違っていてFireFoxでは「target.contentDocument」、IEでは「document.frames[id].document;」として取得しています。
取得したオブジェクトに対して「open」「write」「close」で内容を書き込んでいきます。
その後、サイズを繁栄させるのですが、このままではまだ画面に表示していないので実際のサイズはわかりません。そこで一度、「target.style.display='';」を実行して表示させてから、画面のサイズを取得しています。
ここでなぜか、関係のない
idoc.body.offsetWidth;
を行っていますが、これはその後の「idoc.body.scrollHeight」で値を取得するために呼び出しています。なぜかわかりませんが一度、この呼び出し(どちらか一方でいいです)をしないときちんと取れなかったので呼び出しています。
あとは、取得した表示領域の大きさを「iframe」タグに反映させれば、うまい具合に表示されるようになります。
この方法で問題があるのが、MacのSafariで動作しないということです。おそらくセキュリティの問題とは、思われますが気をつけてください。
それと当然のことですが、「iframe」タグ内にドメインの違うHTMLを表示するとセキュリティ上の制約で操作できないので「src」には、何も記述しないようにしてください。
1つにまとめたサンプルです。
今回の記事で今年は、終わりになります。今年は、独立したりといろいろ激動の年になりましたが来年はいよいよ製品のリリースをして本格的なスタートを行いたいと思っています。
来年もよろしくお願いいたします。
| 固定リンク | コメント (0) | トラックバック (0)





最近のコメント