【问题标题】:Ensure jQuery event handler execution order确保 jQuery 事件处理程序执行顺序
【发布时间】:2012-02-20 16:00:43
【问题描述】:

认为事件处理程序是按照它们注册的顺序处理的。 (对吗?)如果是这种情况,那么如果我在脚本的开头附加一个事件处理程序,我可以绝对确定它会在附加到同一事件的后续处理程序之前触发吗?事件命名空间也对此有任何影响吗?事件处理程序是串行触发(一个在下一个完成之前完成)还是并行触发?

我想这样做是因为我的脚本依赖于视口大小,视口大小会随着 resize 事件发生变化,我需要不断地寻找它。我不想在我的每个处理程序函数中重复调用$(window).width(),而是想在我的脚本顶部放置一个处理程序,在每次调整大小时将$(window).width() 保存到对象属性中。然后在后续的处理程序中,我可以访问该属性并确定它是最新的测量值。

我知道我可以创建一个在计算完成后立即触发的自定义事件,并将后续处理程序附加到自定义事件。但是,我不想这样做,因为我需要保持与我之后的插件的互操作性,这些插件也可能附加到调整大小事件。

【问题讨论】:

  • 你的性能是否被$(window).width() 所取代?如果不是,为什么要打扰?您将只引入对全局变量状态的脆弱依赖。
  • @Inerdial 我需要调用它以及其他一些计算,例如 20 次。我认为这会有所作为。
  • 20 次?不,不会的。尝试以 20 次迭代循环执行您在开发者控制台中提到的计算,看看您是否能注意到延迟。 (更好的是,试试 2000 年。)
  • @Inerdial 如果有办法不重复代码,为什么要重复代码?问题是让它不脆弱。我也认为会有一个缩小的好处。它比简单的 $(window).width() 更多的计算 - 调用需要它的函数。

标签: javascript javascript-events event-handling jquery


【解决方案1】:

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

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

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

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

【讨论】:

  • 抱歉,有没有办法用纯 Javascript 访问它?
  • @AndréAlçadaPadez - 不。不仅如此,这只会为您提供使用 jQuery 附加的事件处理程序。
  • 谢谢,我在处理 javascript 事件时遇到了很多麻烦 :)
  • @AndréAlçadaPadez 是的,IMO 令人困惑。他们有很多方法api.jquery.com/category/events/event-handler-attachment$.on() 的文档对何时使用哪一种提供了一些见解。此外,这篇文章值得一读,以了解 trigger 的作用:net.tutsplus.com/tutorials/javascript-ajax/…
  • 谢谢,但我真的需要纯 javascript :)
猜你喜欢
  • 1970-01-01
  • 2011-10-27
  • 2011-03-28
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
  • 2012-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多