【问题标题】:jQuery listen globally for custom eventjQuery 全局监听自定义事件
【发布时间】:2012-03-20 17:48:03
【问题描述】:

我正在尝试做的简化版本如下:

var indication = $('#some-div');
indication.bind('custom-event', function() { ... }


 // ... later on!

 function OtherThing() {
   $(this).trigger('custom-event');
 }

我希望indication.bind('custom-event') 接收来自function OtherThing 的触发器,而无需两者明确了解彼此。这可能吗?到目前为止,我唯一的解决方案是将侦听器和事件都绑定到 body ......这似乎很草率 - 有没有更好的方法?

【问题讨论】:

  • 你说的“不需要两个人明确地了解彼此”是什么意思?
  • @RobW - 不知道如何进一步解释它,除了阅读代码......我知道我可以将$(this).trigger 更改为$('#some-div).trigger 并让它工作,但这违背了目的。正如我所说,我目前的解决方案是将监听器和发射器绑定到$('body')

标签: jquery events custom-event


【解决方案1】:

在 JavaScript 中,每个 HTML 元素上触发的事件都会传播给它们的父元素,因此,为了解决您的问题并让任何元素能够处理自定义事件而不会像 $('*').bind('custom-event') 那样做错事,就是将监听器绑定到所有元素的共同父级,bodyhtml 元素:]

因此,您只需要将事件绑定到bodyhtml 元素。然后,当所选父元素内的任何元素触发自定义事件时,它将传播到该父元素。

然后,在事件处理程序中,您可以通过访问事件对象的target 属性来访问触发事件的元素:event.target

所以,代码应该是:

$('body').bind('custom-event', function(e){
  var $element = e.target;
});

$('#anyElement').trigger('custom-event');

【讨论】:

  • 您最好将事件绑定到document 而不是'body'。此外,如果元素不是文档的一部分(例如,未注入 / iframe),这将不起作用。
  • 没错,@RobW。如果元素不是父元素的同一文档的一部分,则不会将事件传播给它。
  • 感谢您的出色回答 - 它也帮助了我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 2010-10-30
  • 2019-02-07
  • 2017-02-18
  • 1970-01-01
相关资源
最近更新 更多