Проблема заключается в том, что вы перезаписываете значение текстовой области каждым ключом вверх, что заставляет каретку двигаться.
Вы хотите получить значение каретки до того, как вы замените текст и установите его снова после замены.
Stackoverflow Ответ: Получить позицию каретки - Код из связанного ответа ниже без изменений
function getCaret(el) {
if (el.selectionStart) {
return el.selectionStart;
} else if (document.selection) {
el.focus();
var r = document.selection.createRange();
if (r == null) {
return 0;
}
var re = el.createTextRange(),
rc = re.duplicate();
re.moveToBookmark(r.getBookmark());
rc.setEndPoint('EndToStart', re);
return rc.text.length;
}
return 0;
}
Stackoverflow Ответ: Установить позицию каретки - Код из связанного ответа ниже без изменений
function SetCursorPosition(pos)
{
// HERE txt is the text field name
var obj=document.getElementById('<%= txt.ClientID %><%= txt.ClientID %>');
//FOR IE
if(obj.setSelectionRange)
{
obj.focus();
obj.setSelectionRange(pos,pos);
}
// For Firefox
else if (obj.createTextRange)
{
var range = obj.createTextRange();
range.collapse(true);
range.moveEnd('character', pos);
range.moveStart('character', pos);
range.select();
}
}
Есть несколько других способов обойти это, избегая замены всего текста в событии key up и перемещая его в нажатие кнопки, размытие / расфокусировка или что-то еще. Это позволяет вам не беспокоиться о том, что положение каретки сбрасывается до конца.
Единственный реальный недостаток, который я вижу при переходе к другому событию, чтобы вызвать изменение текста, это просто то, что это не мгновенно.