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

IT技术 javascript jquery event-handling
2021-02-10 17:33:31

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

例如:

var elem = $("...")
elem.click(...);
elem.click(...);

最后一个处理程序“获胜”,还是两个处理程序都会运行?

6个回答

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

处理程序将按照它们被绑定的顺序执行

请注意,对于 jQueryUI widgetfactory 小部件,如果您将处理程序设置为选项,则情况并非如此。对于要调用的旧处理程序和新处理程序,您需要使用该bind方法。有关详细信息,请参阅:learn.jquery.com/jquery-ui/widget-factory/...
2021-03-23 17:33:31
@RussCam如果相同的处理,势必更那么一旦发生什么事让刚才说jQuery('.btn').on('click',handlerClick);在不同的地方被称为没有实际.off它anywher?
2021-03-30 17:33:31
@MichaelScheper 随时编辑答案并更新附加信息
2021-03-31 17:33:31
本地方式会发生什么?本地人如何知道如何删除特定的?
2021-04-02 17:33:31
根据 DOM Level 3(参考 HTML 5 规范),事件处理程序按照它们注册的顺序执行 - w3.org/TR/DOM-Level-3-Events/#event-phasew3.org/TR/ 2014/REC-html5-20141028/…可以通过传递对已注册处理程序的引用来删除事件处理程序
2021-04-12 17:33:31

假设您有两个处理程序fg,并且想要确保它们以已知且固定的顺序执行,那么只需将它们封装起来:

$("...").click(function(event){
  f(event);
  g(event);
});

这样(从 jQuery 的角度来看)只有一个处理程序,它以指定的顺序调用fg

+1,封装在函数内是要走的路。甚至更好的条件逻辑可以包含在处理程序函数中,以控制被触发的事件。
2021-03-18 17:33:31
以编程方式确定其顺序的处理程序集合。
2021-04-14 17:33:31

jQuery 的 .bind() 按照绑定的顺序触发

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

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

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

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

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

我猜下面的代码正在做同样的事情

$('#target')
      .click(function(event) {
        alert('Hello!');
      })
      .click(function(event) {
        alert('Hello again!');
      })
      .click(function(event) {
        alert('Hello yet again!');
      });

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

TFM还说:

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

嗯?“现在当点击事件发生时,将调用第一个事件处理程序,然后是第二个,然后是第三个。” 不清楚?
2021-03-26 17:33:31
是的,我知道官方 recs 没有定义这个,PPK 已经证明事件执行是随机的,但也许 jQuery 已经修复了这个 ^^
2021-03-26 17:33:31
该代码和那篇文章都没有定义处理程序执行的顺序。是的,这就是事件绑定发生的顺序,但是事件处理程序被调用的顺序仍然是官方未定义的。
2021-03-27 17:33:31
@CrescentFresh:抱歉这么晚才回复,我刚看到这个问题,但我希望你指出链接,它是 jQuery 的官方文档,它清楚地说明了这一点When an event reaches an element, all handlers bound to that event type for the element are fired. If there are multiple handlers registered, they will always execute in the order in which they were bound. After all handlers have executed, the event continues along the normal event propagation path.
2021-03-27 17:33:31
啊,错过了那句话。事实上,作者被误导了。jQuery 还没有“修复”这个问题。因为规范没有正式定义顺序,所以技术上没有什么需要修复的。
2021-04-09 17:33:31

两个处理程序都被调用。

您可能正在考虑内联事件绑定(例如"onclick=..."),其中一个很大的缺点是只能为一个事件设置一个处理程序。

jQuery 符合DOM Level 2 事件注册模型

DOM 事件模型允许在单个 EventTarget 上注册多个事件侦听器。为了实现这一点,事件侦听器不再存储为属性值

@Rich:订单未正式定义。
2021-03-17 17:33:31