使用名称中的点调度CustomEvent不会触发jQuery.on()事件侦听器

时间:2016-06-03 15:15:41

标签: javascript jquery javascript-events namespaces custom-events

我使用过jQuery 2.2.4版并尝试捕获事件 - 没有运气。有什么方法可以解决问题吗?

此代码有效:

window.addEventListener('test.namespace', e => console.log('CustomEvent with namespace captured by vanilla'));

这不起作用:

$(window).on('test.namespace', e => console.log('CustomEvent with namespace captured by jQuery'));

const event = new CustomEvent('test.namespace', {
  bubbles: true,
  detail: 123
});
window.dispatchEvent(event);

http://jsbin.com/tecupavuji/edit?html,js,console

2 个答案:

答案 0 :(得分:5)

"正常" DOM事件系统没有名称空间的概念。 window.addEventListener('test.namespace', ...)将真正倾听名为test.namespace的活动,这是您使用new CustomEvent('test.namespace', ...)创建的活动。

Event namespaces是jQuery中的一个概念:

  

事件名称可以由事件名称空间限定,以简化删除或触发事件。例如,"click.myPlugin.simple"定义了此特定click事件的myPlugin和简单命名空间。通过该字符串附加的点击事件处理程序可以使用.off("click.myPlugin").off("click.simple")删除,而不会干扰附加到元素的其他点击处理程序。

这里重要的是命名空间不是事件名称的一部分。这就是为什么new CustomEvent('test.namespace', ...)不起作用的原因,但new CustomEvent('test', ...)会这样做。

如果要为特定命名空间触发事件,则必须使用jQuery:

$(window).trigger('test.namespace', {detail: 123});



$(window).on('test.namespace', e => console.log('CustomEvent with namespace captured by jQuery'));

$(window).trigger('test.namespace', {detail: 123});

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

先前的答案并没有真正解决如何为来自第三方(非jQuery)库的自定义事件注册处理程序的问题,该事件在事件名称中带有点。假设事件为foo.bar

简短的答案是jQuery无法为此类事件安装处理程序。

$(window).on( 'foo.bar' )将安装事件foo的处理程序。

似乎没有任何办法可以逃脱名称中的点或以其他方式强迫jQuery为名为foo.bar的事件安装处理程序。