Я бы сказал, что линия подсчета прерывается как два символа при расчете границ выбора/позиции курсора - правильный подход. По сути, эти два символа \r\n
есть в тексте. Они присутствуют в свойстве textarea value
, и они находятся в значении, которое отправляется на сервер.
Единственные аргументы я могу увидеть для подсчета разрывов строк, как один символ являются:
- Согласованность с другими браузерами
TextRange
методы
- в IE рассмотреть разрывы строк как один символ
Я думаю, ни то, ни другое. Во-первых, IE уже не совместим с другими браузерами при подсчете разрывов строк как двух символов, а не одного. Во-вторых, IE's TextRange
основанные на символах методы в любом случае немного сумасшедшие, вызывая проблемы везде, где они используются.
Я думаю, что имеет смысл рассматривать позицию выбора/каретки как позицию относительно фактического текста в текстовом поле. Это позволяет легко манипулировать текстом.
Вот две основные функции. Первая из них - единственная функция получения позиции в области textarea/caret, которую я видел, которая работает правильно со всеми разрывами строк. Вы можете найти это здесь: How to get the start and end points of selection in text area?. Во-вторых, здесь комплементарной setSelection
функция:
function offsetToRangeCharacterMove(el, offset) {
return offset - (el.value.slice(0, offset).split("\r\n").length - 1);
}
function setSelection(el, startOffset, endOffset) {
var range = el.createTextRange();
var startCharMove = offsetToRangeCharacterMove(el, startOffset);
range.collapse(true);
if (startOffset == endOffset) {
range.move("character", startCharMove);
} else {
range.moveEnd("character", offsetToRangeCharacterMove(el, endOffset));
range.moveStart("character", startCharMove);
}
range.select();
}
возможно дубликат [Как получить позицию курсора в текстовое поле] (http://stackoverflow.com/questions/263743/how-to-get-cursor-position- in-textarea) – kennytm
Это не то, что мне нужно, оно подсчитывает дополнительный символ новой строки. – shivesh
Эта часть о разрыве строк кажется, как правило, не совсем понятна, поэтому я считаю это разумным вопросом. –