• ベストアンサー

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 を指定して、 再読み込みさせることもできますが、 携帯電話のブラウザではうまくいかないので、 別の方法をご教授ください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.6

> label02 に飛ばすか label01 に飛ばすかは > CGIの処理結果で決まり、 > hogehoge.cgi コール時には不明なので、 > hogehoge.cgi#label02 とは呼び出せないのです。 あなたのやりたいことがようやく理解できました。 それならば、ラベル名は固定でアンカーの出力位置を動かせばいいのではないでしょうか? リクエストは hogehoge.cgi#hoge として、 '<a name="hoge">' を表示させたい行の直前に出力するようにすればいいでしょう。

suzucchi
質問者

お礼

すばらしい! シンプルな方法がありました。 しかも、新しい知識を必要とせず。 この方法で十分です。 ありがとうございました。

その他の回答 (5)

  • SHOO-3
  • ベストアンサー率56% (28/50)
回答No.5

じゃあ、ラベル名を#gotoとかにして、飛ばしたい部分に <a name="goto"></a> だけ出力するっていうのは? CGIの処理(サーバ側)でスクロールの初期位置を決定することは、おそらくできません。その動作は、HTMLの処理(クライアント側)によるものなので、URIで#labelを指定してやらないと希望の動作は得られないと思います。 なので、やるとしたら、Locationで飛ばすか、Refreshで飛ばすか、Javascriptで飛ばすか、#gotoで飛ばす行き先の位置を変更するかの、いづれかになると思います。 これで納得いかないなら、よりスマートでない記述をするしかなくなると思います。(少なくとも自分はこれ以外の方法を思いつきません)

suzucchi
質問者

お礼

クライアント側の処理でしょうが、 その情報(ラベルに飛べ)は クエリ(URL)からしか指定できないのか? という問いでした。 残念ながらできないようですね。 ありがとうございました。

  • SHOO-3
  • ベストアンサー率56% (28/50)
回答No.4

CGIを二重にしてLocationでとばすとか。 hugahuga.cgiでスクロールさせる位置を判断して(ここでは仮に#label02にスクロールするものとして) ---- if($l == 2){$label = "#label02";} print "Location: hogehoge.cgi$label\n\n"; ---- って感じに、目的のHTMLを表示するCGIに飛ばす。 …とかいう風にしてみてはどうでしょうか?

suzucchi
質問者

お礼

ありがとうございます。 この方法は検討しました。 …が、CGIはパラメータを付加してコールするので 処理が煩雑になるのと あまりキレイな流れとは言えないので 他にシンプルな方法が (わたくしが知らないだけで一般的な方法が) あるのではないかと思い、 質問させていただきました。

回答No.3

読み込むファイルがhtmlだろうがcgiだろうが、ページ内アンカーは指定できます。 http://somewhere.com/hogehoge.cgi#label02 と書けば、label02のアンカーにちゃんと飛びます。 POSTでも、 <form action="hogehoge.cgi#label02" method="POST"> と書けばページ内アンカーが使えます。 携帯のブラウザでもちゃんと機能します(ページ内アンカーに対応していないブラウザがあるかもしれませんが) この方法だとなぜだめなのか、理由をお願いします。 もしくは、ご自分のなさりたいことを詳しく書いていただけませんか。 (どういう操作をしたときに、どんな挙動をさせたいのか、etc.)

suzucchi
質問者

補足

おっしゃることは知っています。 label02 に飛ばすか label01 に飛ばすかは CGIの処理結果で決まり、 hogehoge.cgi コール時には不明なので、 hogehoge.cgi#label02 とは呼び出せないのです。 初めから質問に書いているのですが… こちらの前提条件を否定されても困ります。 わたくしの条件で、解をご教授いただける方のみ ご投稿ください。 この条件では「不可能」というのも解です。 不可能かどうかわからないので質問しています。

回答No.2

> 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でスクロールができるのではないでしょうか。

suzucchi
質問者

補足

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)
回答No.1

JavaScriptでならできるけど、携帯でも必要となると無理です。 CGIで表示させてるんだし、label02を先に表示してはどうですか?

suzucchi
質問者

補足

そういう話ではありません。

関連するQ&A

専門家に質問してみよう