Internet Explorer 9, 10 и 11 Конструктор событий не работает
Я создаю событие, поэтому используйте конструктор событий DOM:
new Event('change');
Это прекрасно работает в современных браузерах, однако в Internet Explorer 9, 10 и 11 он терпит неудачу:
Object doesn't support this action
Как я могу исправить Internet Explorer (в идеале через polyfill)? Если я не могу, есть ли способ обхода, который я могу использовать?
Ответы
Ответ 1
Здесь существует IE polyfill для конструктора CustomEvent в MDN. Добавление CustomEvent в IE и использование этого вместо этого работает.
(function () {
if ( typeof window.CustomEvent === "function" ) return false; //If not IE
function CustomEvent ( event, params ) {
params = params || { bubbles: false, cancelable: false, detail: undefined };
var evt = document.createEvent( 'CustomEvent' );
evt.initCustomEvent( event, params.bubbles, params.cancelable, params.detail );
return evt;
}
CustomEvent.prototype = window.Event.prototype;
window.CustomEvent = CustomEvent;
})();
Ответ 2
Я думаю, что наилучшим решением для решения вашей проблемы и создания кросс-браузерных событий является:
function createNewEvent(eventName) {
var event;
if (typeof(Event) === 'function') {
event = new Event(eventName);
} else {
event = document.createEvent('Event');
event.initEvent(eventName, true, true);
}
return event;
}
Ответ 3
Этот пакет делает магию:
https://www.npmjs.com/package/custom-event-polyfill
Включите пакет и отправьте событие следующим образом:
window.dispatchEvent(new window.CustomEvent('some-event'))
Ответ 4
Если вы просто пытаетесь отправить простое событие, такое как событие переключения HTML, это работает в Internet Explorer 11, а также в других браузерах:
let toggle_event = null;
try {
toggle_event = new Event("toggle");
}
catch (error) {
toggle_event = document.createEvent("Event");
let doesnt_bubble = false;
let isnt_cancelable = false;
toggle_event.initEvent("toggle", doesnt_bubble, isnt_cancelable);
}
// disclosure_control is a details element.
disclosure_control.dispatchEvent(toggle_event);
Ответ 5
Я лично использую функцию обертки для обработки созданных вручную событий. Следующий код добавит статический метод для всех интерфейсов Event
(все глобальные переменные, заканчивающиеся на Event
являются интерфейсом Event) и позволяют вам вызывать функции, такие как element.dispatchEvent(MouseEvent.create('click'));
на IE9+.
(function eventCreatorWrapper(eventClassNames){
eventClassNames.forEach(function(eventClassName){
window[eventClassName].createEvent = function(type,bubbles,cancelable){
var evt
try{
evt = new window[eventClassName](type,{
bubbles: bubbles,
cancelable: cancelable
});
} catch (e){
evt = document.createEvent(eventClassName);
evt.initEvent(type,bubbles,cancelable);
} finally {
return evt;
}
}
});
}(function(root){
return Object.getOwnPropertyNames(root).filter(function(propertyName){
return /Event$/.test(propertyName)
});
}(window)));
EDIT: функция поиска всех интерфейсов Event
также может быть заменена массивом для изменения только необходимых интерфейсов событий (['Event', 'MouseEvent', 'KeyboardEvent', 'UIEvent'/*, etc... */]
).
Ответ 6
пакет npm для custom-event
отлично работал для меня
https://www.npmjs.com/package/custom-event
var CustomEvent = require('custom-event');
// add an appropriate event listener
target.addEventListener('cat', function(e) { process(e.detail) });
// create and dispatch the event
var event = new CustomEvent('cat', {
detail: {
hazcheeseburger: true
}
});
target.dispatchEvent(event);