CodeMirror - проверьте, находится ли курсор в конце строки

Я устанавливаю строки только для чтения в своем редакторе следующим образом:

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

Где readOnlyLines — массив, содержащий номера строк, которые должны быть доступны только для чтения.

Проблема в том, что когда я нахожусь в редактируемой строке, а внизу есть строка только для чтения, если я нажимаю «Del», строка только для чтения переворачивается, и я могу ее редактировать.

То же самое не работает, если у меня есть строка только для чтения выше, и я нажимаю «BackSpace».

Я думаю, что я должен добавить, если это проверяет, если в то же время:

  1. Del нажат (я использовал событие catch)
  2. Строка ниже предназначена только для чтения (я сделал это так же, как и с if в коде выше)
  3. Курсор находится в конце строки (существует ли конкретная функция?)

person ale93p    schedule 12.07.2016    source источник


Ответы (1)


Курсор находится в конце строки (Существует ли конкретная функция?)

если (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>

person gaetanoM    schedule 12.07.2016