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()
。