dom 节点上的自定义事件侦听器

custom event listener on a dom node

我想在 js 中从一个元素调度一个自定义事件。是这样的:

var event = new CustomEvent("foo");
var elem = document.getElementById("bar");
elem.dispatchEvent(event);

但是我无法为 dom 节点上的新自定义事件绑定侦听器。使用标准事件很容易。只需添加一个属性 on<eventName>="some javascript"

<button onclick="console.log('click!')"></button>

自定义元素也可以吗?我尝试了 on<elementName>on-<elementName> 但它不起作用。

<button onfoo="console.log('foo!')"></button>
<button on-foo="console.log('foo!')"></button>

您可以使用 addEventListener 方法注册自定义事件处理程序。顺便说一句,这种方法也推荐用于本地事件。内联处理程序很糟糕,因为它们将视图 (HTML) 与逻辑 (js) 混合在一起。

var elem = document.getElementById("bar");

elem.addEventListener('foo', function() {
  console.log('foo event on bar')
})

document.getElementById('foo').addEventListener('click', function() {
  var event = new CustomEvent('foo');
  elem.dispatchEvent(event);
})
<button id="bar">Bar</button>
<button id="foo">Trigger Foo</button>

始终使用 addEventListener 而不是内联事件侦听器!

如果允许您这样做:

const button = document.querySelector('button');

button.addEventListener('foo', function () {
  console.log('foo!');
});

const event = new Event('foo');
button.dispatchEvent(event);
<button>Click</button>