使用javascript区分表单中的两个提交按钮
如何找出javascript中单击了哪个提交按钮使用javascript区分表单中的两个提交按钮,javascript,forms,Javascript,Forms,如何找出javascript中单击了哪个提交按钮 function submitForm(){ //if find open popup //else if add continue in the same window } <form action="/findNames" onsubmit="return submitForm()"> <input type="submit" value="Add" onclick="submitForm(this)
function submitForm(){
//if find open popup
//else if add continue in the same window
}
<form action="/findNames" onsubmit="return submitForm()">
<input type="submit" value="Add" onclick="submitForm(this)"/>
<input type="submit" value="Find" onclick="submitForm(this)"/>
</form>
函数submitForm(){
//如果找到打开的弹出窗口
//如果添加,则在同一窗口中继续
}
我尝试过的: 我试着用onclick来代替它,如下所示,但是当点击“查找”按钮时,它会打开一个弹出窗口并提交父窗口。如何阻止它提交父窗口
function submitForm(submit){
if(submit.value=="Find"){
find();//opens a popup window
}else if(submit.value == "Add"){
//stay in the same window
}
}
function find(){
var width = 1010;
var height = 400;
var params = 'width='+width+', height='+height;
popupWin = window.open('find.do','windowname5', params);
popupWin.focus();
}
<form action="/findNames">
<input type="submit" value="Add" onclick="submitForm(this)"/>
<input type="submit" value="Find" onclick="submitForm(this)"/>
</form>
函数提交表单(提交){
if(submit.value==“Find”){
find();//打开一个弹出窗口
}否则如果(submit.value==“添加”){
//呆在同一个窗口
}
}
函数find(){
var宽度=1010;
var高度=400;
变量参数='宽度='+宽度+',高度='+高度;
popupWin=window.open('find.do','windowname5',params);
popupWin.focus();
}
一个输入的type=“submit”
将始终提交表单。使用type=“button”
的输入来创建一个不提交的按钮。您的代码应该进行重构,以正确地附加事件侦听器
首先,定义将用作侦听器的函数:
function preventSubmission(e) {
if (e.preventDefault) e.preventDefault();
return false;
}
function find(){
var width = 1010;
var height = 400;
var params = 'width='+width+', height='+height;
popupWin = window.open('find.do','windowname5', params);
popupWin.focus();
}
然后,缓存对相关表单元素的引用:
var form = document.getElementById('my-form'),
findButton = document.getElementById('find');
最后,将侦听器添加到DOM事件:
if (form.addEventListener) {
form.addEventListener("submit", preventSubmission);
findButton.addEventListener("click", find);
} else {
form.attachEvent("submit", preventSubmission);
findButton.attachEvent("click", find);
}
这是一个完整的工作演示:请查看:
Javascript:
var clicked;
var buttons = document.getElementsByTagName("input");
for(var i = 0; i < buttons.length;i++)
{
var elem = buttons[i];
if(elem.type=="submit")
{
elem.addEventListener("click", function(){ clicked=this.value;}, false);
}
}
window.onsubmit = function(e)
{
alert(clicked);
return false;
}
<form action="/findNames">
<input type="submit" value="Add" />
<input type="submit" value="Find" />
</form>
var;
var buttons=document.getElementsByTagName(“输入”);
对于(变量i=0;i
标记:
var clicked;
var buttons = document.getElementsByTagName("input");
for(var i = 0; i < buttons.length;i++)
{
var elem = buttons[i];
if(elem.type=="submit")
{
elem.addEventListener("click", function(){ clicked=this.value;}, false);
}
}
window.onsubmit = function(e)
{
alert(clicked);
return false;
}
<form action="/findNames">
<input type="submit" value="Add" />
<input type="submit" value="Find" />
</form>
您将拥有单击的任何按钮的值
jsFiddle:
注意:出于测试目的,我在onsubmit
事件中设置了return false
。第一个JSFIDLE示例有自己的窗口。包括onload
,因此您可能希望添加窗口以外的所有内容。onsubmit
在窗口内。onload
,就像这样(在Chrome、Firefox中测试)。您的思路是正确的,但是表单总是提交的,因为您没有取消事件(或者,用DOM Level 2+的说法,您不是在“阻止事件的默认操作”)
(这只是一个示例。请尽量减少全局变量的数量。)
同样,当返回到submit
事件处理程序时,返回值false
会阻止表单提交。如果您明确希望在处理submit
事件后提交表单,则可能需要返回true
。例如,您可能需要验证表单,如果如果成功,则通过target
属性在另一个帧中显示服务器响应
与在脚本代码中添加事件监听器相比,事件处理程序属性的优点是运行时效率高、向后兼容,并且仍然符合标准。缺点是,如果事件没有冒泡,则可能必须复制事件处理程序代码。(这不是问题。)
其他人可能会说,事件处理程序属性的一个缺点是标记和函数之间没有分离;但是,你应该自己决定这一点。在我看来,函数总是与特定的标记联系在一起,在不同的DOM实现之间跳转是不值得的
另见:
这里最重要的一点是,不管您做了哪些客户端改进,表单都保持可访问性,也就是说,即使没有客户端脚本,它仍然可以与键盘一起工作。您的服务器端脚本(此处:/findNames
)因此,可以作为回退,客户端脚本可以避免不必要的往返,改善用户体验,减少网络和服务器负载。对此不确定,但您是否尝试将name
属性添加到input
标记中?为什么不将其拆分为两种形式?@piokuc我做了,但您如何访问当前的名称javascript中的属性值?您应该考虑使用事件侦听器拾取您的单击事件,而不是内联绑定您的函数调用(这是不推荐的)。您可以通过DOM访问表单、输入标记及其属性,我刚刚做了谷歌搜索"如何访问javascript@中的name属性值,有几页讨论了它。最初,我将其中一个作为按钮。此表单有很多输入字段,我的问题是,当我单击按钮时,我需要将这些输入字段中的值提交给服务器,只需使用带有名称标记的输入标记ttribute将其值提交到服务器。@Kninnug W3是垃圾,但在这种情况下是正确的。但是,表单控件的值未提交并不意味着表单未提交。注意,表单仍将提交。当您单击按钮而不是“提交”时,输入值不会被提交。我如何才能让它提交表单中的所有输入,即使您单击此“按钮”?@PointedEars fair point,但是Susie,您现在到底想要什么?表单必须同时在Add和Find案例中提交吗?错误:−1.不需要显式事件侦听器(它们是隐式的,带有事件处理程序属性),并且。是的,但是内联html事件处理程序被认为是不好的做法。此外,我知道attachEvent和addEventListener不一样:因此是条件语句。不,它们不是“不好的做法”;您一直在听错误的人讲话。而且您没有意识到其中的差异。IE8和以下版本不需要附件
,它们可以