S_a_k_Uの日記みたいなDB

~サクゥーと呼ばないで~

フレームを使用しているかどうか

先日の解決策を考えてみました。
自分自身の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>