相反,有没有办法访问服务器在发送之前使用 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,您可以使用 hyper-overloaded on
,但不太清楚。如果您选择,请注意参数的顺序不同。)
这里的重点是它并不复杂、困难或特别麻烦。
重新编辑您的结束问题:
...谁能解释为什么在发送到服务器之前无法直接访问这些数据?
可能不是,不。重要的是要了解很多这些东西刚刚进化。与表单一起发送的提交按钮的值是 HTML 的东西,显然在执行 DOM HTML 表单模块时,任何人都没有想到“嘿,我们应该在表单上有一个仅在表单期间存在的属性提交事件,告诉您提交表单的内容。” 它可能应该发生在某人身上,但显然,它没有。