2013-09-16 115 views
12

我正在使用Codemirror v3.16,我试图弄清楚如何杀死我的codemirror的实例?基本上,当textarea在我的页面上以模态打开时,会触发codemirror。关闭这个模式,我需要杀死实例,否则当我重新打开模式时,我会得到两个textareas。如何杀死一个CodeMirror实例?

任何人都可以帮忙吗?

回答

8

如果CodeMirror实例是使用CodeMirror.fromTextArea创建的,则可以使用其toTextArea方法将当前内容复制到其“镜像”文本区域并删除该实例。

假设你的CM实例具有“CMEditor”的ID:

CM = document.getElementById('CMEditor'); 
CM.CodeMirror.toTextArea(); 

或者,那么你可以用CM实例的模式之外,只是隐藏和模态打开时表现出来。

7

当从DOM中删除CodeMirror(并且杀死JavaScript可能持有的所有现有引用时),它将被垃圾收集。没有明确的'杀死'方法,你只需停止引用它。

+0

Chrome的内存分析器会喜欢不同意你。由闭包创建的DOM节点引用不会因为这些节点已从DOM中删除而奇迹般地消失。如果CodeMirror将其实例存储在全局CodeMirror对象中,则存在内存泄漏。 – user2867288

+1

它没有,所以我真的不知道你在说什么。 – Marijn

+0

我的情况是一个单页应用程序,您不断创建和销毁CodeMirror textareas。你是说这样做吗? https://jsfiddle.net/7zvnyagq/ – user2867288

4

版本5.3或更新05/2015

CM = document.getElementById('CMEditor'); 

CM.CodeMirror.toTextArea(); // is not working 

CM.toTextArea(); // is making the magic happen 
5

解答以上仅适用于文本区域的顶部CM工作,这是情况并非总是如此。这是更好的:

cm.setOption("mode", "text/x-csrc"); 
cm.getWrapperElement().parentNode.removeChild(cm.getWrapperElement()); 
cm=null; 
+0

这不提供问题的答案。要批评或要求作者澄清,请在其帖子下方留言。 - [来自评论](/ review/low-quality-posts/10681153) – GAMITG

+2

呵呵? OP询问'我如何杀死我的codemirror的实例',并且我已经显示了代码来做到这一点 – kofifus

1

我已经添加了上面的代码,当模式是封闭运行,但它说--- cmeditor.toTextArea不是一个函数

$("body").on("hidden.bs.modal", ".modal", function() 
{ 
    $(this).removeData("bs.modal"); 

    cmeditor = document.getElementById("email_template_text"); 
    cmeditor.toTextArea(); 
});