Code Mirror 每次内容改变时获取当前行号

Sid*_*Sid 4 html javascript css codemirror

我正在尝试使用 Code Mirror 创建一个文本编辑器。我想在显示屏底部向用户显示当前行号,就像文本编辑器一样。

到目前为止,我已经尝试过这个:

function updateInfo(){
var lines = editor.lineCount();
document.getElementById('line-no.').innerText = lines;
editor.refresh();
}
editor.on("change", updateInfo());
Run Code Online (Sandbox Code Playgroud)

line-no.span我想显示行号的地方。这适用于第一个行号,但是当我转到其他行时,它什么也不做。控制台显示此错误:

codemirror.js:2154 Uncaught TypeError: Cannot read property 'apply' of undefined
at codemirror.js:2154
at fireCallbacksForOps (codemirror.js:2111)
at finishOperation (codemirror.js:2125)
at endOperation (codemirror.js:3747)
at HTMLTextAreaElement.<anonymous> (codemirror.js:3884)
Run Code Online (Sandbox Code Playgroud)

Olu*_*ule 7

更新

要跟踪编辑器中的更新,请在cursorActivity事件上注册一个处理程序。当光标或选择发生变化时会触发此事件。
使用 CodeMirror 的实例调用处理程序;在此您可以调用该getCursor方法作为一个对象,该对象包含光标处于活动状态的当前行号。
请注意,行号是从零开始的,因此您可能会也可能不会将其增加 1。

const STATUS_CURRENT_LINE = document.getElementById('line-no.');

const onCursorActivity = (instance) => {
  const cursor = cm.getCursor();
  STATUS_CURRENT_LINE.textContent = cursor.line + 1;
}

editor.on("cursorActivity", onCursorActivity);
Run Code Online (Sandbox Code Playgroud)

当编辑器中有文档更改时设置当前行号

发生错误updateInfo是因为回调在您注册之前就被调用了。这样注册为回调的值为undefined.

editor.on('change', updateInfo()) // -> editor.on('change', undefined)
Run Code Online (Sandbox Code Playgroud)

这可以通过注册函数来解决。

editor.on('change', updateInfo)
Run Code Online (Sandbox Code Playgroud)

但是,回调的签名应遵循所记录的内容。

change回调是通过instanceCodeMirror和一个changeObject从中可以获取当前行。

"change" (instance: CodeMirror, changeObj: object)
每次编辑器的内容改变时触发。的changeObj是一个{from, too, text, removed, origin}有关所发生的第二个参数的变化包含对象的信息。fromto是更改开始和结束的位置(在更改前坐标系中)(例如,{ch:0, line:18}如果位置在第 19 行的开头,则可能是)。text是一个字符串数组,表示替换更改范围的文本(按行拆分)。removed是曾经在from和之间的文本to,它被此更改覆盖。此事件在 DOM 更新发生之前的操作结束之前触发。

const STATUS_CURRENT_LINE = document.getElementById('line-no.');

function updateInfo(instance, changeObj){
   STATUS_CURRENT_LINE.innerText = changeObj.to.line;
}

editor.on("change", updateInfo);
Run Code Online (Sandbox Code Playgroud)