2011-08-26 71 views
1

我试图用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永远不会被解雇。

回答

6

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

来触发元素上,这样做:

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

触发事件在全球范围,因此所有订阅元素得到事件,这样做:

$.event.trigger('folderPick'); 
+0

+1为''.event.trigger()'我不知道这是可能的,性感 – meo

+0

@meo我不认为它正式记录在jQuery文档中。如果有的话,我还没有找到它(或者我会在我的答案中链接到它)如果你做一些谷歌搜索自定义全球jQuery事件,你会发现很多文章解释它的用法,但是。 http://www.google.com/search?q=custom%20global%20jquery%20event –

+0

谢谢,这正是我一直在寻找的。我正在考虑使用$ .event.trigger,因为我的图标具有要刷新的状态,具体取决于所选的文件夹。非常感谢你! :) – Gazillion

2

这是因为你试图触发你需要做的文档事件:

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

,而不是:

$(document).trigger('folderPick'); 

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

如果你不想这样,只是让一个功能

1

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

DOM事件

  1. 下井DOM(捕获阶段),直到
  2. 他们达到目标(在目标)然后
  3. 冒泡(冒泡阶段)的DOM 。

但jQuery的自定义事件

  1. 触发在所述目标(在目标)然后
  2. 冒泡(冒泡阶段)的DOM。

所以当引发自定义事件,它会在document然后泡了增加,因而从未被上调.folder-action,因此alert不点火。

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

相关问题