两个在表单上提交事件处理程序。一个人必须阻止另一个人

时间:2010-12-22 09:52:46

标签: javascript jquery

我必须将事件处理程序附加到表单上。如果不满足条件,第一个触发的应该停止另一个事件。

以下代码不起作用,因为两个事件都将被触发。你能救我吗?

谢谢!

//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的东西是在一个不可更改的插件中。我无法避免两个事件处理程序

2 个答案:

答案 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命令。