いつもお世話になっております。
フレームを表示する HTMLソースで下記のようなものがあります。
<!-- ここから -->
<FRAMESET
cols=161,*><FRAME name=left src=menu.html><FRAME name=right
src=/tourokusakuhin4.html>
<NOFRAMES>
<BODY>
<P>このページを表示するには、フレームをサポートしているブラウザが必要です。</P>
</BODY>
</NOFRAMES></FRAMESET>
<!-- ここまで -->
このように、フレームをサポートしているブラウザでは通常フレームの配置(表示)のみが行わ
れるようです。フレームの配置をやるとともに、これ以外に JavaScript の実行等を行わせる
ことはできないでしょうか。
仕様には、
| SCRIPT要素は、HTML文書にスクリプトを組み込むもので、
| HEAD要素あるいは BODY要素に、何回出現してもよい。
とありますね。
こんな風でよいのでは。
<HEAD>
<SCRIPT>
ご自由に
</SCRIPT>
</HEAD>
<FRAMESET ...>
省略
</FRAMESET>
dairygoods 様、いつもありがとうございます。
<BODY> に記述したスクリプトをそのまま <HEAD> に移し換えてもいいと伺って(この点につい
てはまったくわかっていませんでした。不勉強で申しわけありません)、問題になっているフレ
ーム表示をともなう html ファイルの <HEAD> にJavaScript を記述してやってみましたがう
まくいきませんでした。それで、フレームをともなわないファイルの <BODY> にJavaScript
を記述した、
(1) http://cgi.niji.jp/home/ashizuka/postertown/snow01.htm
を用意し、JavaScript が正常に実行されることを確認しました。次に、このスクリプトをそっ
くり <HEAD> に移した
(2) http://cgi.niji.jp/home/ashizuka/postertown/snow02.htm
を作成しましたが、これは JavaScript は実行されませんでした。
(2) を『ホームページビルダー2001』でプレビューすると、
ライン 23
文字 5
エラー オブジェクトがありません
というメッセージが表示されます。『ライン 23』が『 doc_width =
document.body.clientWidth;』の行であることは確認できています。『doc_width』が 5 カ
ラム目から始まっていますが、この変数は 17行目に定義されています。
別のスクリプトで試したときも、同様に <BODY> だとうまくいくのに <HEAD> では実行され
ず、『ホームページビルダー2001』のプレビューでもやはり同様のエラーになることがわかり
ました。
やはり何か定義のしかたに問題があるのでしょうか?以上読んでいただいて、おわかりになるこ
とがありましたら教えていただければ幸いです。どうかよろしくお願いいたします。
<HEAD> の解析中は、
まだ <BODY> を解析してないですから、
document.body もまだ存在しません。
body にアクセスしたければ、その部分を関数にして、
<BODY> の onLoad から呼び出してやるなどする必要があります。
さらに、フレームを使う場合、フレームのロードが終わっても、
各フレーム内のドキュメントのロードが終わっているとは限らない
という点にも注意する必要があるでしょう。
ありがとうございます。
dairygoods 様が書いてくださった説明を何度か読ませていただきましたが、私の読解力では理
解することが出来ませんでした。『body にアクセスしたければ、その部分を関数にして、
<BODY> の onLoad から呼び出してやるなどする必要があります。』というのは、下記の
html ソースに JavaScript をどのように挿入すればいいのでしょうか。
<!-- ここから -->
<!DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.0 Transitional//EN>
<HTML><HEAD>
<TITLE>サンプル</TITLE>
<META http-equiv=Content-Type content=text/html; charset=Shift_JIS>
<META content=IBM HomePage Builder 2001 V5.0.0 for Windows name=GENERATOR>
<META http-equiv=Content-Style-Type content=text/css></HEAD>
<FRAMESET
cols=161,*><FRAME name=left src=menu.html><FRAME name=right
src=tourokusakuhin4.html>
<NOFRAMES>
<BODY>
<P>このページを表示するには、フレームをサポートしているブラウザが必要です。</P>
</BODY>
</NOFRAMES></FRAMESET>
</HTML>
<!-- ここまで -->
私の力不足で理解できないのは申し訳ありませんが、何とぞよろしくお願いいたします。
次の二つの違いは分かりますでしょうか?
<html>
<head>
<script>
alert(document.body); // ファイル解析の途中で実行される
</script>
</head>
<body>
...
</body>
</html>
<html>
<head>
<script>
function myfunc() {
alert(document.body); // ファイル全体を解析後に実行される
}
</script>
</head>
<body onload=myfunc()>
...
</body>
</html>
dairygoods 様
お世話になっております。
> 次の二つの違いは分かりますでしょうか?
二つの違いについては頭ではわかっているつもりですが、実際に
(3) http://cgi.niji.jp/home/ashizuka/postertown/snow03.htm
を作成しましたがエラーが出ます。すみませんが、このコーディングのやり方に間違いがあるで
しょうか。
また、フレームを使ったページの場合、 onload=myfunc() をどこに挿入すればいいのでし
ょうか。
何度も申し訳ありませんがどうかよろしくお願いいたします。
ドキュメントが完成した後で document.write() すると、
全体が書き換わってしまいます。
<html>
<body>ABC<script>document.write(DEF)</script></body>
</html>
<html>
<head>
<script>
function writetest() {
document.write(DEF); // ABCの後ろに追加されるわけではない
}
</script>
</head>
<body onload=writetest()>ABC</body>
</html>
そうすると、定義した変数や関数や何もかもなくなってしまうということです。
なので、どうしてもこの方法で推し進めたいなら、
function writetest() {
document.write(<html><head><script> function(以下略));
}
のように、HTML全部を書き直さなければなりません。
フレームの場合 frameset の onload に書けますが、
その場合 body は存在しないので、彪子さんが作っているような
body に何か書くプログラムでは無意味でしょう。
dairygoods 様
毎々ありがとうございます。ご返事が遅れて申し訳ありません。
dairygoods 様には、前回『偽のURLを表示させるには』でも大変ご親切に教えていただいてあ
りがとうございました。また機会がありましたらよろしくお願いいたします。