Answers:
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;
})();
window.Event= CustomEvent
在最后一行做。
StorageEvent
,typeof(StorageEvent)
但在MS Edge中不起作用。这工作:try { new StorageEvent(); } catch (e) { /* polyfill */ }
。
我认为解决您的问题并处理跨浏览器事件创建的最佳解决方案是:
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;
}
return event
这样做,所以我可以将其传递给dispatchEvent()
。
CustomEvent
允许通过detail
选项传递自定义数据,Event
但不允许。我错了吗?
该软件包具有神奇的作用:
https://www.npmjs.com/package/custom-event-polyfill
包括软件包并按以下方式调度事件:
window.dispatchEvent(new window.CustomEvent('some-event'))
如果您只是尝试分发一个简单的事件(例如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);
es6
let
(而不使用var
)与应该在旧IE上运行的代码..这可能会使初学者复制并粘贴此内容感到困惑
IE 9
,并且可能是一个找到该线程的寻求答案的人正在为遗留银行系统或某些其他系统开发应用程序,这些系统无法控制他们的计算机,并且对企业客户有义务使用旧的IE。这与Microsoft支持无关
有一个polyfill服务可以为您修补此问题和其他问题
https://polyfill.io/v3/url-builder/
<script crossorigin="anonymous" src="https://polyfill.io/v3/polyfill.min.js"></script>
在custom-event
NPM包精美的工作对我来说
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);
我个人使用包装函数来处理手动创建的事件。下面的代码将在所有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)));
编辑:查找所有Event
接口的函数也可以用数组替换,以仅更改所需的事件接口(['Event', 'MouseEvent', 'KeyboardEvent', 'UIEvent' /*, etc... */]
)。