Я думаю, что вы в основном там, но проблема, которую вы получаете, когда все слева от каретки выделено, вероятно, связана с тем фактом, что вы не звоните preCaretRange.setStart()
, и поэтому он думает, что старт долженбыть ноль.Я немного изменил вашу функцию, чтобы заставить ее выбирать фактическое слово, в котором находится ваш курсор:
function selectUptoCaret(el){
var range = window.getSelection().getRangeAt(0);
var preCaretRange = range.cloneRange();
var startOffset = range.startContainer.textContent.lastIndexOf(' ', range.startOffset);
var endOffset = range.endContainer.textContent.indexOf(' ', range.endOffset);
preCaretRange.selectNodeContents(el);
preCaretRange.setStart(range.startContainer, ~startOffset ? startOffset + 1: 0);
preCaretRange.setEnd(range.endContainer, ~endOffset ? endOffset : range.endContainer.textContent.length);
var sel = window.getSelection()
sel.removeAllRanges()
sel.addRange(preCaretRange)
}
Я предполагаю, что параметр el
, переданный в selectUptoCaret
, является фактическим контентом.element.
Мои изменения были:
- занять позицию курсора и получить позицию следующего и предыдущего пробелов
- , если предыдущий пробел отсутствует (определяетсяпроверку
~startOffset
) мы начнем с 0, потому что мы находимся в первом слове - , если нет следующего пробела (определяется проверкой
~endOffset
), мы будем использовать всю длину текстового содержимого, потому чтомы в последнем слове. - установите
setStart
на нашем preCaretRange
объекте, чтобы убедиться, что у нас есть конечная начальная точка, которая не обязательно является началом текстового содержимого
Примечание: моя троичная ~startOffset ? startOffset + 1 : 0
эквивалентна поговорке startOffset > -1 ? startOffset + 1 : 0
.Использование побитового оператора ~
- это удобный способ проверить, что значение не равно -1
(начиная с ~ -1 === 0
).
Теперь оно будет выбирать только текущее слово в позиции вашей каретки.