我正在尝试使用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永远不会被解雇。
答案 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活动
但是jQuery自定义事件
因此,当引发自定义事件时,它将在document
处被提升,然后冒出来,从而永远不会在.folder-action
上引发,因此alert
不会被触发。
您需要在document
上绑定自定义事件的事件侦听器,或在.folder-action
上触发它们。 An example of binding on document