Javascript 事件处理程序在IE11或Chrome中工作,但不能同时在两者中工作

Javascript 事件处理程序在IE11或Chrome中工作,但不能同时在两者中工作,javascript,google-chrome,ecmascript-6,internet-explorer-11,Javascript,Google Chrome,Ecmascript 6,Internet Explorer 11,在我帮助维护的代码库中,存在以下形式的函数(为简洁起见,将其剥离): IE11抛出非法调用,而其他浏览器工作正常。另一名维护人员将该功能切换为以下形式: function setListeners(enable) { const fn = enable ? document.body.addEventListener : document.body.removeEventListener; fn.call(document.body, 'click', foo); fn

在我帮助维护的代码库中,存在以下形式的函数(为简洁起见,将其剥离):

IE11抛出
非法调用
,而其他浏览器工作正常。另一名维护人员将该功能切换为以下形式:

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;
调用(document.body,'MyCustomEvent',e=>{
console.log('MyCustomEvent',例如detail);
});
document.body.dispatchEvent(新的CustomEvent('MyCustomEvent'){
细节:“成功了!”

}));
您肯定需要
.call
方法,那么Chrome中失败的是什么呢?因为第二个版本应该可以工作,问题可能在代码的其他地方。所以你需要显示更多的代码。我不能粘贴专有代码,所以我会接受这一点并继续使用这些信息。非常感谢。
function setListeners(enable) {
    const fn = enable ? document.body.addEventListener : document.body.removeEventListener;

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