Элегантное решение Валерия Каткова прекрасно работает, но имеет две проблемы:
- Не работает для длинных строк
- Выбранное содержимое прокручивается до нижней частитекстовое поле, затрудняющее просмотр контекста, окружающего выделение
Вот моя улучшенная версия, которая работает для длинных строк (протестировано не менее чем с 50 000 слов) и прокрутки выделения до центра текстового поля:
function setSelectionRange(textarea, selectionStart, selectionEnd) {
// First scroll selection region to view
const fullText = textarea.value;
textarea.value = fullText.substring(0, selectionEnd);
// For some unknown reason, you must store the scollHeight to a variable
// before setting the textarea value. Otherwise it won't work for long strings
const scrollHeight = textarea.scrollHeight
textarea.value = fullText;
let scrollTop = scrollHeight;
const textareaHeight = textarea.clientHeight;
if (scrollTop > textareaHeight){
// scroll selection to center of textarea
scrollTop -= textareaHeight / 2;
} else{
scrollTop = 0;
}
textarea.scrollTop = scrollTop;
// Continue to set selection range
textarea.setSelectionRange(selectionStart, selectionEnd);
}
Работает в Chrome 72, Firefox 65, Opera 58 и Edge 42
Пример использования этой функции см. В моем проекте GitHub SmartTextarea .