我有一个函数,我正在使用它来防止表单的多个回发:
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
参数中获取此值?
答案 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
});
});