CodeMirror - 检查光标是否在行尾

时间:2016-07-12 16:37:27

标签: javascript jquery readonly codemirror end-of-line

我在编辑器中设置只读行:

editor.on('beforeChange', function(cm, change) {
    if (~readOnlyLines.indexOf(change.from.line)) {
        change.cancel();
    }
}

其中readOnlyLines是一个包含要读取的行数的数组。

问题在于,当我在一个可编辑的行上,下面只读取一个,如果我按“Del”,那么只读行就会上升,我可以编辑它。

如果我上面有一个只读行并按“BackSpace”,则同样不起作用。

我想我应该添加一个if if同时检查:

  1. Del被按下(我使用了捕获事件)
  2. 下面的行是readonly(我的方式与上面代码中的if相同)
  3. 光标位于行尾(是否存在特定功能?)

1 个答案:

答案 0 :(得分:1)

  

光标位于行尾(是否存在特定功能?)

     

if(cm.doc.getLine(change.from.line)。length == change.from.ch){

如果readOnlyLines数组是一系列连续的行,您可以执行以下操作:



$(function () {
  var editor = CodeMirror.fromTextArea(document.getElementById('txtArea'), {
    lineNumbers: true
  });

  var readOnlyLines = [1,2,3];

  editor.on('beforeChange', function(cm, change) {
    if (~readOnlyLines.indexOf(change.from.line)) {
      change.cancel();
    } else {
      // if you are deleting on the row before the next readonly one
      if ((change.origin == '+delete') && ~readOnlyLines.indexOf(1+change.from.line)) {
        // when you press DEL at the end of current line
        if (cm.doc.getLine(change.from.line).length == change.from.ch) {
          change.cancel();
        }
        // if you are deleting the whole line
        if (cm.doc.getSelection() == cm.doc.getLine(change.from.line)) {
          change.cancel();
        }
        // if the line is empty
        if (cm.doc.getLine(change.from.line).trim().length == 0) {
          change.cancel();
        }
      }
    }
  });
});

<script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.16.0/codemirror.css" rel="stylesheet">
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.16.0/codemirror.js"></script>



<textarea id="txtArea">
1111
2222 READ ONLY
3333 READ ONLY
4444 READ ONLY
5555
6666
7777
</textarea>
&#13;
&#13;
&#13;