代わりに、サーバーが送信する前にJavaScriptで受信するのと同じ「投稿」データにアクセスする方法はありますか?
正確なデータではありません。
submit
どのボタンが押されたかを知る通常の方法は、(残念ながら)click
ハンドラーをボタンにアタッチし、変数(またはフィールドの値)を設定してもらうことです。これにより、イベントハンドラーhidden
をチェックインできます。submit
古いスタイルのDOM0イベントハンドラー属性を使用しているため、おそらくhidden
フィールドは実行している内容によりよく適合します。
<form method="post">
<input type="hidden" name="submitclicked" value="">
<button type="submit" name="command" value="cancel" onclick="submitClick(this);">Cancel Order</button>
<button type="submit" name="command" value="proceed" onclick="submitClick(this);">Save Order</button>
</form>
...submitClick
このように見える場所:
function submitClick(button) {
button.form.submitclicked.value = button.value;
}
...ただし、代わりにDOM2スタイルのイベントハンドラーを使用するか、少なくともDOM0ハンドラーをコードブロックにアタッチすることをお勧めします。グローバル関数の作成を回避したり、グローバル変数を作成せずにデータを共有したりできるためです。
明確にするonclick
ために、すべての要素に属性を指定する必要はありません。上記で指定した唯一の理由は、DOM0ハンドラーを使用していたためです。
それを処理するためのより良い方法は、イベントバブリングを使用することです。イベントはclick
、送信ボタンを含む子孫コントロールからフォームにバブルアップするため、フォームにイベントをフックして、送信ボタンで発生したかどうか、発生した場合はそのボタンが何であるかを確認できますvalue
。
たとえば、ここでは、フォームに動的にアタッチされたDOM0ハンドラーを使用して、クリックされた送信ボタンの値を警告します。
var form = document.getElementById("theForm");
form.onclick = function(e) {
// Get the event
e = e || window.event;
// Did it originate in an input[type=submit]?
if (e.target.tagName === "INPUT" &&
e.target.type === "submit") {
// Yes
alert(e.target.value);
}
};
実例| ソース
または、最新のブラウザーでDOM2ハンドラーを使用します(IE8以前ではattachEvent
ありませんが、それらを追加するのは簡単です。これは、 addEventListener
[そしてそれよりも前の]ほぼ同じことを行います)。
document.getElementById("theForm").addEventListener("click", function(e) {
// Did it originate in an input[type=submit]?
if (e.target.tagName === "INPUT" &&
e.target.type === "submit") {
// Yes
alert(e.target.value);
}
}, false);
実例| ソース
または、ライブラリを使用して簡単にします(ここでは、jQueryですが、ほとんどの場合、イベント委任と呼ばれるこの機能があります)。
$("#theForm").delegate("input[type=submit]", "click", function() {
alert(this.value);
return false;
});
実例| ソース(delegate
明快さが好きなのでここで使用しています。最近のバージョンのjQueryでは、ハイパーオーバーロードを使用できon
ますが、あまり明確ではありません。選択する場合は、引数の順序が異なることに注意してください。)
ここでのポイントは、それが複雑でも、困難でも、特に面倒でもないということです。
編集の最後の質問を再確認してください。
...サーバーに送信される前にこのデータに直接アクセスする方法がない理由を誰かが説明できますか?
おそらくそうではありません。このようなものの多くは進化したばかりであることを理解することが重要です。フォームとともに送信される送信ボタンの値はHTMLのものです。どうやら、DOM HTMLフォームモジュールを実行しているとき、「ねえ、フォーム内にのみ存在するプロパティがフォームにあるはずです」と言うことは誰にも起こりませんでした。フォームを送信した内容を通知する送信イベント。」おそらく誰かに起こったはずですが、明らかにそうではありませんでした。