Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
67 / 64 / 17
Регистрация: 29.02.2016
Сообщений: 313

Range из символа в определённой позиции текстового представления div

03.02.2026, 20:37. Показов 504. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
HTML5
1
2
3
<div>
<span>йо</span><span>кл</span><span>м</span><span>н</span>
</div>
Как правильно получить Range из например 4 символа относительно текста внутри элемента div? Обходить все span, считать суммарную длину и если она попадает в нужный индекс то именно этот span передавать в методы range.setStart, range.setEnd или есть способ изящнее?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.02.2026, 20:37
Ответы с готовыми решениями:

Класс div внутри div
Здравствуйте. Нужна помощь. Есть div, внутри него N-ное число div'ов, нужно пробежаться по всем...

Вписать код html страницы в <div></div>
Доброго времени суток :) Т.к. я профан в JS, а скорей новичок :) У меня на сайте есть папка там...

Если совпадает текст введённый в input и div, то скрыть данный div
Изучаю jquery и решил сделать следующее: Я ввожу в input какой то текст и если он совпадает с...

6
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3844 / 1699 / 431
Регистрация: 14.03.2022
Сообщений: 4,343
04.02.2026, 10:00
Цитата Сообщение от stele Посмотреть сообщение
или есть способ изящнее?
Способ он единственный.
Найти коренной элемент... Создать на нем ренж. Определить начальную точку и конечную... Записать их в ренж.
Все это описано в учебнике.
https://learn.javascript.ru/ra... -selection

Добавлено через 5 минут
Цитата Сообщение от stele Посмотреть сообщение
получить Range из например 4 символа
Должны быть какие-то критерии по определению "начала выделения"...

В твоем случае нет никаких вложений у spanнов... Но структура может оказаться еще более вложенной.
Тогда придется искать тот "четвертый символ" еще сложнее.

Добавлено через 50 минут
Цитата Сообщение от krvsa Посмотреть сообщение
https://learn.javascript.ru/ra... -selection
Извините... На старье сослался.
Вот рабочее.
https://learn.javascript.ru/selection-range
1
67 / 64 / 17
Регистрация: 29.02.2016
Сообщений: 313
04.02.2026, 10:15  [ТС]
Цитата Сообщение от krvsa Посмотреть сообщение
Но структура может оказаться еще более вложенной.
Тогда придется искать тот "четвертый символ" еще сложнее.
Вот и вопрос как оптимальнее найти контейнер для символа который надо выбрать. Ну если только последовательный перебор потомков, то будем перебирать потомки.
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3844 / 1699 / 431
Регистрация: 14.03.2022
Сообщений: 4,343
04.02.2026, 12:21
Лучший ответ Сообщение было отмечено stele как решение

Решение

Цитата Сообщение от stele Посмотреть сообщение
Ну если только последовательный перебор потомков, то будем перебирать потомки.
Если искать "драный текст" - скорее всего придется перебирать текстовые ноды...

PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
<div>
    <span>йо</span><span>кл</span><span>м</span><span>н</span>
</div>
 
<script>
const root = document.querySelector('div')
const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT)
while (walker.nextNode()) {
    console.log(walker.currentNode)
}
</script>
Поскольку начало может быть в одной ноде... А окончание будет уже в другой.
1
67 / 64 / 17
Регистрация: 29.02.2016
Сообщений: 313
04.02.2026, 13:58  [ТС]
Цитата Сообщение от krvsa Посмотреть сообщение
document.createTreeWalker(root, NodeFilter.SHOW_TEXT)
Вот это хорошо, вот это сразу куски текста выдаёт, чем querySelectorAll.
Цитата Сообщение от krvsa Посмотреть сообщение
А окончание будет уже в другой.
Будет. А манипуляция с range типа surroundContents тутже приводит к изменению дерева и зацикливанию цикла (и вместо следующего куска текста бравзер предложил прибить эту тормозящую страницу ). Ладно соберём массив из Range.
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
const alltext = document.createTreeWalker(span, NodeFilter.SHOW_TEXT)
let nextstart = 0;
let nextend = 0;
const ranges = new Array();
while (alltext.nextNode()) {
    const innode = alltext.currentNode;
    nextend = nextstart + innode.length;
    if (nextend >= selstart && nextstart < selend) {
        const instart = nextstart > selstart ? 0 : selstart - nextstart;
        const inend = nextend > selend ? selend - nextstart : innode.length;
        const range = document.createRange();
        range.setStart(innode, instart);
        range.setEnd(innode, inend);
        ranges.push(range);
    }
    nextstart = nextend;
    if (nextstart > selend) {
        break;
    }
}
ranges.forEach((r) => {
    const spn = document.createElement('span');
    r.surroundContents(spn);
});
Какой ещё суприз будет?
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3844 / 1699 / 431
Регистрация: 14.03.2022
Сообщений: 4,343
04.02.2026, 14:50
Цитата Сообщение от stele Посмотреть сообщение
А манипуляция с range типа surroundContents тутже приводит к изменению дерева и зацикливанию цикла
Нужно помнить что
surroundContents(node) – обернуть node вокруг содержимого диапазона. Чтобы этот метод сработал, диапазон должен содержать как открывающие, так и закрывающие теги для всех элементов внутри себя: не допускаются частичные диапазоны по типу <i>abc.
https://learn.javascript.ru/selection-range

Добавлено через 2 минуты
stele, в случае "рваного текста" у тебя такое не получится.
Часть текста может "содержать" закрывающий тег и/или открывающий...
0
67 / 64 / 17
Регистрация: 29.02.2016
Сообщений: 313
04.02.2026, 15:06  [ТС]
Цитата Сообщение от krvsa Посмотреть сообщение
Часть текста может "содержать" закрывающий тег и/или открывающий...
Я поэтому поначалу в вопросе и хотел посимвольно делать чтобы диапазоном не перекрыть изначальные куски. Но в процессе осознал что надо диапазоном покрывать всю попадающую часть из куска текста из одного исходного span. И вроде как в том коде что я привёл все смволы от selstart до selend оказываются внутри новых span выделения, но с учётом изначальных кусков текста. Ну по крайней мере визуально всё выглядит так как должно выглядеть по задумке.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.02.2026, 15:06
Помогаю со студенческими работами здесь

Получить индекс родительского div при нажатии на дочерний div
Здравствуйте как можно получить индекс родительского div при нажатии на дочений div. У меня есть 6...

При раскрытии div нужно закрывать какой либо другой div, который уже открыт
парни приветик ! подскажите пожалуйста вот есть у меня несолько div блоков ! для каждого блока...

Перенос элементов из одного div в другой div
Добрый вечер. На странице есть такая комбинация: &lt;p&gt; &lt;input id=&quot;input5&quot; class=&quot;checkbox&quot;...

div 1 div 1 display:none
когда я держу курсор на первой диви(div1), можно видеть вторую див(div2), но когда я двигаю курсор...

Слой div надо добавить в другой div
по нажатию надо вызывать функцию, которая будет копировать содержимое блока выбранного товара в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru