Как найти индекс выделенного текста в getSelection() с помощью javascript?

Я пытаюсь применить стиль к тексту, выбранному пользователем (перетаскивание мышью), для которого мне нужно получить начальный и конечный индекс выделенного текста.

Я попытался использовать метод "indexOf(...)". но он возвращает первое вхождение выбранной подстроки. Мне нужна фактическая позиция подстроки относительно исходной строки. Например..., если я выбираю букву «O» в позиции 3 [YOLО Cobe], я ожидаю, что индекс будет равен 3, но метод indexOf() возвращает 1, что является первым вхождением «O» в [YОLO Cobe].

Есть ли другой способ получить фактический начальный и конечный индекс выделенного текста, а не первое вхождение?

function getSelectionText()
{
    var text = "";
    if (window.getSelection) {
        text = window.getSelection().toString();
    }
    return text;
}
document.getElementById('ip').addEventListener('mouseup',function(e)
{
        var txt=this.innerText;
        console.info(txt);
        var selectedText = getSelectionText();
        console.info(selectedText);
        var start = txt.indexOf(selectedText);
        var end = start + selectedText.length;
        if (start >= 0 && end >= 0){
    	    console.info("start: " + start);
    	    console.info("end: " + end);
        }
});
<div id = "ip">YOLO Cobe</div>
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
10
0
5 210
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

То, что вы ищете, доступно внутри объекта, возвращаемого window.getSelection()

document.getElementById('ip').addEventListener('mouseup',function(e)
{
        var txt = this.innerText;
        var selection = window.getSelection();
        var start = selection.anchorOffset;
        var end = selection.focusOffset;
        if (start >= 0 && end >= 0){
    	    console.info("start: " + start);
    	    console.info("end: " + end);
        }
});
<div id = "ip">YOLO Cobe</div>

А вот пример более сложного выбора на странице на основе комментария @Kaiido:

document.addEventListener('mouseup',function(e)
{
        var txt = this.innerText;
        var selection = window.getSelection();
        var start = selection.anchorOffset;
        var end = selection.focusOffset;
        console.info('start at postion', start, 'in node', selection.anchorNode.wholeText)
        console.info('stop at position', end, 'in node', selection.focusNode.wholeText)
});
<div><span>Fragment1</span> fragment2 <span>fragment3</span></div>

baseOffset — это особенность Chrome. Официальная собственность anchorOffset. Кроме того, вы можете указать, что они упорядочены в порядке выбора (то есть, если вы выбрали справа налево, они могут иметь start: 7 end: 2, а также что эти индексы относятся к их собственным [anchor/focus]Node. Они могут быть не одним и тем же узлом.

Kaiido 13.06.2019 09:11

window.getSelection().anchorOffset даст вам индекс, который вы ищете.

Ссылка MDN: https://developer.mozilla.org/en-US/docs/Web/API/Selection/anchorOffset

Я попытался использовать anchorOffset и focusOffset из метода getSelection(), и он не дал мне желаемого индекса.

Поэтому я сам придумал это решение (Примечание: оно работало в хроме, не знаю о других браузерах)

HTML

<input type = "text" class = "input" hidden />
<textarea> remind me to be here to morrow </textarea>

JS

let text = document.querySelector("textarea");
let input = document.querySelector(".input");

В данном случае выделена фраза «здесь и завтра».

Для выделенного текста я сделал

input.value = getSelection();
let selectedText = input.value;

Для начального индекса выделенного текста я сделал

let start = body.value.indexOf(getSelection());
let end = start + selectedText.lenght;

Надеюсь, это окажется полезным

ваш код не будет работать для повторяющегося текста, и мы выбираем второе вхождение.

Vinoth Ezhilan M 18.10.2021 13:23

Другие вопросы по теме