例として以下のようなフォームを作成し、どのボタンが押されたかによって飛
び先での動作を変えようとしてみました。
---x8------x8------x8------x8------x8------x8------x8------x8---
<form action="/cgi-bin/test.cgi" method="get">
<input type="text" name="some_text" />
<ul>
<li><button type="submit" name="action" value="1234">Entry1</button></li>
<li><button type="submit" name="action" value="abcd">Entry2</button></li>
<li><button type="submit" name="action" value="foobar">Entry3</button></li>
</ul>
</form>
---x8------x8------x8------x8------x8------x8------x8------x8---
これが、Gecko、lynx などでは期待通りの動作をするのですが、MSIE(試した
のは MSIE 6.0; Windows NT 5.1)からだと全く不可解な動作をします。
なぜか query_string に
some_text=dfdaf&action=Entry1&action=Entry2&action=Entry3
このような代物を吐き出してくれて、どのボタンが押されたのかを判定するど
ころか(ボタンとして書いたエントリがすべて送られてきている)、submit の
value として指定した値すら吐き出してくれません。
ここで、上の <button></button> のかわりに
<input type="submit" name="action" value="1234" />
と記述してやると、MSIE でも期待の動作(押されたボタンに該当する value
の値が action として伝わる)をしてくれるのですが、この場合ブラウザでは
submit ボタンのラベルとして value の値が表示されることになってしまいま
す。この値はユーザが見ても意味不明であるため、できるだけユーザの目に直
接触れることが無いようにしたいのです。
それでは、と
<input type="image" action="submit" src="icon.png"
alt="Entry1" name="action" value="1234" />
のようにしてみると、MSIEの場合 value で指定した値を送ってくれません。
type="image" の場合の動作として、value を送信するのが正しい動作なのか
わかりませんので、MSIEがおかしいのかどうか私には判断できませんが、とも
あれ期待の動作とはならないようです。
# Mozilla では期待通りに動くんですが。
この様に、一つのフォームで複数の submit ボタン(ボタンのラベルはその
formでの値と関係ないものが使いたい)を配置し、どの submit が押されたの
か知りたいという場合、MSIE でもきちんと動作させるにはどのように form
を書けばよいのでしょうか。
それと、Another HTML-lint に上の form を食わせると複数の submit に同一
の name が指定されているとして減点されてしまうようですが、このような指
定が HTML/XHTML の仕様から見て間違っているのかどうか、ということも教え
ていただけるとありがたいです。
すみませんが、お知恵を貸してくださいませんでしょうか。
よろしくお願いします。
--
O
o ●-● 猪谷 英一郎 == Eiichiro Itani
-ゝ e...@ceres.dti.ne.jp
In article <MeGdncKsEvc...@giganews.com>
e...@ceres.dti.ne.jp writes:
> 猪谷と申します。
> <form action="/cgi-bin/test.cgi" method="get">
> <input type="text" name="some_text" />
> <ul>
> <li><button type="submit" name="action" value="1234">Entry1</button></li>
<botton> なんてタグは、HTML の規格にありましたっけ?
使った事がないなあ。
> <input type="submit" name="action" value="1234" />
こちらが、普通ですよね。
> と記述してやると、MSIE でも期待の動作(押されたボタンに該当する value
> の値が action として伝わる)をしてくれるのですが、この場合ブラウザでは
> submit ボタンのラベルとして value の値が表示されることになってしまいま
> す。この値はユーザが見ても意味不明であるため、できるだけユーザの目に直
> 接触れることが無いようにしたいのです。
最近、私は次のようにしました。
(1) value には、ユーザにとって意味があるものにする。
(2) 送られてきた文字列から内部に必要な value を復元する。
復元は、そんなには難しくありません。文字コードを正規化して、
連想配列一発です。Ruby だとこんな感じ。
Rstate = [ "unseen", "dupdeleted", "ok", "reposting", "prof", "reposted" ]
RstateMnemonic = { "unseen"=>"採点中", "dupdeleted"=>"重複", "ok"=>"OK",
"reposting"=>"再提出", "prof"=>"教官採点中", "reposted"=>"再提出済み" }
def decode_rstate_mnemonic( nm )
return nil if( nm == nil )
nm = Kconv::toeuc(nm)
Rstate.each {|rs|
if( RstateMnemonic[rs] == nm )
return( rs )
end
}
return( "unknown" )
end
あら、ループしている。逆方向の連想配列しかないので、全部の要
素でループして探していますね。予め作っておけばいいんだけれど、
2つあると両方の整合性を取るのが面倒なので、片方しか作ってい
ませんね。
あと見栄えを調整するなら、スタイルシートを使うといいかと思い
ます。
<li> <input type="submit" name="action" value="1234" CLASS="entry1"/>
<li> <input type="submit" name="action" value="abcd" CLASS="entry2"/>
<li> <input type="submit" name="action" value="foobar" CLASS="entry3"/>
あるいは、
<li CLASS="entry1"> <input type="submit" name="action" value="1234"/>
<li CLASS="entry2"> <input type="submit" name="action" value="abcd"/>
<li CLASS="entry3"> <input type="submit" name="action" value="foobar"/>
で、ヘッダのどこかに、 input.entry1 { イメージは、これ;} と
かli.entry1 { イメージはこれ; }とか書きます。実は、スタイル
シートはまだ勉強している所で使ったことはないのですど、人に奨
めています。うまくいったら教えて下さい。
と、質問に答えるふりをして、質問してしまう。fj の基本ですよね。
> この様に、一つのフォームで複数の submit ボタン(ボタンのラベルはその
> formでの値と関係ないものが使いたい)を配置し、どの submit が押されたの
> か知りたいという場合、MSIE でもきちんと動作させるにはどのように form
> を書けばよいのでしょうか。
「1つのフォームで」という条件がなければ、form を分割して、
本当のパラメタは、hidden で渡す手はありますよね。
<LI> <form action="/cgi-bin/test.cgi" method="get">
<input type="hidden" name="action" value="1234">
<input type="submit" value="Entry1">
</form>
<LI> <form action="/cgi-bin/test.cgi" method="get">
<input type="hidden" name="action" value="abcd">
<input type="submit" value="Entry2">
</form>
<LI> <form action="/cgi-bin/test.cgi" method="get">
<input type="hidden" name="action" value="foobar">
<input type="submit" value="Entry3">
</form>
一応、ニュースグループとしては、発信側の話は、
fj.net.www.authoring ということになっているので、続きは
Followup-To: fj.net.www.authoring にします。ブラウザの設定で
直るという話でなくて、サーバ側の工夫でなんとかするということ
になるかと思います。
\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報 \\