为什么 jQuery 的 .on() 可以工作,而原生 JavaScript 的 .addEventListener() 却不能?

Tec*_*mad 2 javascript jquery event-handling dom-events woocommerce

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

在职的:

jQuery(document.body).on('wc_fragments_refreshed', function() {
  console.log("hehey!");
});
Run Code Online (Sandbox Code Playgroud)

不工作:

document.body.addEventListener('wc_fragments_refreshed', function() {
  console.log("hoho!");
});
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么本地监听器不工作?

Ror*_*san 6

区别是因为addEventListener()不监听 jQuery 触发的事件。要引发该事件处理程序,您需要使用dispatchEventon document.body

下面是一个例子。请注意,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'));
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
Run Code Online (Sandbox Code Playgroud)