141

我正在创建一个事件,所以使用 DOM Event 构造函数:

new Event('change');

这在现代浏览器中运行良好,但是在 Internet Explorer 9、10 和 11 中,它失败了:

Object doesn't support this action

如何修复 Internet Explorer(最好通过 polyfill)?如果我不能,有没有我可以使用的解决方法?

4

7 回答 7

187

MDN 的 CustomEvent 构造函数有一个IE polyfill。将 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;
})();
于 2014-10-27T20:32:55.020 回答
67

我认为解决您的问题和处理跨浏览器事件创建的最佳解决方案是:

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;
}
于 2017-02-07T12:06:24.867 回答
4

这个包很神奇:

https://www.npmjs.com/package/custom-event-polyfill

包含包并发送事件,如下所示:

window.dispatchEvent(new window.CustomEvent('some-event'))
于 2017-02-16T17:44:39.130 回答
3

如果您只是想发送一个简单的事件,例如 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);
于 2016-09-15T13:21:26.347 回答
3

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);
于 2018-06-15T11:04:48.607 回答
3

有一个 polyfill 服务可以为你修补这个和其他的

https://polyfill.io/v3/url-builder/

 <script crossorigin="anonymous" src="https://polyfill.io/v3/polyfill.min.js"></script>
于 2019-03-14T00:28:16.790 回答
2

我个人使用包装函数来处理手动创建的事件。以下代码将在所有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)));

编辑:查找所有Event接口的函数也可以用数组替换,以仅更改您需要的事件接口(['Event', 'MouseEvent', 'KeyboardEvent', 'UIEvent' /*, etc... */])。

于 2018-02-09T11:57:08.223 回答