UEditor(版本号1.4.3) 在vue中使用导致内存泄漏问题优化

1.UE.instants 全局的UE对象,在编辑器创建的时候会在UE.instants对象里面新增内容,但是在组件销毁是并没有删除创建时新增的内容,会导致内存泄漏问题

2.UE.$EDITORUI全局的$EDITORUI对象,在编辑器创建的时候会在UE.$EDITORUI对象里面新增内容,但是在组件销毁是并没有删除创建时新增的内容,会导致内存泄漏问题

3.UE.$EDITORUI全局的$EDITORUI对象,在编辑器创建的时候会在UE.$EDITORUI对象里面新增内容,但是在组件销毁是并没有删除创建时新增的内容,会导致内存泄漏问题

4.在编辑器创建的时候会在allPopups对象里面新增内容,但是在组件销毁是并没有删除创建时新增的内容,会导致内存泄漏问题

5.销毁时调用时间销毁方法错误,导致时间没有正确销毁

解决办法:

1)修改 Editor.prototype 的 destroy方法

destroy: function () {
            var me = this, uid = me.uid, mekey = me.key, eid = me.container.id;
            me.ui.fireEvent('destroy');
            var container = me.container.parentNode;
            var textarea = me.textarea;
            if (!textarea) {
                textarea = document.createElement('textarea');
                container.parentNode.insertBefore(textarea, container);
            } else {
                textarea.style.display = ''
            }

            textarea.style.width = me.iframe.offsetWidth + 'px';
            textarea.style.height = me.iframe.offsetHeight + 'px';
            textarea.value = me.getContent();
            textarea.id = me.key;
            container.innerHTML = '';
            domUtils.remove(container);
            var key = me.key;
            //trace:2004
            for (var p in me) {
                if (me.hasOwnProperty(p)) {
                    delete this[p];
                }
            }
            UE.delEditor(key);
            try{
                let n = eid.replace('edui', '') * 1
                let j = document.querySelector("."+mekey).id.replace('edui', '') * 1
                for(let i = n;i<=j;i++) {
                    delete window.$EDITORUI['edui' + i]
                    baidu.editor.ui.Popup.prototype.destroyPopups('edui' + i)
                }
            }catch(e){
                //TODO handle the exception
            }
            try{
                //清除UE.instants
                delete UE.instants['ueditorInstant'+uid]
                //清除多余的iframe
                document.querySelector("."+mekey).remove()
            }catch(e){
                //TODO handle the exception
            }
}

2)Popup.prototype中新增destroyPopups方法

destroyPopups: function (eduid){
            allPopups = allPopups.filter((val) => {
                return val.id != eduid
            })
}

3)修改UIBase.prototype的render方法

render:function (holder) {
            var html = this.renderHtml();
            var el = uiUtils.createElementByHtml(html);
            //by xuheng 给每个node添加class
            var list = domUtils.getElementsByTagName(el, "*");
            var theme = "edui-" + (this.theme || this.editor.options.theme);
            var layer = document.getElementById('edui_fixedlayer');
            for (var i = 0, node; node = list[i++];) {
                domUtils.addClass(node, theme);
            }
            domUtils.addClass(el, theme);
            if(layer){
                layer.className="";
                domUtils.addClass(layer,theme);
            }

            var seatEl = this.getDom();
            if (seatEl != null) {
                seatEl.parentNode.replaceChild(el, seatEl);
                uiUtils.copyAttributes(el, seatEl);
            } else {
                if (typeof holder == 'string') {
                    holder = document.getElementById(holder);
                } else { // 新增代码
                    if (el.className.indexOf('edui-popup') > -1) {
                        domUtils.addClass(el, this.editor.key);
                    }
                }
                holder = holder || uiUtils.getFixedLayer();
                domUtils.addClass(holder, theme);
                holder.appendChild(el);
            }
            this.postRender();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值