在 IE 11 中调度事件的正确方法

Ana*_*huk 2 javascript events internet-explorer dispatch internet-explorer-11

我在 Internet Explorer 11 中调度事件时遇到问题。目前,我们有:

fireEvent 对于 IE 和

createEvent
initEvent
dispatchEvent
Run Code Online (Sandbox Code Playgroud)

普通浏览器的习惯用法。

问题是这些在 IE 11 中都不起作用。新方法 - 使用new Event()/也不起作用new CustomEvent()

看起来微软弃用了他们的专有fireEvent(对于 IE 11),但没有提供对正确调度的支持。

附注。我相信我已经阅读了与此相关的所有主题,但仍然找不到工作解决方案

CBa*_*arr 6

这是我基于此 SO 答案的完整解决方案:https : //stackoverflow.com/a/49071358/79677

你可以这样使用它:SendBrowserAgnosticEvent(myElement, 'change') 它会返回创建的Event对象

这是 JavaScript 中的代码

/** This allows us to dispatch browser events in old IE and newer browsers */
export var SendBrowserAgnosticEvent = function(elem, eventName) {
    //Needed for IE Support: https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/dispatchEvent#Browser_Compatibility
    //https://stackoverflow.com/a/49071358/79677
    var event;
    if (typeof(Event) === 'function') {
        event = new Event(eventName);
    } else {
        event = document.createEvent('Event');
        event.initEvent(eventName, true, true);
    }
    elem.dispatchEvent(event);

    return event;
};
Run Code Online (Sandbox Code Playgroud)

这是在 TypeScript 中的完整类型

/** This allows us to dispatch browser events in old IE and newer browsers */
export const SendBrowserAgnosticEvent = <T extends HTMLElement | Window>(elem: T, eventName: string): Event => {
    //Needed for IE Support: https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/dispatchEvent#Browser_Compatibility
    //https://stackoverflow.com/a/49071358/79677
    let event;
    if (typeof(Event) === 'function') {
        event = new Event(eventName);
    } else {
        event = document.createEvent('Event');
        event.initEvent(eventName, true, true);
    }
    elem.dispatchEvent(event);

    return event;
};
Run Code Online (Sandbox Code Playgroud)