为什么我不能解雇自定义事件?

时间:2011-08-26 15:11:34

标签: jquery

我正在尝试使用jquery触发自定义事件但由于某种原因我似乎无法触发和/或捕获它们。

我正在使用jstree插件创建一个包含文件夹的文件系统:

$('.filetree.global, .filetree.workspace').bind('select_node.jstree', function (event, data) {
    alert('test ');
    $(document).trigger( 'filePick').trigger( 'folderPick' );
}).jstree({
    /*stuff*/
});

在代码中,我将filePick和folderPick事件绑定到具有特定类的元素,并告诉他们在捕获事件时提醒测试消息:

$('.folder-action').bind( 'folderPick', function(e, data) {
    alert('test 2');
} );

不幸的是,警报永远不会被触发,我不知道为什么。 jquery文档对我来说非常清楚,我遵循了一个不同的教程,似乎也表明我的代码应该可以工作,但事实并非如此!哎呀!

'测试1'会收到警报但不会“测试2”。此外,我安装了Eventbug(Firebug扩展),我可以看到我对filePick的绑定已经注册,这让我相信filePick和folderPick永远不会被解雇。

3 个答案:

答案 0 :(得分:6)

jQuery事件冒出来,但没有下降。这意味着当您在文档上触发事件时,它不会触发文档内的元素。您可以触发该元素上的事件,也可以全局触发事件。

要触发该元素,请执行以下操作:

$('.folder-action').trigger( 'folderPick' );

要全局触发事件,以便所有订阅的元素都能获得该事件,请执行以下操作:

$.event.trigger( 'folderPick' );

答案 1 :(得分:2)

这是因为您尝试在需要执行的文档上触发事件:

$('.folder-action').trigger( 'folderPick' );

而不是:

$(document).trigger( 'folderPick' );
例如,

。绑定事件时,将其绑定到DOM元素上。当你想再次调用它时,你需要选择相同的DOM元素......或者像Dan Herberts例子那样全局触发事件。

如果您不想这样,只需制作一个功能

答案 2 :(得分:1)

您正在document上触发自定义事件,但已将自定义事件的事件侦听器绑定到.folder-action

DOM活动

  1. 沿着DOM(捕获阶段)直到
  2. 他们到达目标(目标)然后
  3. 冒泡(冒泡阶段)DOM。
  4. 但是jQuery自定义事件

    1. 触发目标(目标)然后
    2. 冒泡(冒泡阶段)DOM。
    3. 因此,当引发自定义事件时,它将在document处被提升,然后冒出来,从而永远不会在.folder-action上引发,因此alert不会被触发。

      您需要在document上绑定自定义事件的事件侦听器,或在.folder-action上触发它们。 An example of binding on document