【问题标题】:Dispatching CustomEvent with dot in name do not trigger jQuery.on() event listener使用名称中的点调度 CustomEvent 不会触发 jQuery.on() 事件侦听器
【发布时间】: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

【问题讨论】:

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


    【解决方案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>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-12
        • 2023-03-11
        • 1970-01-01
        • 2020-09-06
        • 2015-12-18
        • 2013-05-19
        • 1970-01-01
        相关资源
        最近更新 更多