【问题标题】:How can I find the button that was clicked from the form submit event in jquery?如何在 jquery 中找到从表单提交事件中单击的按钮?
【发布时间】:2011-04-09 11:21:14
【问题描述】:

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

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 参数中获取该值?

【问题讨论】:

  • CanSubmit 函数是验证函数吗?为什么你关心按下了什么按钮?给定表单上是否有多个按钮?
  • 不,它最终是一个确定按下哪个按钮的函数。我很在意,因为有些按钮会导致帖子正常(取消、主页等),而其他按钮会导致帖子不正常(提交、编辑等)。是的,我在表单上有不止一个按钮。

标签: javascript jquery cross-browser jquery-events


【解决方案1】:

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

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

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

或者,正如马特鲍尔在 cmets 中指出的那样,您可以使用 .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 取消绑定其他处理程序。

【讨论】:

  • 保证单个事件处理程序执行的更好方法:jQuery.one().
  • @Matt - 不错的建议。不知道如何更好,但根据.one() 文档,它们是等效的。
  • 当然,它们是等价的,为什么不使用专门构建的方法呢?它更清晰(IMO)和更简洁。无论如何,我并不想对此进行辩论——只是通常的“使用已经创建的东西”。
  • @Matt - 你是对的;节省一些按键总是一件好事;)----只是想指出他们实际上做的是完全相同的事情。 - 将.one() 编辑为答案。
【解决方案2】:

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

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

【讨论】:

  • 嗯,一个好主意,但我认为这可能与我需要的相反 - 除非我停止它,否则表单将提交,所以我需要每次运行该函数 除了第一次。
【解决方案3】:

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

【讨论】:

  • 问题说明:“请注意,我无法绑定到特定的点击事件”
  • 这是正确的 - 绑定到按钮假定它只是导致表单提交的按钮
  • @Damovisa,是的,这是一个正确的假设。只有提交按钮可以导致表单提交(或 javascript submit() 调用,但您大概可以控制这些)。它们的正确选择器是 :submit,而不是 :button,不过 - 我已修复。
  • 不幸的是,这就是问题所在 - 我无法控制所有提交功能。一开始是 ASP.Net,页面上有一些元素可以使用我不容易访问的 javascript 触发提交。
  • @Damovisa:在这种情况下,使用点击处理程序来保存点击目标($(':submit').click(function(){$(this).closest('form').data('source',this);}); 或类似的东西)。
【解决方案4】:

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

我能找到的最接近 explicitOriginalTarget 的东西是 document.activeElement(对于 IE)——它是活动期间的焦点元素。基于 webkit 的浏览器没有等价物。所以不,没有真正的跨浏览器方法可以仅使用事件对象来执行此操作。

【讨论】:

  • submit() 处理程序中,e.target 将引用&lt;form&gt;,即使您单击提交按钮也是如此。这是一个示例:jsfiddle.net/zHbrC
  • @patrick dw:谢谢,我只是在测试它。我猜这个事件实际上并不是从提交按钮触发的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
相关资源
最近更新 更多