先日の解決策を考えてみました。
自分自身のHTMLドキュメントがフレームで表示されているかどうかは、JavaScriptで下記のような評価で検出できます。
alert(window == window.top);
また、自分自身のHTMLドキュメントでframeタグが使用されているかどうかは、下記のような評価で検出できます(これはソースの表示でも確認可能なので不要?)。
var elem = window.document.getElementsByTagName("frame");
if (elem != null) {
alert((elem.length > 0));
} else {
alert(false);
}
HTML/JavaScriptの生成を、MyfacesやTrinidadなどのフレームワークに任せていると、どのようなHTMLドキュメントが生成されているか判らなくなるので…
下記のHTML/JavaSctriptで動作確認しました(IE6SP2とFF3.0.7)。
とりあえず、そのHTMLがtopで表示されているかどうかを検出しますので、frameの中のframe(ネスト)も考慮されていると思います。
【frame.html】 <html> <script type="text/javascript"> alert("frame:" + (window == window.top)); </script> <frameset rows="100,*"> <frame src="frame1.html" name="top"> <frameset cols="150,*"> <frame src="frame2.html" name="left"> <frame src="frame3.html" name="right"> </frameset> <noframes> このページはフレームを使用しています。 </noframes> </frameset> <html> 【frame1.html】 <html> <body> frame1 </body> <script type="text/javascript"> alert("frame1:" + (window == window.top)); var elem_frame = window.document.getElementsByTagName("frame"); var elem_iframe = window.document.getElementsByTagName("iframe"); alert("frame1\nframe tag:" + elem_frame.length + "\niframe tag:" + elem_iframe.length); if ((window == window.top) == false) { var top_elem_frame = window.top.document.getElementsByTagName("frame"); var top_elem_iframe = window.top.document.getElementsByTagName("iframe"); alert("top\nframe tag:" + top_elem_frame.length + "\niframe tag:" + top_elem_iframe.length); } </script> <html> ※【frame2.html】と【frame3.html】は省略
念のためiframeタグも確認しましたが、同じ結果が得られます。
<html> <script type="text/javascript"> alert("frame:" + (window == window.top)); </script> <body> <iframe src="frame1.html" name="frame1" width="200" height="150"> </iframe> <iframe src="frame2.html" name="frame2" width="200" height="150"> </iframe> <iframe src="frame3.html" name="frame3" width="200" height="150"> </iframe> </body> <html>