Javascript 在处理事件时,我可以依靠附加订单吗?

Javascript 在处理事件时,我可以依靠附加订单吗?,javascript,jquery,addeventlistener,Javascript,Jquery,Addeventlistener,就我所记得的,在纯W3C事件模型中(也就是说,使用addEventListener),不能保证事件处理程序将按照附加的顺序被调用 那么jQuery事件模型呢。我可以依赖附加事件的顺序吗? 回答时要小心,因为实际上这里有三个选项,而不是两个: 您不能依赖于附加事件的顺序,正如您可以从jQuery代码中看到的那个样 在当前的实现中,您可以依赖附加事件的顺序,但实际上,并没有人向您保证将来会始终支持此操作,因为保留顺序实际上是无意的 您可以依赖于附加事件的顺序—这是自愿实现的,并且很可能会永远伴随着

就我所记得的,在纯W3C事件模型中(也就是说,使用addEventListener),不能保证事件处理程序将按照附加的顺序被调用

那么jQuery事件模型呢。我可以依赖附加事件的顺序吗? 回答时要小心,因为实际上这里有三个选项,而不是两个:

  • 您不能依赖于附加事件的顺序,正如您可以从jQuery代码中看到的那个样
  • 在当前的实现中,您可以依赖附加事件的顺序,但实际上,并没有人向您保证将来会始终支持此操作,因为保留顺序实际上是无意的
  • 您可以依赖于附加事件的顺序—这是自愿实现的,并且很可能会永远伴随着我们,因为这是直观的,有助于我们使用一些常见的模式,如资源预初始化等

如果通过jQuery附加处理程序,它们将按照附加顺序被激发。这记录在:

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


您是对的,DOM事件规范没有定义事件处理程序()的任何顺序,事实上大多数浏览器都是这样做的,即使用另一种方式。保证顺序是jQuery为您所做的事情(每个元素每个事件只附加一个处理程序-它自己的-然后通过jQuery对附加的实际处理程序执行它自己的分派)。当然,这意味着没有定义jQuery附加的处理程序相对于以另一种方式附加的处理程序作为块被调用的顺序。

依赖事件附加顺序是错误的设计。这会在事件侦听器之间产生硬耦合。@Raynos同意,但在某些情况下,这种方法至少是可竞争的。例如,延迟初始化。您可以通过一次(“单击”)按需创建对象,第二次单击将访问该对象。当然,您也可以在第二次单击中检查对象是否已初始化。什么?你为什么要把它分成两个处理程序?:\这听起来很糟糕为什么一个人能想到分离?嗯,因为您可以初始化一次对象并多次使用该对象。如果您想按需进行初始化,您有两种主要方法:1。检查对象是否每次初始化,以及2。以某种方式在这个处理程序之外保证,在调用这个句柄之前,这个对象将被初始化。差不多吧。相信我,我知道我在说什么,只是这就足够对这个问题发表评论了。)