为什么 jQuery 的 .on() 有效而原生 JavaScript 的 .addEventListener() 无效?

Why does jQuery's .on() work but native JavaScript's .addEventListener() doesn't?

我需要收听 WooCommerce 的自定义事件,例如 wc_fragment_refreschedadded_to_cart。但是当通过本机 addEventListener 为这些事件创建监听器时,什么也没有发生。但是 jQuery 的 .on() 工作正常。

工作:

jQuery(document.body).on('wc_fragments_refreshed', function() {
  console.log("hehey!");
});

不工作:

document.body.addEventListener('wc_fragments_refreshed', function() {
  console.log("hoho!");
});

有谁知道为什么本机侦听器不起作用?

不同之处在于 addEventListener() 不监听 jQuery 触发的事件。要引发该事件处理程序,您需要在 document.body.

上使用 dispatchEvent

下面是一个例子。请注意 jQuery 触发两次,因为它 确实 处理了两个事件触发器。

// jQuery
$(document.body).on('wc_fragments_refreshed', function() {
  console.log("jQuery handled the event");
}).trigger('wc_fragments_refreshed');

// Native
document.body.addEventListener('wc_fragments_refreshed', function() {
  console.log("POJS handled the event");
});
document.body.dispatchEvent(new Event('wc_fragments_refreshed'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>