控制事件处理程序/侦听器的执行顺序

Controlling the order that event handlers / listeners are executed in

提问人:LRE 提问时间:3/24/2010 最后编辑:Brian Tompsett - 汤莱恩LRE 更新时间:5/24/2022 访问量:8271

问:

IE Monster 再一次给我带来了一个奇怪的问题。

我正在将一些更改写入我不久前继承的 asp.net 网站。其中一个问题是,在某些页面中,有几个控件将 Javascript 函数作为处理程序添加到 onload 事件中(如果这很重要,请使用 YUI)。其中一些事件处理程序假定已执行某些其他函数。

这在 Firefox 和 IE7 中很好,因为处理程序似乎是按注册顺序执行的。另一方面,IE8 是倒着做的。

我可以使用某种双重检查方法,但鉴于控件存在于多个页面中,我觉得这会创建更多的依赖关系。因此,我开始编写自己的队列类,我将函数推送到该类,并可以控制它们的执行顺序。然后,我将注册一个 onload 处理程序,该处理程序指示队列按我的首选顺序执行。

我已经完成了一半,并开始想知道两件事:

  1. 我要去OTT吗?
  2. 我是在重新发明轮子吗?

有人有什么见解吗?有没有干净的解决方案可以让我轻松执行执行命令?

JavaScript 事件 dom-events

评论

2赞 flitig 7/7/2017
诚然,我不知道你的代码是什么样子的,但我本能的回应是,拥有依赖于执行顺序的脚本有点代码味道。也许您可以重构代码以使用基于事件的架构?
0赞 Koushik Chatterjee 7/9/2017
@LRE,那么这个问题还存在吗?每次我们想要注册一个事件时,都推送一个队列,并在最初注册的单个事件上处理整个队列是一个很好的解决方案,但这会产生另一个逻辑编码层。我对此做了一些工作。因此,我们可以通过添加某种补丁来制作通用解决方案。而且,如果我们能够检测平台(通过 window.navigator),那么我们可以只应用于需要的平台。如果您仍然对此感兴趣,请回复。

答:

-1赞 anx 8/30/2017 #1

我找不到任何可以定义事件调用顺序的标准。这不是问题,这是纯粹的无政府状态:D

此外,此模式有数百个独立实现,因此它们不太可能在短期内保持一致。

所以,是的,你要自己出发了。

我所拥有的最干净、最兼容的方法,是只注册一个事件处理程序:D这样一来,原生秩序就变得无关紧要了。

现在的诀窍是在此基础上添加你自己的可预测事件管理 - 使用库,例如,根据你的要求,使用 nodeJS 的版本进行扩展。

请注意,JS 允许你自由地覆盖原型派生的函数,所以另一种可能性是这样的:

function eventify(element){
  element._event = {}
  element.on = element.addListener = function(evt,fn){ ... }
  element.off = element.removeListener = function(evt,fn){ ... }
  element.emit function(evt,args...){ ... do it the right way ... }
}

因此,也许您在考虑队列和锁定机制时有点偏离了轨道:)