jQuery:同一事件的多个处理程序

fly*_*ire 135 javascript jquery event-handling

如果我将两个事件处理程序绑定到同一个元素的同一事件会发生什么?

例如:

var elem = $("...")
elem.click(...);
elem.click(...);
Run Code Online (Sandbox Code Playgroud)

最后一个处理程序是"win",还是两个处理程序都会运行?

Rus*_*Cam 163

两个处理程序都将运行,jQuery事件模型允许一个元素上有多个处理程序,因此后来的处理程序不会覆盖旧的处理程序.

处理程序将按照绑定的顺序执行.


Ste*_*202 36

假设您有两个处理程序fg,并且希望确保它们以已知和固定的顺序执行,然后将它们封装起来:

$("...").click(function(event){
  f(event);
  g(event);
});
Run Code Online (Sandbox Code Playgroud)

通过这种方式(从jQuery的角度来看)只有一个处理程序,它以指定的顺序调用fg.

  • +1,在函数内部封装是要走的路.甚至更好的条件逻辑可以包含在处理函数内部,以控制被触发的事件. (3认同)

all*_*arn 17

jQuery的.bind()以绑定的顺序触发:

当事件到达元素时,将触发绑定到该元素的该事件类型的所有处理程序.如果注册了多个处理程序,它们将始终按照绑定的顺序执行.在执行所有处理程序之后,事件沿着正常事件传播路径继续.

资料来源:http://api.jquery.com/bind/

因为jQuery的其他函数(例如.click())是快捷方式.bind('click', handler),我猜它们也会按它们绑定的顺序触发.


and*_*toi 10

您应该能够使用链接按顺序执行事件,例如:

$('#target')
  .bind('click',function(event) {
    alert('Hello!');
  })
  .bind('click',function(event) {
    alert('Hello again!');
  })
  .bind('click',function(event) {
    alert('Hello yet again!');
  });
Run Code Online (Sandbox Code Playgroud)

我想下面的代码也是这样做的

$('#target')
      .click(function(event) {
        alert('Hello!');
      })
      .click(function(event) {
        alert('Hello again!');
      })
      .click(function(event) {
        alert('Hello yet again!');
      });
Run Code Online (Sandbox Code Playgroud)

资料来源:http://www.peachpit.com/articles/article.aspx?p = 1371947&seqNum = 3

TFM还说:

当事件到达元素时,将触发绑定到该元素的该事件类型的所有处理程序.如果注册了多个处理程序,它们将始终按照绑定的顺序执行.在执行所有处理程序之后,事件沿着正常事件传播路径继续.

  • @CrescentFresh:很抱歉这么晚的回复,我刚刚看到了这个问题,但我想请你指点[link](http://api.jquery.com/bind/),它是jQuery的官方文档和它明确地说:当一个事件到达一个元素时,绑定到该元素的事件类型的所有处理程序都被触发.如果注册了多个处理程序,它们将始终按照绑定的顺序执行.在所有处理程序执行完毕后,事件将继续沿着正常的事件传播路径 (5认同)