- ベストアンサー
Perl で出力するHTMLファイルを任意の場所から表示
CGI の中でprintを使ってHTMLファイルを出力することができますが、ブラウザで任意の場所を先頭に(スクロールさせて)表示させることができるでしょうか? hogehoge.cgi ------------------------ ・ ・ <a name="label01"> print "AAAAA<BR>"; <a name="label02"> print "BBBBB<BR>"; <a name="label03"> print "CCCCC<BR>"; ・ ・ ------------------------ 上のような場合で、 ブラウザで"BBBBB"を先頭に (label02 の位置にスクロールさせて) 表示させたいのです。 hogehoge.cgi#label02 で呼び出せばいいというのは 駄目です。 cgi の中で、処理によって表示の位置を label01, label02, label03 と ダイナミックに切り替えたいからです。 HTMLヘッダで Refresh を指定して、 再読み込みさせることもできますが、 携帯電話のブラウザではうまくいかないので、 別の方法をご教授ください。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
> label02 に飛ばすか label01 に飛ばすかは > CGIの処理結果で決まり、 > hogehoge.cgi コール時には不明なので、 > hogehoge.cgi#label02 とは呼び出せないのです。 あなたのやりたいことがようやく理解できました。 それならば、ラベル名は固定でアンカーの出力位置を動かせばいいのではないでしょうか? リクエストは hogehoge.cgi#hoge として、 '<a name="hoge">' を表示させたい行の直前に出力するようにすればいいでしょう。
その他の回答 (5)
- SHOO-3
- ベストアンサー率56% (28/50)
じゃあ、ラベル名を#gotoとかにして、飛ばしたい部分に <a name="goto"></a> だけ出力するっていうのは? CGIの処理(サーバ側)でスクロールの初期位置を決定することは、おそらくできません。その動作は、HTMLの処理(クライアント側)によるものなので、URIで#labelを指定してやらないと希望の動作は得られないと思います。 なので、やるとしたら、Locationで飛ばすか、Refreshで飛ばすか、Javascriptで飛ばすか、#gotoで飛ばす行き先の位置を変更するかの、いづれかになると思います。 これで納得いかないなら、よりスマートでない記述をするしかなくなると思います。(少なくとも自分はこれ以外の方法を思いつきません)
お礼
クライアント側の処理でしょうが、 その情報(ラベルに飛べ)は クエリ(URL)からしか指定できないのか? という問いでした。 残念ながらできないようですね。 ありがとうございました。
- SHOO-3
- ベストアンサー率56% (28/50)
CGIを二重にしてLocationでとばすとか。 hugahuga.cgiでスクロールさせる位置を判断して(ここでは仮に#label02にスクロールするものとして) ---- if($l == 2){$label = "#label02";} print "Location: hogehoge.cgi$label\n\n"; ---- って感じに、目的のHTMLを表示するCGIに飛ばす。 …とかいう風にしてみてはどうでしょうか?
お礼
ありがとうございます。 この方法は検討しました。 …が、CGIはパラメータを付加してコールするので 処理が煩雑になるのと あまりキレイな流れとは言えないので 他にシンプルな方法が (わたくしが知らないだけで一般的な方法が) あるのではないかと思い、 質問させていただきました。
- twinkleluz
- ベストアンサー率52% (98/185)
読み込むファイルがhtmlだろうがcgiだろうが、ページ内アンカーは指定できます。 http://somewhere.com/hogehoge.cgi#label02 と書けば、label02のアンカーにちゃんと飛びます。 POSTでも、 <form action="hogehoge.cgi#label02" method="POST"> と書けばページ内アンカーが使えます。 携帯のブラウザでもちゃんと機能します(ページ内アンカーに対応していないブラウザがあるかもしれませんが) この方法だとなぜだめなのか、理由をお願いします。 もしくは、ご自分のなさりたいことを詳しく書いていただけませんか。 (どういう操作をしたときに、どんな挙動をさせたいのか、etc.)
補足
おっしゃることは知っています。 label02 に飛ばすか label01 に飛ばすかは CGIの処理結果で決まり、 hogehoge.cgi コール時には不明なので、 hogehoge.cgi#label02 とは呼び出せないのです。 初めから質問に書いているのですが… こちらの前提条件を否定されても困ります。 わたくしの条件で、解をご教授いただける方のみ ご投稿ください。 この条件では「不可能」というのも解です。 不可能かどうかわからないので質問しています。
- twinkleluz
- ベストアンサー率52% (98/185)
> cgi の中で、処理によって表示の位置を > label01, label02, label03 と > ダイナミックに切り替えたいからです。 というのがイマイチよく理解できないのですが、 "AAAAA" "BBBBB" "CCCCC" という表示が "AAAAA" "CCCCC" "BBBBB" みたいに移動することがある、ということなら <a name="label01"> print "AAAAA<BR>"; <a name="label03"> print "CCCCC<BR>"; <a name="label02"> print "BBBBB<BR>"; というようにアンカーごと出力位置を動かせばラベル名を含んだ URLでスクロールができるのではないでしょうか。
補足
print '<a name="label01">'; print "AAAAA<BR>"; print '<a name="label02">'; print "BBBBB<BR>"; print '<a name="label03">'; print "CCCCC<BR>"; の間違いでした。ヒアドキュメントにした方が わかりやすかったか? AAAA, BBBB, CCCCは1行とは限りません。 これらの表示順を変えたいということではなく、 先頭からではなく、 途中から(スクロールさせて)表示できるか?という 質問です。 言い換えれば、 CGIからの出力でアンカーを指定できるの? という話です。 print文の内容を hogehoge.htmlとしたら、 hogehoge.html#label02 として ブラウザで表示されるのと同じにしたいのです。
- Hasty
- ベストアンサー率73% (19/26)
JavaScriptでならできるけど、携帯でも必要となると無理です。 CGIで表示させてるんだし、label02を先に表示してはどうですか?
補足
そういう話ではありません。
お礼
すばらしい! シンプルな方法がありました。 しかも、新しい知識を必要とせず。 この方法で十分です。 ありがとうございました。