- 締切済み
フレームを指定して結果を出力するには?
2つのフレームに分割されたサイトを作っています。 仮に、フレームをAとBとします。 AのフレームはCGIで、フォームアクション用のボタンが一つ表示させています。データの送信先は、自身のCGIです。 このCGIで、処理結果によって、表示する(起動する)フレームを分けたいと思っています。 ある結果であれば、全てのフレーム(_top)をリロード、別の結果であれば、自身(_self)のような感じです。 かなり前から悩んでいるのですが、なかなか解決出来ません。こちらの履歴も調べたのですが、ズバリの回答は見つける事が出来ませんでした。 お分かりになる方がいらっしゃいましたら、お教え下さい。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- moon_night
- ベストアンサー率32% (598/1831)
#2 です。 こういうことをしたいのではないかという具体的なものを作ってみました。 これであっていますか? 間違っている場合、具体的にどこが違うのでしょうか? #!/usr/local/bin/perl # データデコード処理 if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name,$value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s/\n//g; #フォーム変数へ $F{$name} = $value; } if ($F{'frame_a'}) { print "Content-type: text/html\n\n"; print "<HTML>\n"; print "<HEAD><TITLE>A</TITLE></HEAD>\n"; print "<p>ここはフレームAです</p>\n"; if ($F{'a'}) { print "<p>処理しました</p>\n"; } print "</BODY>\n"; print "</HTML>\n"; } elsif ($F{'frame_b'}) { print "Content-type: text/html\n\n"; print "<HTML>\n"; print "<HEAD><TITLE>B</TITLE></HEAD>\n"; print "ここはフレームBです<br>\n"; print "<form action=\"_top.cgi\" target=\"_top\">\n"; print "<input type=\"submit\" name=\"fa\" value=\"フレームのまま変更\">\n"; print "<input type=\"submit\" name=\"fb\" value=\"全画面変更\">\n"; print "</form>\n"; print "</BODY>\n"; print "</HTML>\n"; } else { if ($F{'fb'}) { print "Content-type: text/html\n\n"; print "<HTML>\n"; print "<HEAD><TITLE>frame</TITLE></HEAD>\n"; print "<h3>処理終了</h3>\n"; print "<p><a href=\"_top.cgi\">もどる</a></p>\n"; print "</BODY>\n"; print "</HTML>\n"; } else { print "Content-type: text/html\n\n"; print "<HTML>\n"; print "<HEAD><TITLE>frame</TITLE></HEAD>\n"; print "<frameset cols=\"40%,*\">\n"; print "<frame src=\"_top.cgi?frame_a=1&a=$F{'fa'}\" name=\"a\">\n"; print "<frame src=\"_top.cgi?frame_b=1\" name=\"b\">\n"; print "</frameset>\n"; print "</BODY>\n"; print "</HTML>\n"; } }
- SHOO-3
- ベストアンサー率56% (28/50)
#1です。 自分の案は、読み込みと同時に_topを別のページに飛ばしてしまうというものです。 CGIで、scriptを書き出すようにするのですが、JavaScriptを一朝一夕で思い通りに動作させるのは難しいでしょう。(習得は比較的簡単ですが。) #2さんの方法(フレームをまとめるページをCGIにしてしまう方法)か、もしくはフレームを用いない方法(2列1行のtableを使うとか、スタイルシートの指定でスクロール付の要素を作るとか)を検討したほうがいいかもしれません。 そこまで詳しく調べたことは無いのですが、CGIの処理から_topへリダイレクトさせるのは、おそらく無理です。 あるフレームにほかのHTMLページを読み込んだあとに、そのページの表示段階でフレームの指定を無視して_topに表示先を変更することができないのと同じです。 親フレームをCGIにしたり、JavaScriptを用いることで無理やりやることもできますが、どうしても動作が汚らしくなってしまうので、避けることをお勧めしておきます。
- moon_night
- ベストアンサー率32% (598/1831)
私ならば。 逆の発想で、とりあえず_topで更新。 結果がAならばそのまま。 結果がBならばフレームを作る(更新前と同じようにする) とします。
- SHOO-3
- ベストアンサー率56% (28/50)
CGIからの操作ではできない気がするので、出力後、JavaScriptなどを使って操作するのが良いかと思います。
お礼
早速のご回答ありがとうございます。 ただ、JavaScriptについてはほとんど無知なので、方法を詳しくお教え頂けませんでしょうか。 出来ないとなると、AフレームにおけるCGIの結果は、Aフレームに対して、HTMLを書き出す事になると思います。 そのHTMLの中にJavaScriptも組み込んで書き出す、という事だと思いますが、そのJavaScriptは自動的に、_topをリロードするような事が出来るのでしょうか。出来るのであれば、どのようなスクリプトをHTMLの中に書けばよいのでしょうか。。 分からない事ばかりですみません。よろしくお願いします。
補足
あるフレームのcgiから_topへリダイレクトする方法がお分かりでしたらそれをお教え頂けませんでしょうか? あるフレームのcgiの表示結果に_topへのリンクがあって、それを押すのではなく、cgiの処理の中から_topへリダイレクトさせたいのです。 よろしくお願いします。