$ .event.trigger不处理DOM元素

时间:2013-09-07 04:29:17

标签: jquery events

据我所知,这应该有用......

$('#test').on "newMessage", ->
  alert('test')

$(document).on "newMessage", ->
  alert('document')

$.event.trigger('newMessage')

示例http://jsfiddle.net/Nbdyb/

有人可以帮助我理解为什么我从未收到“测试”警报吗?

3 个答案:

答案 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的事件处理。