2012-03-20 64 views
6

的什么,我试图做一个简化的版本如下:jQuery的全球监听自定义事件

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


// ... later on! 

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

我想indication.bind('custom-event')function OtherThing接收触发无两有明确了解彼此。这可能吗?到目前为止,我唯一的解决方案是将监听器和事件绑定到body ...这看起来很sl - - 有没有更好的方法?

+0

什么你的意思是“没有两个人必须明确地彼此了解”? – 2012-03-20 17:53:01

+0

@RobW - 不知道如何进一步解释它,然后阅读代码...我知道我可以将'$(this).trigger'改成'$('#some-div).trigger'并让它工作但是这打破了目的。正如我所说我现在的解决方案是将监听器和发射器绑定到'$('body')' – Will 2012-03-20 17:56:34

回答

18

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

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

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

所以,代码应该是:

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

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

你最好将事件绑定到'document'而不是'body'。此外,如果元素不是文档的一部分(例如,未注入/ iframe),则这不起作用。 – 2012-03-20 17:58:57

+0

没错,@RobW。如果元素不是父元素的同一文档的一部分,则该事件不会传播给它。 – 2012-03-20 18:07:47

+1

感谢这个伟大的答案 - 它也帮助了我。 – carousel 2013-05-19 13:21:46