Javascript 如何在jquery中找到表单提交事件中单击的按钮?

Javascript 如何在jquery中找到表单提交事件中单击的按钮?,javascript,jquery,cross-browser,jquery-events,Javascript,Jquery,Cross Browser,Jquery Events,我有一个用于防止表单多次回发的函数: var submitted = false; $(function() { $('form').bind('submit', function(e) { if (!submitted && CanSubmit(e)) { submitted = true; return true; } else { return false;

我有一个用于防止表单多次回发的函数:

var submitted = false;
$(function() {
    $('form').bind('submit', function(e) {
        if (!submitted && CanSubmit(e)) {
            submitted = true;
            return true;
        } else {
            return false;
        }
    });
});
CanSubmit
方法中,我需要询问单击的按钮,以确定是否允许提交

请注意,我无法绑定到特定的单击事件-有关更多详细信息,请参阅

在Firefox中,我可以使用
e.originalEvent.explicitOriginalTarget
,但这在IE中显然不可用

如何以跨浏览器的方式从
e
参数中获取此值?

使用
e.target
-jQuery实现跨浏览器一致性


对于
explicitOriginalTarget
我能找到的最接近的东西是
document.activeElement
(对于IE)-它是事件期间具有焦点的元素。对于基于webkit的浏览器,没有同等的标准。因此,没有真正的跨浏览器方法只使用事件对象来实现这一点。

实际上,您可以将
$('form').bind('submit'
)替换为
$(':submit').bind('click'
,您的代码也可以正常工作(您可以使用
this
查看单击了什么).

为什么不在提交时解除提交功能的绑定?这将保证只提交一次:

$(function() {
    $('form').bind('submit', function(event) {
          // regular submit form stuff here
        ...
          // and unbind it
        $('this').unbind(event);       
    });
});
在“使用事件对象”下签出

或者,正如马特·鲍尔(Matt Ball)在评论中指出的那样,您可以使用,这相当于上述内容

$(function() {
    $('form').one('submit', function(event) {           // <== Only executed once
          // regular submit form stuff here
        ...
    });
});
$(函数(){

$('form').one('submit',函数(event){/为什么不使用
。one
函数保证只触发一次

$(function() {
    $('form').one('submit', function(event) {
      // regular submit form stuff here     
    });
});

submit()
处理程序中,
e.target
将引用
,即使在您单击提交按钮时也是如此。下面是一个示例:@patrick dw:谢谢,我只是在测试它。我猜事件实际上不是从提交按钮触发的。问题是:“请注意,我无法绑定到特定的单击事件”这是正确的-绑定到按钮假定只有按钮才会导致表单submits@Damovisa,是的,这是一个正确的假设。只有提交按钮才能导致表单提交(或javascript submit()调用,但您可能已经控制了这些调用)。正确的选择器是
:submit
,而不是
:button
,不过-我已经解决了这个问题。不幸的是,这就是问题所在-我无法控制所有提交函数。首先是ASP.Net,页面上有一些元素可以使用javascript触发提交,我不容易访问。@Damovisa:se,使用单击处理程序保存单击目标(
$(':submit')。单击(函数(){$(this)。最近('form')。数据('source',this);});
或类似的内容)。CanSubmit功能是一个验证功能吗?为什么您关心按下了哪个按钮?在给定表单上是否有多个按钮?不,它最终是一个确定按下了哪个按钮的功能。我关心这个问题,因为一些按钮会导致帖子正常(取消、主页等),而另一些按钮会导致帖子不正常(提交、编辑等).是的,我在表单上有不止一个按钮。嗯,这是个好主意,但我认为这可能与我需要的相反-除非我停止表单,否则表单将提交,所以除了第一次,我需要每次都运行该函数。一种更好的方法来保证单个事件处理程序的执行:。@Matt-很好的建议。不过,我不确定这有多好,根据
.one()
文档,它们是等价的。当然,它们是等价的,为什么不使用专门构建的方法呢?它更清晰(IMO)和更简洁。无论如何,我不想就此展开辩论——只是通常的“使用已经创建的内容”@马特-你说得对;节省几次按键总是一件好事;)----只是想指出它们实际上做了完全相同的事情。-在答案中编辑了
.one()