Как можно получить все идентификаторы элементов после завершения рендеринга DOM?

Как сделать стрелку на сайте, при нажатии на которую будет происходить скроллинг до следующей секции? Учитывая, что на сайте много компонентов с якорными ссылками, как можно получить id всех секций? Есть ли у вас какие-либо решения?
  • 2 ноября 2024 г. 8:32
Ответы на вопрос 3
Чтобы получить все идентификаторы (`id`) элементов на странице после завершения рендеринга DOM, вы можете использовать JavaScript. Например, в следующем коде вы можете получить все `id` для элементов, которые имеют этот атрибут:

```javascript
window.onload = function() {
    const allIds = Array.from(document.querySelectorAll('[id]')).map(el => el.id);
    console.log(allIds);
};
```

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

### Создание стрелки для скроллинга

Чтобы создать стрелку, при нажатии на которую произойдет прокрутка до следующей секции, вы можете использовать следующий пример. Предположим, у вас есть несколько секций с уникальными `id`:

```html
<div id="section1">Секция 1</div>
<div id="section2">Секция 2</div>
<div id="section3">Секция 3</div>

<div id="scrollArrow" style="cursor:pointer;">⬇️</div>
```

Теперь вы можете использовать JavaScript, чтобы реализовать прокрутку к следующей секции:

```javascript
document.getElementById('scrollArrow').addEventListener('click', function() {
    const currentSectionId = getCurrentSectionId();
    const nextSection = document.getElementById(currentSectionId)?.nextElementSibling;

    if (nextSection && nextSection.id) {
        nextSection.scrollIntoView({ behavior: 'smooth' });
    }
});

// Функция для получения текущего id секции
function getCurrentSectionId() {
    const sections = document.querySelectorAll('div[id]');
    let currentSectionId = '';

    sections.forEach(section => {
        const rect = section.getBoundingClientRect();
        if (rect.top >= 0 && rect.top < window.innerHeight) {
            currentSectionId = section.id;
        }
    });

    return currentSectionId;
}
```

### Общий алгоритм

1. **Получение всех идентификаторов**: Используйте `querySelectorAll` с соответствующим селектором.
2. **Обработка событий кнопки**: Добавьте обработчик событий на стрелку для прокрутки к следующему элементу.
3. **Скроллинг**: Используйте `scrollIntoView()` для плавной прокрутки к следующей секции.

Этот подход будет работать даже если у вас на странице много компонентов с якорными ссылками. Всегда вы можете расширить логику для более сложных случаев, если у вас специфические требования к навигации.
Вам надо на след. секцию скролить? Например через IntersectionObserver: 
https://playcode.io/2099856
https://playcode.io/2099876 - если нужно получить ref у компонента (через forwardRef)

ps в коде можете посмотреть как можно добавить все элементы в список
У вас именно Реакт? 
Если так, то обычно эти компоненты (и эти якорные ссылки в них) рендерятся из каких-то данных (state), а это значит, что id всех секций у вас уже есть.
Если вы рендерите как-то не так, то вы странно тогда используете Реакт. Должно быть проще доработать, чем пытаться лезть на низкий уровень и пытаться вытащить что-то из готовых компонентов.

P.S. вижу, что в предыдущем вопросе у вас то же самое. Может, вам просто тогда на ванильный JS переписать? И понятнее будет для вас, и клиентам меньше грузить. Вдобавок, можно прямо на сервере рендерить 99% разметки и нормально индексировать сайт. Вряд ли у вас там какие-то сложные интерфейсы, которые реально требуют Реакта.
Похожие вопросы