Google グループは Usenet の新規の投稿と購読のサポートを終了しました。過去のコンテンツは引き続き閲覧できます。
表示しない

submit button

閲覧: 7 回
最初の未読メッセージにスキップ

e...@ceres.dti.ne.jp

未読、
2003/08/12 8:46:012003/08/12
To:
猪谷と申します。

例として以下のようなフォームを作成し、どのボタンが押されたかによって飛
び先での動作を変えようとしてみました。

---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

Yasushi Shinjo

未読、
2003/08/12 11:35:392003/08/12
To:
新城@筑波大学情報です。こんにちは。

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 にします。ブラウザの設定で
直るという話でなくて、サーバ側の工夫でなんとかするということ
になるかと思います。

\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報       \\

新着メール 0 件