将事件附加到元素并正确调度它

Attaching an Event to an element and dispatching it correctly

我需要将一个名为 render 的事件附加到 panel 元素,它只会在 panel 渲染时被分派以警告所有听众。

按照 this link 的老式方法部分,我想出了这个代码:

/**
* **Static** Re-draw the layer panel to represent the current state of the layers.
* @param {Element} panel The DOM Element into which the layer tree will be rendered
*/
static renderPanel(panel) {

    // Create the event.
    var render_event = document.createEvent('Event');

    // Define that the event name is 'render'.
    render_event.initEvent('render', true, true);

    // Listen for the event.
    panel.addEventListener('render', function (e) {
        // e.target matches panel
    }, false);

    panel.dispatchEvent(render_event);

这似乎奏效了,但由于这是我第一次这样做,我不太确定如何检查此方法的正确性。

查看控制台内部,我可以看到我的 panel 元素正在调度 render 事件,但我想在继续之前询问是否有我遗漏或担心的事情。

为了调试结果,我尝试向 document 元素添加一个事件侦听器,例如 document.addEventListener("render",console.log("ciao")),它又在控制台中打印了一次 ciao,但只打印了一次。

我以为我可以在控制台中看到与触发 render 事件的次数一样多的 "ciao",但事实并非如此。

mdn guide on creating and dispatching custom events(与您的 link 相同)

老式的方法在我尝试时似乎仍然可以正常工作,每次触发事件时我都会看到文档事件监听器控制台日志。

更新后的方式是: panel.dispatchEvent(new CustomEvent('render'));

let div = document.querySelector('div');
div.addEventListener('old-event', () => {console.log('Old-fashinoed event caught')});
div.addEventListener('new-event', () => {console.log('New-fashioned event caught')});

let oldEvent = document.createEvent('Event');
oldEvent.initEvent('old-event', true, true);

let newEvent = new CustomEvent('new-event');

setInterval(() => {
  div.dispatchEvent(oldEvent);
  div.dispatchEvent(newEvent);
}, 1000);
<div>I emit an old-fashioned and a new-fashioned event every 1 second</div>

如果您在每次触发事件时都尝试检查,addEventListener 的第二个参数(考虑到您愿意实现的目标)应该是使用事件对象作为参数的函数回调,例如示例:

document.addEventListener("render", function(e) { console.log("ciao"); });

在您的示例中,您正在执行 console.log("ciao"),没有传递函数引用(匿名或非匿名),这就是它只执行一次的原因:当页面 loads/evaluates 你的脚本。