我必须将事件处理程序附加到表单上。如果不满足条件,第一个触发的应该停止另一个事件。
以下代码不起作用,因为两个事件都将被触发。你能救我吗?
谢谢!
//fires first
$("#myform").submit(function(){
if (some validation) {
alert("You need to make the form valid");
return false;
}
});
//fires second
$("#myform").submit(function(){
//ajax stuff
return false;
});
P.S。我必须这样,因为ajax的东西是在一个不可更改的插件中。我无法避免两个事件处理程序
答案 0 :(得分:7)
查看event.stopImmediatePropagation()
:
保持其余的处理程序不被执行,并防止事件冒泡DOM树。
$("#myform").submit(function(event){
if (some validation) {
event.stopImmediatePropagation();
alert("You need to make the form valid");
return false;
}
});
您可能还想使用event.preventDefault()
。
更新:只是为了澄清:您可以依赖调用事件处理程序的顺序。来自jQuery的bind
方法:
当事件到达元素时,将触发绑定到该元素的该事件类型的所有处理程序。 如果注册了多个处理程序,它们将始终按照绑定的顺序执行。执行完所有处理程序后,事件将沿着正常的事件传播路径继续。
订单可能没有在W3C的原始定义中定义,但它适用于jQuery。否则,无论如何都不需要上面提到的函数;)
答案 1 :(得分:2)
简而言之,没有。如果您有两个事件处理程序,那么您有两个事件处理程序。尽管如此,还是有各种各样的方法。
首先,请记住javascript执行是单线程的。如果您定义了一个全局变量,比如var haveCalledSubmit=0;
,那么您可以使用它来同步您的处理程序。例如,如果使用以下命令启动每个处理函数:
if(haveCalledSubmit == 1)return haveCalledSubmit = 0;
else haveCalledSubmit = 1;
然后只会调用两个处理程序中的一个。您可以轻松地修改它以匹配某些条件,或处理两个以上的函数。
另一种方法是研究事件传播模型。 This page将为您提供所需的所有信息,尽管Felix已经提到了一个可能做你想做的ajax命令。