确保jQuery事件处理程序的执行顺序

6
我认为事件处理程序是按照注册顺序进行处理的。(这个说法正确吗?) 如果是这样的话,如果我在我的脚本开头附加一个事件处理程序,我可以确定它会在后续附加到同一事件的处理程序之前触发吗? 事件命名空间对此有影响吗? 事件处理程序是按系列(一个完成后才进行下一个)还是并行进行的?
我想这样做是因为我的脚本依赖于视口大小,在调整大小事件上会发生改变,我需要不断地检查它。不想在每个处理程序函数中反复调用$(window).width(),我想在我的脚本顶部放置一个处理程序,在每次调整大小时将$(window).width()保存到对象属性中。然后在后续的处理程序中,我可以访问该属性,并且确信它是最新的测量值。
我知道我可以创建一个自定义事件,该事件会在计算完成后立即触发,并将后续处理程序附加到自定义事件上。 但是,我不想这样做,因为我需要与我之后可能也在调整大小事件上附加的插件保持互操作性。

1
请参见https://dev59.com/A3VC5IYBdhLWcg3wcwwm。 - ustun
你是否因为 $(window).width() 而失去了重要的性能?如果没有,为什么要费心呢?这只会引入对全局变量状态的脆弱依赖。 - millimoose
@Inerdial 我需要调用它和其他计算大约20次。我认为这会有所不同。 - ryanve
20次?不会的。尝试在开发者控制台中使用循环执行你提到的计算,进行20次迭代,看看是否能注意到延迟。(最好尝试2000次。) - millimoose
@Inerdial 如果有不需要重复代码的方法,为什么还要重复呢?问题在于如何使其不易受损。我认为这样做还可以获得缩小文件体积的好处。这里涉及到的计算不仅仅是 $(window).width() 这样简单的调用,还包括需要该函数的其他函数的调用。 - ryanve
1个回答

4

如果您在任何其他脚本运行之前(甚至只是一个插件)附加事件处理程序,则回调将始终最先触发。

您可以通过数据对象检查事件处理程序数组:

$(window).data('events');

注意:这是一种未记录的方法,可能最终无法使用。仅用于检查。


抱歉打擾了,有沒有純粹使用Javascript的方法來訪問那個東西呢? - André Alçada Padez
3
不仅如此,这只会提供使用jQuery附加的事件处理程序。 - Joseph Silber
1
谢谢,我在处理JavaScript事件方面遇到了很多麻烦 :) - André Alçada Padez
谢谢,但我确实需要纯JavaScript的解决方案 :) - André Alçada Padez
糟糕,错过了不到一分钟的编辑窗口...自从jQuery 1.8以来,您需要执行:$._data(window, 'events');,请参见帖子。 - user9645
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接