事件处理程序适用于 IE11 或 Chrome,但不能同时适用于两者

Event handlers work in IE11 or Chrome, but not both

在我帮助维护的代码库中,存在这种形式的函数(为简洁起见被删除):

function setListeners(enable) {
    const fn = enable ? document.body.addEventListener : document.body.removeEventListener;

    fn('click', foo);
    fn('MyCustomEvent', bar);
}

IE11 抛出 Illegal Invocation,而其他浏览器工作正常。另一位维护者将功能切换为这种形式:

function setListeners(enable) {
    const fn = enable ? document.body.addEventListener : document.body.removeEventListener;

    fn.call(document.body, 'click', foo);
    fn.call(document.body, 'MyCustomEvent', bar);
}

现在可以在 IE11 中使用,但不能 Chrome。我们已经有一个 CustomEvent 的 polyfill(如图所示,它有一个隐含的用途),但是还有什么阻止这个函数保持跨浏览器?

你的第二个代码片段应该没问题。这是一个工作示例(对我来说在 Chrome 中成功测试):

const fn = document.body.addEventListener;

fn.call(document.body, 'MyCustomEvent', e => {
  console.log('MyCustomEvent', e.detail);
});

document.body.dispatchEvent(new CustomEvent('MyCustomEvent', {
  detail: 'it worked!'
}));

也许您的 CustomEvent polyfill 妨碍了您的工作,或者还有其他未显示的因素在起作用?