Internet explorer event.preventDefault()在自定义事件的IE 11中不起作用

Internet explorer event.preventDefault()在自定义事件的IE 11中不起作用,internet-explorer,polymer,custom-event,Internet Explorer,Polymer,Custom Event,我有一个聚合元素可以同步触发自定义事件,我想知道是否使用event.preventDefault()取消了该事件。使用event.defaultPrevented,我可以知道预期的操作。这适用于所有浏览器(Chrome、Canary、Firefox、Opera),但在IE11(不担心较旧的浏览器)上不起作用。 我知道我可以在我的事件上设置一些属性,并在我触发和处理的地方检查这些属性,但我想知道是否还有我遗漏的其他内容 您可以从中尝试代码 看起来IE 11没有为代码创建的“合成”事件设置defau

我有一个聚合元素可以同步触发自定义事件,我想知道是否使用event.preventDefault()取消了该事件。使用event.defaultPrevented,我可以知道预期的操作。这适用于所有浏览器(Chrome、Canary、Firefox、Opera),但在IE11(不担心较旧的浏览器)上不起作用。 我知道我可以在我的事件上设置一些属性,并在我触发和处理的地方检查这些属性,但我想知道是否还有我遗漏的其他内容

您可以从中尝试代码

看起来IE 11没有为代码创建的“合成”事件设置
defaultPrevented

示例JSbin:

无论我在事件创建和调度方面做了什么尝试,我都无法使合成单击事件的
preventDefault
设置
defaultPrevented
为true


也许Polymer可以修改
CustomElement.prototype.preventDefault
来设置
defaultPrevented

,我也遇到了同样的问题,可以通过以下方法解决:

var event = document.createEvent('CustomEvent');
event.initCustomEvent('custom', true, true, {});
event.preventDefault = function () {
    Object.defineProperty(this, "defaultPrevented", {get: function () {return true;}});
};
event.preventDefault();
event.defaultPrevented; // true

即使Polymer覆盖CustomElement.prototype.preventDefault,我们也无法直接设置defaultPrevented,因为它是只读属性。我目前所做的是做一个猴子补丁,比如:preventDefault=window.CustomEvent.prototype.preventDefault;window.CustomEvent.prototype.preventDefault=function(){preventDefault.apply(this,arguments);this.isDefaultPrevented=true;};它可能是可配置的。您可以使用
Object.defineProperty(customEvent,'defualtPrevented',{value:true})来monkeypatch
在定义属性之前,不要忘记调用原始的preventDefault()-否则将设置属性,但实际上不会阻止事件:var origPreventDefault=event.preventDefault();event.preventDefault=函数(){origPreventDefault()。。。