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

时间:2010-09-07 23:27:47

标签: javascript jquery javascript-events cross-browser

我有一个函数,我正在使用它来防止表单的多个回发:

var submitted = false;
$(function() {
    $('form').bind('submit', function(e) {
        if (!submitted && CanSubmit(e)) {
            submitted = true;
            return true;
        } else {
            return false;
        }
    });
});

CanSubmit方法中,我需要查询被点击的按钮,以确定是否应该允许提交。

请注意,我无法绑定到特定点击事件 - 有关详细信息,请参阅this previous question

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

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

4 个答案:

答案 0 :(得分:2)

使用e.target - jQuery normalizes it来实现跨浏览器的一致性。

我能为explicitOriginalTarget找到的最接近的是document.activeElement(对于IE) - 它是在事件期间有焦点的元素。没有基于webkit的浏览器的等价物。所以不,没有真正的跨浏览器方式只使用事件对象。

答案 1 :(得分:2)

实际上,您只需将$('form').bind('submit'替换为$(':submit').bind('click',您的代码也可以正常工作(您可以使用this查看点击的内容。)

答案 2 :(得分:2)

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

$(function() {
    $('form').bind('submit', function(event) {
          // regular submit form stuff here
        ...
          // and unbind it
        $('this').unbind(event);       
    });
});

结帐 .unbind() ,“使用事件对象”

或者,正如Matt Ball在评论中指出的那样,您可以使用 .one() ,这相当于上述内容。

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

如果你有$.post()$.get()提交绑定到多个事件/元素的表单,那么你只需要确保解除最终使用的处理程序,并使用event对象,然后解除所有其他处理程序的绑定,反之亦然,对于其他每个处理程序。您可以使用 one of about four methods to unbind event handlers 取消绑定其他处理程序。

答案 3 :(得分:0)

为什么不使用.one函数,保证它只触发一次。

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