jQuery中的自定义事件没有绑定到DOM元素?

Geu*_*uis 49 jquery events

我很好奇是否可以在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)

  • 看起来jQuery现在支持这个:http://bugs.jquery.com/ticket/7818#comment:26,http://forum.jquery.com/topic/triggering-custom-events-on-js-objects.链接中提到的`triggerHandler`变通方法也在问题7930中得到修复. (7认同)
  • 是的,jQuery现在支持这个(参见我的回答:http://stackoverflow.com/a/26062543/710356) (3认同)

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年后,我可以证明这是一个坏主意.这些自定义事件导致难以理解的数据流.更喜欢回调.


Geu*_*uis 6

对于未来的读者来说,这样做相当简单.在发布我的问题后我做了进一步的研究.不幸的是,没有其他评论者是正确的.

为了绑定自定义事件:

$().bind('mycustomevent', function(){
    //code here
});
Run Code Online (Sandbox Code Playgroud)

此外,您可以将数据构建到以后可访问的事件对象中:

$({mydata:'testdata'}).bind('mycustomevent',function(){
    //code here
});
Run Code Online (Sandbox Code Playgroud)

  • 你应该知道`$()`你仍然将它绑定到DOM对象(`$()`和`$(document)`相同.`$({})`有效,但你应该知道它有效,因为jQuery从不检查它是否是一个DOM对象.它仍然用一个jQuery对象包装它,该对象具有诸如`append(...)`之类的方法,如果被调用则会停止你的脚本.此外,包装非DOM对象的行为未定义,将来可能会更改.所以我仍然坚持我的观点,并建议你将它绑定到`$(document)`而不是JavaScript对象. (17认同)

小智 5

jQuery 1.4.4 中删除了对非 dom 元素的绑定。