获取CodeMirror实例

问题描述 投票:23回答:6

我想获得CodeMirror的一个实例(它绑定到textarea'#code')。从onclick-event我想要为CodeMirror实例的当前值添加一个值。怎么能实现这一目标?从文档中我似乎找不到任何东西来获取实例并将其绑定到javascript中的loca var。

javascript codemirror
6个回答
48
投票

我发现elsewhere的另一种方法如下:

//Get a reference to the CodeMirror editor
var editor = document.querySelector('.CodeMirror').CodeMirror;

当您动态创建CodeMirror实例或用CodeMirror实例替换现有DOM元素时,这很有效。


12
投票

有人刚发布了一个答案,但删除了它。然而,这是一个有效的解决方案。谢谢!

- 基本上这是他的解决方案:

// create an instance
var editor = CodeMirror.fromTextArea('code');
// store it
$('#code').data('CodeMirrorInstance', editor);
// get it
var myInstance = $('code').data('CodeMirrorInstance');
// from here on the API functions are available to 'myInstance' again.

6
投票

代码镜像编辑器对象上有一个getWrapperElement,它为您提供代码镜像实例的根DOM元素:

var codemirrorDomElem = editor.getWrapperElement();

1
投票

您可以找到以<textarea>开头并移动到下一个兄弟的实例。

Native

  • 实用 document.querySelector('#code').nextSibling,
  • 选择 document.querySelector('#code + .CodeMirror'),

jQuery

  • 实用 $('#code').next('.CodeMirror').get(0),
  • 选择 $('#code + .CodeMirror').get(0)

额外:更高级的解决方案涉及clipboard.js - > JSFiddle Demo


Example

// Selector for textarea
var selector = '#code';

$(function() {
  var editor = CodeMirror.fromTextArea($(selector).get(0), {
    mode: 'javascript',
    theme: 'paraiso-dark',
    lineNumbers : true
  });
  editor.setSize(320, 240);
  editor.getDoc().setValue(JSON.stringify(getSampleData(), null, 4));
  
  $('#response').text(allEqual([
    document.querySelector(selector).nextSibling,        // Native - Functional
    document.querySelector(selector + ' + .CodeMirror'), // Native - Selector
    $(selector).next('.CodeMirror').get(0),              // jQuery - Functional
    $(selector + ' + .CodeMirror').get(0)                // jQuery - Selector
  ]));
});

function allEqual(arr) {
  return arr.every(function(current, index, all) {
    return current === all[(index + 1) % all.length];
  });
};

// Return sample JSON data.
function getSampleData() {
	return [
        { color: "red",     value: "#f00" },
        { color: "green",   value: "#0f0" },
        { color: "blue",    value: "#00f" }
    ];
}
#response { font-weight: bold; }
<link href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.7.0/codemirror.min.css" rel="stylesheet"/>
<link href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.7.0/theme/paraiso-dark.min.css" rel="stylesheet"/>

<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.7.0/codemirror.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<div>All equal?: <span id="response"></span></div>
<textarea rows="10" cols="60" id="code"></textarea>

0
投票

我正在使用Vue CLI 3vue-codemirror组件,如下所示:

<codemirror id="textarea_editor" v-model="textarea_input" :options="cm_editor_config"></codemirror>

导入codemirror以在页面中使用:

import { codemirror } from 'vue-codemirror'
import 'codemirror/lib/codemirror.css'

并简单地在codemirror对象中添加components,然后在data部分中的配置是:

codemirror_editor: undefined,
cm_editor_config: {
    tabSize: 4,
    mode: 'application/json',
    theme: 'base16-dark',
    lineNumbers: true,
    // lineWrapping: true,
    styleActiveSelected: true,
    line: true,
}

并在mountedVue生命周期部分初始化了该对象:

mounted () {
    if ( !this.codemirror_editor ) {
        this.codemirror_editor = $('#textarea_editor').find('.CodeMirror').get(0).CodeMirror;
    }
    // do something with this.codemirror_editor
}

希望这会对很多人有所帮助。


-2
投票

您可以简单地删除var:而不是

var editor = CodeMirror.fromTextArea...

只是有

editor = CodeMirror.fromTextArea...

然后编辑器可以直接用于其他功能

© www.soinside.com 2019 - 2024. All rights reserved.