当我使用 CodeMirror 在 TextArea 中编辑代码时,如何使用 js 或 jQuery 将其反映到另一个 textarea 中

Posted

技术标签:

【中文标题】当我使用 CodeMirror 在 TextArea 中编辑代码时,如何使用 js 或 jQuery 将其反映到另一个 textarea 中【英文标题】:When I edit the code in a TextArea using CodeMirror how to reflect this into another textarea with js or jQuery 【发布时间】:2011-10-12 03:56:22 【问题描述】:

应用程序:我的页面中有一个 textarea 元素。它是使用 CodeMirror 转换的,因为我需要使用它缩进和突出显示 html 代码。图片在链接中: [使用codemirror的textarea]

http://uploadingit.com/file/gxftd2cps9wm7zhp/cm.png

下面是使用 codemirror 的 textarea 代码:

</textarea>
    <button type="submit">Post</button>       
</form>
 <script>

   var editor = CodeMirror.fromTextArea(document.getElementById("code"), 
     mode:  name: "xml", htmlMode: true ,
     lineNumbers: true,
     tabMode: "indent",
     matchBrackets: true,
     path: 'js/', 
     searchMode: 'inline',
     onCursorActivity: function () 
       editor.setLineClass(hlLine, null);
       hlLine = editor.setLineClass(editor.getCursor().line, "activeline");
     
   );

   var hlLine = editor.setLineClass(0, "activeline");
  </script>

怎么做?: 当我点击发布按钮时,所有的代码都应该被传输到另一个文本区域。我需要用 javascript 或 jQuery 来做这件事,但很难做到这一点。有什么帮助吗?

对于真实世界的应用程序,此文本区域中的代码(来自上图)应该会影响 Html Designer API。即 Html 设计器中的任何更改都应反映在此文本区域中(使用 codemirror 以提高可读性),反之亦然。当我在 textarea 中编辑时,更改应该会反映在 HtmlDesigner 中,但在这个模拟案例中 -> 在第二个 textarea 中。

示例: 像 Visual Studio .Net 网页代码编辑器,它具有 Designer + Source 模式。现在清楚了吗?

我在问如何使用 javascript 或 jquery 实现上述机制。非常感谢!

【问题讨论】:

【参考方案1】:

这适用于 CodeMirror 5.22.0:

CodeMirror.fromTextArea(document.getElementById('grammar'), 
    lineNumbers: true,
    mode: 'pegjs',
).on('change', editor => 
    console.log(editor.getValue());
);

【讨论】:

【参考方案2】:

您可以使用它...

var editor_js = CodeMirror.fromTextArea(document.getElementById("js"), 
   mode: 'text/javascript',
   theme: 'icecoder',
   styleActiveLine: true,
   lineNumbers: true,
   lineWrapping: true,
);

并获取数据 editor_js.getValue()

【讨论】:

【参考方案3】:

将 onChange 选项传递给 CodeMirror,如下所示:

onChange: function (cm) 
   mySecondTextArea.value = cm.getValue();

编辑注意:从 CodeMirror 2.0 版开始,您不再传递onChange 选项来注册更改处理程序,而是调用instance.on("change", function(cm, change) ... )。 http://codemirror.net/doc/manual.html#event_change

【讨论】:

哇!很高兴收到作者的来信 :) 但还是有误会: 1. 我需要再写一个这个新函数(cm)? 2. mySecondTextArea 可以是一个简单的文本区域,也可以是另一个使用 cm 来工作的区域。 场景:我在一个简单的文本区域中插入代码。当我按下发布按钮时,代码应该转到使用代码镜像的文本区域,以便可以很好地编辑它。再次编辑后,当按下另一个 Save Changes 按钮时,代码应该在第一个文本区域中显示为已更改(就像在 IDE 游乐场中一样:))。 抱歉新手问题。但是js中这个机制的功能和代码是什么?我确实为 js 浏览网页和书籍,但这次需要它更快。 :) 谢谢。 codemirror.net/manual.html - onChange(function) 给定时,每次编辑器内容改变时都会调用这个函数。它将被赋予编辑器实例作为唯一参数。 自此评论以来 API 是否发生了变化?使用 onChange : function(cm) alert("foo"); 似乎对我不起作用【参考方案4】:

目前最新发布的版本 (v 3.15) 适用于此解决方案:

// on and off handler like in jQuery
CodemirrorInstance.on('change',function(cMirror)
  // get value right from instance
  yourTextarea.value = cMirror.getValue();
);

【讨论】:

【参考方案5】:

代码镜像中的onChange处理不是这样的:

onChange: function(cm)  mySecondTextArea.value = cm.getValue(); 

你必须使用:

$.fn.buildCodeMirror = function()
    var cmOption ...;
    var cm = CodeMirror($("MyDomObjectSelector")[0],cmOption);
    cm.on("change",$.fn.cmChange);


$.fn.cmChange = function(cm,cmChangeObject)
    alert("code mirror content has changed");

【讨论】:

【参考方案6】:

所以您想将文本从一个 TextArea(顺便提一下,呈现为 input 控件)复制到另一个?

//Set the button to call a Javascript function when it is clicked
<button type="submit" onclick="copyText();">Post</button>

<script type="text/javascript">
    function copyText() 
        //Get the text in the first input
        var text = document.getElementById("firstTextArea").getValue(); 
        //Can't use .value here as it returns the starting value of the editor

        //Set the text in the second input to what we copied from the first
        document.getElementById("secondTextArea").value = text;
    
</script>

【讨论】:

只有当我将代码放在 Visual Studio 的 textarea 中时,代码才会出现在第二个 textarea 中。但在现实世界中,该站点的用户将在第一个 textarea 上插入一些代码,这些代码应该出现在第二个 txtarea 中,以便在按下 Post 按钮时对其进行编辑。它应该去第一个。那么如何检测用户插入了什么以及如何使用 JS 来控制呢? :) 谢谢。 嗯,这很有趣...您是否在仍选择文本区域时单击按钮?如果是这样,请在单击按钮之前尝试单击文本区域(使其模糊)。如果它仍然无法正常工作,那么我会假设它是 CodeMirror 功能,它返回旧值而不是新值 - 按照 Marijn 的建议尝试 getValue() 可能是个好主意。 啊,是的,使用 getValue() - codemirror.net/manual.html - .value 是编辑器的起始值。我将编辑我的答案以反映这一点。 非常感谢!我正在和你们这些极客一起学习。 它就是这样工作的 :) 记住,一旦你选择了正确的答案,就接受答案 ;) 祝你的代码好运!

以上是关于当我使用 CodeMirror 在 TextArea 中编辑代码时,如何使用 js 或 jQuery 将其反映到另一个 textarea 中的主要内容,如果未能解决你的问题,请参考以下文章

当我使用 CodeMirror 在 TextArea 中编辑代码时,如何使用 js 或 jQuery 将其反映到另一个 textarea 中

CodeMirror使用

我怎样才能摆脱 CodeMirror div ?为啥我有它?

vue使用textare如何正确统计输入字符个数

在vue里使用codemirror的两种用法

如何在 Meteor 的 Summernote 中包含 CodeMirror?