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();
}