ボタンでフレームの大きさを変えるには?

[上に] [前に] [次に]
おがまん [E-Mail] [HomePage] 1999/11/10(水) 22:03:08
質問、またお願いします。
フレームの大きさをボタンを押したら変わるようにしたいです。
で、次のようなスクリプトを組みました。
親フレーム
<html><head><title></title>
<script language="JavaScript"><!--
function  frachange(i,j){
  document.write("<frameset cols='",i,",",j,"'><frame src=a.html><frame src=b.html></frameset>");
}
window.onload=frachange("20%","80%");
//--></script></head>
</html>

娘フレーム1 a.html
<html><head><title></title></head>
<body>
<form>
<input type="button" value="push" onclick="parent.frachange('80%','20%')">
</form>
</body></html>

子フレーム2 b.html
<html>
<body>aaa</body></html>

で、NC4.6で動かしてみたところ、最初の一回はちゃんと動きました。
でも、リロードしてもう一度ボタンを押してフレームの大きさを変えようとすると、
エラーが出て動かなくなりました。
 IE5.0では、一度も正常に動きませんでした。
なぜなのか、考えてみてもよくわかりませんでした。
どなたか、間違いが分かる方がおられましたら、よろしくお願いします。

Mugi [E-Mail] [HomePage] 1999/11/10(水) 23:51:38
NNでは使えませんがこんな方法があります。
http://www2f.biglobe.ne.jp/~takan/javac/_cgi-bin/board/messages/468.html

たかまろ 1999/11/11(木) 00:18:50
横やりから便乗・・・・・

それ、いただきます。 (^^;)

Mugi [E-Mail] [HomePage] 1999/11/11(木) 00:57:51
write() でframesetを書き出す方法ですが、動かないの当たり前。
まず、window.onload=関数では 引数指定はエラーになります。
window.onload=onload
function onload(){frachange("20%","80%")}
とするのが妥当。
window.onload=new Function('frachange("20%","80%")') も平気です。

つぎに、2度目から動かないのは、最初にonload=を使ってfrachangeが
実行された時点で、フレームの親のソースは新しいものに変わっていて、
スクリプトを含んでいません。
だから、frachangeという関数がないというエラーになるのです。
frachangeで書き出すものを htmlタグ〜scriptタグ〜framesetなど〜</html>までの完全なものにすれば、平気なはずです。

あと、write()は open()、close()といっしょに使うのが原則だと思います。

Mugi [E-Mail] [HomePage] 1999/11/11(木) 01:01:49
> write()は open()、close()といっしょに使うのが原則だと思います。
最初にframesetを書き出すのには関係ないです。
2度目からは、親ドキュメントを新規に書き直すのだから、
サブウィンドウに書き出す感覚で、open→write→closeとするのがいいと思います。

結局、2度目からframesetを書き直す関数を作ってa.html内に定義しておくのがいいでしょうかね。

Mugi [E-Mail] [HomePage] 1999/11/11(木) 01:10:34
何度もごめんなさい。
window.onloadを使って最初のフレームを作成しているのも問題ですね。
この最初のfrachangeが実行された後の、親のソースは
「<FRAMESET cols='20%,80%'><FRAME src=a.html><FRAME src=b.html></FRAMESET>」
になってしまいます。
ねすけのソース表示を使うとわかるはずです。

この場合、親は普通にタグを記述しておくか、
<script language="JavaScript"><!--
document.write("<frameset cols='",i,",",j,"'><frame src=a.html><frame src=b.html></frameset>");
//--></script>
として、</head>の後にスクリプトを置くのがいいと思います。

Mugi [E-Mail] [HomePage] 1999/11/11(木) 01:35:46
サンプル作りました。
http://hp.vector.co.jp/authors/VA013453/js/991111.htm

仕様:
1.親フレームは、</head>のあとに、スクリプトで書き出し。
2.サイズを後から変えるfrachange関数はa.html内にある。
3.サイズ変更はねすけではwrite()、IEではDHTMLを使用。
  (IEではwriteの方法での動作がおかしかったが回避法が思い付かなかったため)

おがまん 1999/11/11(木) 09:19:52
Mugiさん、サンプルまで作っていただいたみたいで、ありがとうございます。
子フレームから、親フレームに書き出せばいいんですね。
あとparent.document.open()とparent.document.close()なのですが、
普通の文と違って「;」を後ろに付けないものなのでしょうか?
 IEではMugiさんのDHTMLの方法を使わせていただきます。
ありがとうございます。

Mugi [E-Mail] [HomePage] 1999/11/11(木) 10:58:46
; を付けないのは僕の癖です。間違いではないと思っています。
1行に複数の処理を記述するときだけに使っています。

おがまん 1999/11/11(木) 12:34:14
[[解決]]
一行にひとつの処理なら、「;」をつけなくてもいいんですね。
知らなかったです。
どうも、回答ありがとうございます。

[上に] [前に] [次に]