我使用过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);
答案 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;
答案 1 :(得分:1)
先前的答案并没有真正解决如何为来自第三方(非jQuery)库的自定义事件注册处理程序的问题,该事件在事件名称中带有点。假设事件为foo.bar
。
简短的答案是jQuery无法为此类事件安装处理程序。
$(window).on( 'foo.bar' )
将安装事件foo
的处理程序。
似乎没有任何办法可以逃脱名称中的点或以其他方式强迫jQuery为名为foo.bar
的事件安装处理程序。