据我所知,这应该有用......
$('#test').on "newMessage", ->
alert('test')
$(document).on "newMessage", ->
alert('document')
$.event.trigger('newMessage')
有人可以帮助我理解为什么我从未收到“测试”警报吗?
答案 0 :(得分:1)
您在newMessage
元素中注册了#test
处理程序,以便触发该事件应该在该元素或其中一个死者(事件冒泡)中触发。
应该是
$('#test').trigger('newMessage')
答案 1 :(得分:1)
由于$ .event没有正式记录,我将当前的源代码与一些旧版本的jQuery进行了比较,并找到了关于删除这个“功能”的TODO。至少它解释了为什么它不再起作用了。
这是用于实现此功能的代码块。
https://github.com/jquery/jquery/blob/1.6.2/src/event.js#L322-335
如果没有传入任何元素,当前代码现在只将document
指定为元素。这就是为什么它适用于文档和窗口的原因。
如果我想要匿名的pupsub,我似乎需要一个单独的库...
答案 2 :(得分:0)
当我将jquery
从 v1.7.1 升级到 v1.11.1 +时,我发现$.event.trigger()
无法正常工作更多。
仍然不知道为什么,但这里是事件驱动操作的替代解决方案(不是基于DOM的事件处理):
过去的日子:
// handler
$(anyElement).on('Foo:SelfDefined:Event', function(event){
console.log( event.self_data_1 );
console.log( event.self_data_2 );
});
------------------
// trigger handler
var evOpts = {
type : 'Foo:SelfDefined:Event',
self_data_1 : 'foo',
self_data_2 : 'bar'
};
$.event.trigger( evOpts );
现在:
// handler
$(document).on('Foo:SelfDefined:Event', function(event, evData){
console.log( evData.self_data_1 );
console.log( evData.self_data_2 );
});
------------------
// trigger handler
var evData = {
type : 'Foo:SelfDefined:Event',
self_data_1 : 'foo',
self_data_2 : 'bar'
};
$(document).trigger(evData.type, evData);
注意:如果元素A触发一个事件,只有它的父节点或它自己可以监听并附加该事件的处理程序,这就是为什么这个解决方案不适合基于DOM的事件处理。