我很好奇是否可以在jQuery中创建一个未绑定到DOM元素的自定义事件.
我非常喜欢jQuery和YUI,但我喜欢YUI中的一件事,即创建自定义事件并能够在以后订阅它们.
例如,这会创建一个绑定到变量的事件,而不是DOM元素:
var myevent = new YAHOO.util.CustomEvent("mycustomevent");
Run Code Online (Sandbox Code Playgroud)
我为jQuery阅读的所有示例和文档都需要:
$('body').bind('mycustomevent', function(){
//do stuff
});
Run Code Online (Sandbox Code Playgroud)
Bli*_*ixt 43
你可以在jQuery中触发这样的自定义全局事件:
jQuery.event.trigger('mycustomevent', [arg1, arg2, arg3]);
Run Code Online (Sandbox Code Playgroud)
这些将触发任何元素.
由于jQuery是围绕DOM对象构建的,因此必须将事件绑定到DOM对象.你可以找到一些方法来绑定没有元素的事件(你做过),但这不是一种支持的方法.
正如您在自己的回答中所写,如果您不想将事件绑定到单个页面元素,则可以将事件绑定到全局DOM对象:
$(document).bind('mycustomevent', function (e, arg1, arg2, arg3) { /* ... */ });
Run Code Online (Sandbox Code Playgroud)
sbi*_*nko 39
根据由John Resig的评论,结合事件通过jQuery自定义对象支持:
没有特别的原因,为什么它没有记录(除了它对大多数用户来说相当不传统) - 但是,是的,我们支持它并进行单元测试.
这样可行:
var a = {foo: 'bar'};
$(a).on('baz', function() {console.log('hello')});
$(a).triggerHandler('baz');
>>> 'hello'
Run Code Online (Sandbox Code Playgroud)
大多数用户需要triggerHandler(),而不是trigger().如果.trigger("eventName")使用,它将在对象上查找"eventName"属性,并在执行任何附加的jQuery处理程序后尝试执行它(Source).
编辑(28.02.2017):
在大型代码库中使用此模式约2年后,我可以证明这是一个坏主意.这些自定义事件导致难以理解的数据流.更喜欢回调.
对于未来的读者来说,这样做相当简单.在发布我的问题后我做了进一步的研究.不幸的是,没有其他评论者是正确的.
为了绑定自定义事件:
$().bind('mycustomevent', function(){
//code here
});
Run Code Online (Sandbox Code Playgroud)
此外,您可以将数据构建到以后可访问的事件对象中:
$({mydata:'testdata'}).bind('mycustomevent',function(){
//code here
});
Run Code Online (Sandbox Code Playgroud)