0

В кодовом я помочь сохранить существует функцию этой формы (урезанные для краткости):обработчиков событий работают в IE11 или Chrome, но не оба

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. У нас уже есть polyfill для CustomEvent (который подразумевает использование, как показано), но что еще препятствует тому, чтобы эта функция оставалась кросс-браузером?

+0

Вам определенно нужен подход '.call', и что не удалось в Chrome? – loganfsmyth

+0

Поскольку вторая версия должна работать, проблема, вероятно, в другом месте вашего кода. Поэтому вам нужно будет показать больше кода. – Barmar

ответ

0

Ваш второй фрагмент кода должен быть в порядке. Вот рабочий пример (успешно протестирована в 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 становится на пути, или есть другие факторы, которые не отображаются?

+0

Я не могу вставить проприетарный код, поэтому я соглашусь с этим и перейду к этой информации. Спасибо! –

Смежные вопросы