2016-07-12 5 views
1

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

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

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

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

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

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

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

ответ

1

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

, если (cm.doc.getLine (change.from.line) .length == change.from.ch) {

Если массив readOnlyLines является диапазон contigous линий вы можете сделать что-то вроде:

$(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>

+0

это не работает, в вашем примере, если нажать «Del» от конца строки 0 удаляет " newline ", и затем я могу отредактировать строку 1. – ale93p

+0

@ ale93p Не могли бы вы попробовать сейчас? – gaetanoM

+0

Спасибо! Теперь это работает. – ale93p

Смежные вопросы