2013-09-16 156 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(); 
});