JavaScriptが数えるフレームの数について

トップ > 気まぐれ実験 > JavaScriptが数えるフレーム数

JavaScriptが数えるフレームの数について

助け合いの掲示板で質問をもらったのをきっかけに、JavaScriptの実験をしてみました。

もともと JavaScript はそれほど多用したことがなかっただけに、あまり知らない分野でもあります。勉強も兼ねて色々調べてみたのですが、どうしても理解できなかったので、実験の結果だけ載せてみることにしました。(知っている方からの反応お待ちしてますm(__)m

もともとの質問は、、、検索エンジンや他のページのリンクから飛んでくる場合、作成者が意図したフレーム構成になっていないことが多いですよね。これを、 JavaScript を使って、作成者が意図したフレームから見せることが出来るように、強制的にリダイレクトしたい、、、という内容です。(ちょっと前は、この逆で、他のサイトからフレームの中に取り込まれて表示されるのを避けるために、フレームで表示されたらフレームを破棄するようなスクリプトを作って・・・というリクエストが多かった気がします。その時々で流行があるのでしょう。)

実際のスクリプトは下記のようなものです。

<body .....
.... onload="if (top.frames.length == 0) { location.replace('飛ばしたい場所.html') };">

ちょっとだけ解説すると、HTMLが表示されたら、top.frames.length でそのウィンドウのフレームの数を取得して、その数が「0」つまり、フレームで表示されていなければ 「飛ばしたい場所.html」 を表示する、というものです。これはこれでうまく動くのですが、このBODYの中に iframeタグでインラインフレームが作られていた場合に問題が起こりました。

iframe が使われているとうまく動かないのです。そこでとっさに思いついたのが、iframe もフレームの一種だから、フレームの数がその時点で top.frames.length=1 になっていて、上のスクリプトの条件を満たしていないので、ジャンプしないのでは・・・

そう思って、top.frames.length = = 1 と変えてみると、見事にジャンプするではありませんか(^^)/ 気をよくして、掲示板に「このように変更したら?」と提案してみました。そこまではよかったのですが、今度は、その質問された方がiframeを2つ使ったのです。top.frames.length = = 2 と変えたらしいのですが、そうすると、ジャンプしても、ジャンプした先で、またジャンプを繰り返す・・・よくわからない動きをする、という質問が来ました。

そこで、top.frames.length のカウントを検証するために、下記のようなスクリプトを書いて、その数を表示させてみました。するとどうでしょう、iframeの数がいくつになってもlengthは0のままです。数えていません。これはどういうことでしょうか?

<script language="JavaScript">
document.write(top.frames.length);
</script>
個です。

ですが、確かに、最初のスクリプトでは top.frames.length = = 1 の条件を満たして、ジャンプしてます。条件は満たす(1になっている)のに、表示は0。非常に疑問に思ったので、様々な条件でそのカウント数を調べてみたのが下です。

一つのページ内に iframe があり、フレーム表示されていない場合

  • 関数などで呼び出される場合にはtop.frames.lengthはiframeの数を返す。
  • document.writeなどで書き出された場合はボディータグの中ではiframeの数を返さない
  • この実験結果は「こちら(別窓)」で確認できます。

フレーム表示されている中の一つのページに iframe がある場合。

  • ヘッダー、ボディー、関数いずれで呼び出されてもフレームの数しか返さない
  • つまり、iframe の数は無視される。
  • この実験結果は「こちら(別窓)」で確認できます。

以上のような結果になりました。

まとめると、IEの場合ですが、単一ページに iframe がある場合、iframe の数が返される。ただし、関数以外から書き出された document.write等で表示された数は数えない。それ以外は、フレームの数を返す。ということでしょうか。

以上は、IE4.0、IE5.0、IE5.5、IE6.0で確認しました。
ネットスケープ、Opera(フリー版)については確認していないので、そのブラウザでご覧の方は、各自どうぞ・・・(^^;


つまり、質問されたように、ページの中で2つの iframe を使っていて、そのページが単独で表示された場合に、top.frames.length = = 2 で本来表示させたいフレームページにジャンプさせると、ジャンプ先でも、フレームを使って表示させている以上、top.frames.length = = 2 の条件が成立してしまい、再帰的にページが呼び出されて、IEがクラッシュしてしまう・・・つまりブラウザクラッシャーみたいな動きにになってしまうようです。(クラッシュしてもOKな方は「こちら(別窓)」からお試しください。。。)

もともと JavaScript はネットスケープ社が開発したもので、IEについているのは JavaScript じゃないのでは?といわれるとそれまでですが、JavaScript の実装方法については、ブラウザ間でかなり違いがあるのが実情です。

また、バグでは?と思われるような動きをすることも多々あり、あまり JavaScript に頼ったページを作りすぎると、それを見ている利用者側でかなり不具合を来たす場合もあるようです。

JavaScript はほどほどに、、、見る側の環境を考えてということでしょうか?ですが、これは JavaScriptに限ったことではなさそうです(笑

(2003/8/17 by あいまい)

追記:2008/1/7 今振り返ると、あれから6年ほどたって、ajaxがあたりまえの技術になり、javascriptの環境というのは大きく変わりましたね。技術についていけません・・・


トップ > 気まぐれ実験 > JavaScriptが数えるフレーム数

日時: 2008年01月07日 01:03
newsingに投稿BuzzurlにブックマークBuzzurlにブックマークlivedoorクリップに投稿 Choixにブックマーク イザ!ブックマーク このエントリーを含むはてなブックマーク
トップに戻る
このエントリーの所属カテゴリ: 気まぐれ実験の小部屋
このエントリーのタイトル:JavaScriptが数えるフレームの数について



copyright © 2000-2008 all rights reserved
あいまいモード・コム - rss2.0 atom
newsingに投稿BuzzurlにブックマークBuzzurlにブックマークlivedoorクリップに投稿 Choixにブックマーク イザ!ブックマーク このエントリーを含むはてなブックマーク