用于 attachEvent 的 Polyfill 删除 dhtmlx attachEvent 函数

Posted

技术标签:

【中文标题】用于 attachEvent 的 Polyfill 删除 dhtmlx attachEvent 函数【英文标题】:Polyfill for attachEvent removing dhtmlx attachEvent function 【发布时间】:2020-01-23 03:10:34 【问题描述】:

我正在为我们的旧产品添加 chrome 支持(ie8 支持), 问题是我为 attachEvent 添加了 polyfill

if (!isIE() && Object.attachEvent == null) 
    Object.defineProperty(Object.prototype, 'attachEvent', 
        value: function(event, func) 
            if ('string' !== typeof event || event.indexOf('on') !== 0) 
                return;
            
                this.addEventListener(event.substring(2), func, false);
        ,
        enumerable: false
    );

但我们使用的是 dhtmlx 3rd 方库,它使用 attachEvent 函数管理事件, 所以我的 polyfill 覆盖了这个函数,是什么让 dhtmlx 失去了功能。

任何想法我该如何解决这个问题? 我想填充 attachEvent 但不覆盖 dhtmlx 的 attachEvent 谢谢!

【问题讨论】:

为什么dhtmlx自称是javascript/HTML5 UI Component Libraries,却用attachEvent函数管理事件 他们通过函数名称“attachEven”管理事件的问题,它唯一的函数名称,用于管理事件的包装函数,但实际上并未弃用“attachEvent” 那么问题是什么?如果“他们”有一个名为attachEvent 的函数,那么它不会跨浏览器工作吗,因为“他们”声称是一个现代 UI 组件库?为什么你只在非 IE 浏览器中尝试填充 attachEvent 方法? 【参考方案1】:

无需检查IsIE() ...因为无论如何只有IE使用非标准attachEvent

对于其他浏览器,您可以填充 EventTarget.prototype.attachEvent - 因为这是定义 addEventListener 的地方

if (EventTarget.prototype.attachEvent == null) 
    Object.defineProperty(EventTarget.prototype, 'attachEvent', 
        value: function(event, func) 
            if ('string' !== typeof event || event.indexOf('on') !== 0) 
                return;
            
            this.addEventListener(event.substring(2), func, false);
        ,
        enumerable: false
    );

【讨论】:

嗨,但我仍然覆盖 dhtmlx 的 attachEvent。 @IgorKorchagin - 你确定吗?所以dhtmlx添加attachEvent函数?他们在哪里添加它?哪个原型?

以上是关于用于 attachEvent 的 Polyfill 删除 dhtmlx attachEvent 函数的主要内容,如果未能解决你的问题,请参考以下文章

用于IE7的hashchange polyfill,可以跟踪每个tick的多个事件

重大变化:webpack < 5 用于默认包含 node.js 核心模块的 polyfill

用于 node.js crypto-js 的 webpack 5 角度 polyfill

用于样式化组件和 Gatsby / Safari 支持的 Gap Polyfill

attachEvent方法的作用

attachEvent方法的作用