Javascript 确定从onsubmit中提交表单的元素

Javascript 确定从onsubmit中提交表单的元素,javascript,html,dhtml,Javascript,Html,Dhtml,有没有办法确定哪个元素从onsubmit处理程序中提交了表单?试图编写一个知道单击了哪个元素的泛型处理程序。例如,给定此表单: <form onsubmit="onSubmitHandler"> <input type="submit" name="submit1" /> <input type="submit" name="submit2" /> </form> 如何在onSubmitHandler中确定单击了哪个提交按钮?

有没有办法确定哪个元素从onsubmit处理程序中提交了表单?试图编写一个知道单击了哪个元素的泛型处理程序。例如,给定此表单:

<form onsubmit="onSubmitHandler">
    <input type="submit" name="submit1" />
    <input type="submit" name="submit2" />
</form>

如何在onSubmitHandler中确定单击了哪个提交按钮?我尝试了event.target/event.srcement,但这给出了表单,而不是实际的提交按钮


更新:我在这里编写一个通用控件,因此它不知道表单上有什么。解决方案需要在不知道和更改表单的html的情况下工作。我的备用方法是遍历DOM以查找可能导致提交的所有按钮,但我希望避免这种情况。

另一种解决方案是将事件触发器从表单的提交事件移动到提交元素的onclick事件,如下所示:

<form name='form1'>  
    <input type="submit" name="submit1" onclick="onSubmitHandler"/>
    <input type="submit" name="submit2" onclick="onSubmitHandler"/>
</form>


在处理程序函数中,您可以通过检查事件目标的名称来确定提交元素,如果您需要访问表单的信息或其他元素,您可以从提交元素的“表单”属性中获得这些信息。

我不会使用标准的提交按钮类型

使submit函数接受一个额外的参数,该参数表示提交它的元素,按钮将有一个onclick,该onclick发送
this
作为参数:

<input type="button" onclick="submitHandler(this)">

我的退路是遍历DOM以查找所有可能导致提交的按钮,但我希望避免这种情况

…并将单击侦听器添加到它们中以存储“上次单击”按钮,然后提交侦听器将读取该按钮,对吗


对不起,我想不出任何其他方法。

这个解决方案在Firefox中有效。我没有在其他兼容浏览器或IE中检查过它。
我对IE不抱太大希望,你必须调查一下并公布结果

<form id="myForm">
    <input type="submit">
    <input type="submit">
</form>

单击事件气泡,这样您就可以向表单本身添加一个“onclick”侦听器,该侦听器检查单击目标源是否是提交按钮;如果是这样,请将对它的引用存储在与表单关联的某个位置,您可以从onsubmit处理程序访问该表单


如果您还想正确处理“输入”-提交的表单,请收听表单的“onkeypress”或“onkeydown”事件,检查“输入”,如果事件目标不是提交按钮,请清除提交按钮信息。

这将在JavaScript不可用时不必要地打断按钮。该按钮在没有js的情况下仍然可以工作,但是,确定实际按下的按钮的唯一方法将是服务器端的按钮。顺便说一句,您可以通过给按钮一个值来实现这一点。这需要全部是客户端的。在这种情况下,我不关心服务器。它还需要是通用的——我没有访问html.Renzo页面的权限,服务器端与此有什么关系??这是通用的,但在某种程度上,唯一的问题是它将强制submit按钮显式地标识自己。bobince,我认为您可以通过使type=“submit”并在onclickKooilnc的末尾添加“return false”来回退到html,an不会向服务器发送任何内容-它的唯一目的是触发客户端代码。是的,没错。它很脆弱,因为如果页面上的其他内容在我挂起后添加了提交按钮,它就会断开。但不幸的是,这似乎是最好的选择。这很好,但它看起来像是交叉浏览器上的“不”,不幸的是,这需要处理四大浏览器,因此其中一个已经过时。2019年1月,ExplicitoringinalTarget仍然是非标准的。除此之外,您还需要一个onsubmit处理程序,因为提交事件可以在不按下按钮的情况下发生。该规范留下了一个半开放的问题,即在关注非按钮控件时按Enter键激活哪个按钮(如果有),浏览器也不一致(尽管根据我的实验,它似乎是表单上的第一个按钮,或者根本没有)。无法保证任何提交按钮都被单击过。例如,通过JS(form.submit())提交将不会在帖子中包含任何按钮值,这也没关系。关于这个问题的更多背景知识:这是针对AJAX组件的。我正在取消第一次提交,做我自己的事情,然后我需要使用所有正确的表单值重新运行第一次提交。据我所知,实现这一点的唯一方法是遍历DOM,向任何可能导致提交的内容添加单击处理程序,然后保存。假设最后单击的是提交表单的内容,然后在需要重新提交表单时调用.click()。
document.getElementById('myForm').addEventListener( 'submit', function( e ){
    e.preventDefault();
    e.explicitOriginalTarget.style.background = 'red';
}, false );