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

Posted

技术标签:

【中文标题】使用名称中的点调度 CustomEvent 不会触发 jQuery.on() 事件侦听器【英文标题】:Dispatching CustomEvent with dot in name do not trigger jQuery.on() event listener 【发布时间】:2016-10-03 17:35:06 【问题描述】:

我使用 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

【问题讨论】:

【参考方案1】:

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

简短的回答是,jQuery 没有办法为此类事件安装处理程序。

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

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

【讨论】:

【参考方案2】:

“正常”的 DOM 事件系统没有命名空间的概念。 window.addEventListener('test.namespace', ...) 实际上会监听名为 test.namespace 的事件,这就是您使用 new CustomEvent('test.namespace', ...) 创建的事件。

Event namespaces是jQuery中的一个概念:

事件名称可由事件命名空间限定,以简化删除或触发事件。例如,"click.myPlugin.simple" 为这个特定的点击事件定义了 myPlugin 和 simple 命名空间。通过该字符串附加的单击事件处理程序可以使用.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>

【讨论】:

以上是关于使用名称中的点调度 CustomEvent 不会触发 jQuery.on() 事件侦听器的主要内容,如果未能解决你的问题,请参考以下文章

组件的调度自定义事件没有父级

如何去除姓名首字母中的点和空格

是否有 Google 表格公式可以将表格名称放入单元格中?

cron 作业或 PHP 调度程序

如果 CustomEvent 在元素上触发,则取消“单击”DOM 事件

转 js自定义事件——Event和CustomEvent