Установить положение текстового курсора в текстовом поле
Я работаю над редактором BBCode, и вот код:
var txtarea = document.getElementById("editor_area");
function boldText() {
var start = txtarea.selectionStart;
var end = txtarea.selectionEnd;
var sel = txtarea.value.substring(start, end);
var finText = txtarea.value.substring(0, start) + '[b]' + sel + '[/b]' + txtarea.value.substring(end);
txtarea.value = finText;
txtarea.focus();
}
Все в порядке, кроме одной вещи, которая является позицией текстового курсора. Когда я нажимаю кнопку boldText, она устанавливает позицию курсора в конце Textarea!!
На самом деле, я хочу иметь возможность установить позицию курсора с определенным индексом. Я хочу что-то вроде этого:
txtarea.setFocusAt(20);
Ответы
Ответ 1
После переориентации текстового поля с помощью txtarea.focus()
добавьте эту строку:
txtarea.selectionEnd= end + 7;
Это установит курсор на семь позиций раньше, чем раньше, что будет учитывать [b][/b]
.
Пример
document.getElementById('bold').addEventListener('click', boldText);
function boldText() {
var txtarea = document.getElementById("editor_area");
var start = txtarea.selectionStart;
var end = txtarea.selectionEnd;
var sel = txtarea.value.substring(start, end);
var finText = txtarea.value.substring(0, start) + '[b]' + sel + '[/b]' + txtarea.value.substring(end);
txtarea.value = finText;
txtarea.focus();
txtarea.selectionEnd= end + 7;
}
#editor_area {
width: 100%;
height: 10em;
}
<button id="bold">B</button>
<textarea id="editor_area"></textarea>
Ответ 2
если вы используете jquery, вы можете сделать это так.
$('textarea').prop('selectionEnd', 13);
Ответ 3
Понимание того, что это старый вопрос, теперь предлагается только как вариант для размышления, поскольку он может быть более эффективным, чем извлечение и сборка фрагментов строки значения textarea, и он автоматически устанавливает курсор на основе четвертого аргумента setRangeText
и автофокусировка также. Он работает в Firefox 66.0.02, и я не проверял его где-либо еще. Курсор ставится после "[/b]".
t = document.getElementById("editor_area");
b = t.selectionStart,
e = t.selectionEnd + 3; // length of '[b]'
t.setSelectionRange( b, b );
t.setRangeText( '[b]' );
t.setSelectionRange( e, e );
t.setRangeText( '[/b]', e, e, 'end' );
Ответ 4
Вы можете использовать эти 2 функции, написанные ниже Джейми Мунро (setSelectionRange()
и setCaretToPos()
):
function setSelectionRange(input, selectionStart, selectionEnd) {
if (input.setSelectionRange) {
input.focus();
input.setSelectionRange(selectionStart, selectionEnd);
}
else if (input.createTextRange) {
var range = input.createTextRange();
range.collapse(true);
range.moveEnd('character', selectionEnd);
range.moveStart('character', selectionStart);
range.select();
}
}
function setCaretToPos (input, pos) {
setSelectionRange(input, pos, pos);
}
ПРИМЕР:
например, если вы хотите установить каретку в конце вашей текстовой области, вы можете получить следующее: setCaretToPos(document.getElementById('textarea'), -1);