ほとんどの人は、名前と値のペアを指定するだけで、押されたフォームボタンを区別できるという事実にも気づいていません。例えば
<form action="process" method="post">
...
<input type="submit" name="edit" value="Edit">
<input type="submit" name="delete" value="Delete">
<input type="submit" name="move_up" value="Move up">
<input type="submit" name="move_up" value="Move down">
</form>
サーバー側では、ボタン名に関連付けられたリクエストパラメータの存在を確認するだけで、実際に押されたボタンを取得できます。そうでない場合はnull
、ボタンが押されました。
そのための不要なJSハック/回避策をたくさん見てきました。たとえば、押されたボタンに応じて、フォームアクションを変更したり、非表示の入力値を事前に変更したりします。それは単に驚くべきことです。
また、テーブルの行のように、複数のチェックボックスのチェックされたものを収集するためのJSのハック/回避策をほぼ同じくらい多く見ました。テーブル行を選択/チェックするたびに、JSは行インデックスを非表示の入力要素のカンマ区切り値に追加します。この値はサーバー側でさらに分割/解析されます。これは、複数の入力要素に同じ名前で異なる値を付けることができ、サーバー側で配列としてそれらにアクセスできることに気付いていないためです。例えば
<tr><td><input type="checkbox" name="rowid" value="1"></td><td> ... </td></tr>
<tr><td><input type="checkbox" name="rowid" value="2"></td><td> ... </td></tr>
<tr><td><input type="checkbox" name="rowid" value="3"></td><td> ... </td></tr>
...
気付かないと、各チェックボックスに異なる名前が付けられ、value属性全体が省略されます。一部のJSハック/回避策のない状況では、チェックされた項目を区別するためにサーバー側のコードに不必要に圧倒的な魔法が見られました。