Coding
248 subscribers
5.86K photos
1.47K videos
34 files
5.9K links
Статьи и ссылки с разных ресурсов, для начинающих программистов.
Download Telegram
TreeWalker — последовательный обход DOM без создания промежуточной коллекции!

При обходе DOM часто используют рекурсию или querySelectorAll(). Это рабочие подходы, но они подходят не для всех задач: рекурсивный обход требует дополнительной логики, а querySelectorAll() сразу формирует статический NodeList со всеми найденными элементами.

DOM API предоставляет интерфейс TreeWalker, который позволяет последовательно обходить дерево документа и получать только нужные узлы по мере обхода. Например, создадим объект для обхода элементов:
{
const walker = document.createTreeWalker(
document.body,
NodeFilter.SHOW_ELEMENT
);

let node;

while ((node = walker.nextNode())) {
console.log(node.tagName);
}
}

Обход начинается с потомков переданного корневого узла, поэтому сам document.body в цикл не попадёт.

TreeWalker поддерживает фильтрацию узлов. Например, можно возвращать только кнопки во время обхода дерева:
{
const walker = document.createTreeWalker(
document.body,
NodeFilter.SHOW_ELEMENT,
{
acceptNode(node) {
return node.tagName === 'BUTTON'
? NodeFilter.FILTER_ACCEPT
: NodeFilter.FILTER_SKIP;
}
}
);

let node;

while ((node = walker.nextNode())) {
console.log(node);
}
}

Фильтр вызывается для узлов во время обхода, поэтому отдельная коллекция найденных элементов не создаётся.

FILTER_SKIP пропускает текущий узел, но продолжает обход его потомков. Если необходимо исключить всё поддерево целиком, используется FILTER_REJECT. TreeWalker также поддерживает навигацию в разных направлениях:
walker.parentNode();
walker.firstChild();
walker.lastChild();
walker.previousSibling();
walker.nextSibling();
walker.previousNode();
walker.nextNode();

Например, можно найти первый элемент с атрибутом data-error и сразу прокрутить страницу к нему:
{
const walker = document.createTreeWalker(
document.body,
NodeFilter.SHOW_ELEMENT
);

let node;

while ((node = walker.nextNode())) {
if (node.hasAttribute('data-error')) {
node.scrollIntoView({
behavior: 'smooth',
block: 'center'
});

break;
}
}
}

В отличие от querySelectorAll(), TreeWalker не создаёт промежуточную коллекцию найденных элементов, а возвращает узлы по мере обхода дерева.

При этом TreeWalker не обязательно будет быстрее querySelectorAll() в каждом конкретном случае. Выбор зависит от задачи: для простого поиска по CSS-селектору обычно удобнее querySelector() или querySelectorAll(), а для управляемого последовательного обхода дерева — TreeWalker.

🔥 TreeWalker определён в DOM Standard и предоставляет низкоуровневый механизм навигации по DOM с возможностью фильтрации узлов во время обхода. Он подходит для реализации редакторов, инструментов анализа DOM и библиотек, которым требуется последовательный обход дерева с полным контролем над процессом навигации.

📣 Code Ready | #практика
Верстаешь?

Оцени 7 причин пройти наш бесплатный интенсив по Frontend-разработке:

1. Без опыта сделаешь реальный сайт сервиса доставки с нуля;
2. Добавишь JavaScript-логику, расчёты и трекинг;
3. Подключишь карты и маршрут доставки через API;
4. Превратишь сайт в Angular-приложение;
5. Подключишь backend и выложишь проект в продакшен;
6. Научишься использовать ChatGPT и Giga во Frontend-разработке;
7. Узнаешь 9 способов найти первый заказ на фрилансе даже без опыта.

А главное, ты проведёшь 7 дней в приятной компании Fullstack-разработчика с 12-летним стажем – Романа Чернова и получишь живую помощь по проекту.

👉 Проскочить на интенсив бесплатно

Начинаем уже завтра.

🔥 С нас обучение, практика и помощь с выходом на фриланс или собеседованием.
😎 FrontSkill Docs — большая база знаний по Frontend-разработке!

Это онлайн-справочник, где собраны материалы по Frontend: HTML, CSS, JavaScript, TypeScript, React и другим технологиям. Документация построена по темам, что позволяет последовательно изучать материал или быстро находить нужную информацию во время разработки.

📌 Оставляю ссылочку: frontskill.ru

📣 Code Ready | #сайт
🎨 Цветовая палитра макета "Car Service":

HEX | RGB
#C1C1C1 | rgb(193,193,193)
#FF011D | rgb(255,1,29)
#1E1E1E | rgb(30,30,30)

⚠️ Цвет копируется одним кликом!

Сайтодел | #палитра
💾 Responsive Shader Carousel – галерея, показывающая выбранное изображение на заднем плане. Перелистывать можно только с помощью двух кнопок.

Сайтодел | #сниппет #css
💾 Interactive Wheel Menu – меню, которое появляется при нажатии на экран. Оно исчезает, если экран перестать удерживать.

Сайтодел | #сниппет #css
💾 Responsive GSAP Slider – слайдер для представления продуктов с подвижными SVG-картинками. Слайдер можно легко настроить под себя.

Сайтодел | #сниппет #css
🐙 React PDF – библиотека для создания PDF-файлов с помощью React. У нее есть API для стилизации элементов документа с использованием свойств CSS, в частности Flexbox.

Сайтодел | #репозиторий #github
✍️ React от нуля до архитектора — большое руководство по React-разработке!

Материал начинается с основ JavaScript и постепенно переходит к компонентам, JSX, хукам, формам и роутингу. Дальше разбираются TanStack Query, Redux Toolkit и Zustand, TypeScript, тестирование, безопасность, оптимизация производительности, архитектурные паттерны, Next.js, SSR и React Server Components. Получается полноценный маршрут от основ React до разработки и архитектуры крупных приложений.

Оставляю ссылочку: GitHub 📱

📣 Code Ready | #репозиторий
🎨 Цветовая палитра макета "Car Service":

HEX | RGB
#C1C1C1 | rgb(193,193,193)
#FF011D | rgb(255,1,29)
#1E1E1E | rgb(30,30,30)

⚠️ Цвет копируется одним кликом!

Сайтодел | #палитра
🎨 Цветовая палитра макета "BoraCodar":

HEX | RGB
#FCD2FF | rgb(252,210,255)
#B373C5 | rgb(179,115,197)
#6D68CF | rgb(109,104,207)

⚠️ Цвет копируется одним кликом!

Сайтодел | #палитра
⌨️ Python asyncio: gather, wait, TaskGroup на практике

Приглашаем на открытый урок.

🗓 18 августа в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Pyhon-разработчик».

На этом вебинаре вы разберёте продвинутые возможности библиотеки asyncio: чем отличаются asyncio.gather, asyncio.wait и asyncio.TaskGroup, как управлять несколькими задачами и что делать, чтобы долгие операции не блокировали выполнение программы.

Результат:
- Поймёте разницу между gather, wait и TaskGroup.
- Научитесь запускать и контролировать несколько асинхронных задач.
- Разберёте поведение ошибок и отмены задач.
- Узнаете, зачем нужен await asyncio.sleep(0).

🔗 Ссылка на регистрацию: https://otus.pw/jevP/

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
👨‍💻 Telegram-бот-магазин на Python: пошаговый гайд с оплатой, каталогом и админкой (Aiogram 3 + SQLAlchemy 2)

Шаг за шагом разбираем все этапы разработки бота: начиная от регистрации токена в BotFather и заканчивая деплоем готового продукта на удаленном хостинге, чтобы бот мог бесперебойно работать 24/7 без привязки к вашему компьютеру или интернет-соединению.

Гайд на русском + код 👍

#python #article #code
This media is not supported in your browser
VIEW IN TELEGRAM
😈 Мастер боли вышел на связь и показал топ своих проектов машин возмездия

С добрым утром! ☕️
🎨 Цветовая палитра макета "Car Service":

HEX | RGB
#C1C1C1 | rgb(193,193,193)
#FF011D | rgb(255,1,29)
#1E1E1E | rgb(30,30,30)

⚠️ Цвет копируется одним кликом!

Сайтодел | #палитра
Please open Telegram to view this post
VIEW IN TELEGRAM
Храним собственные данные прямо в HTML с помощью data-*!

Дата-атрибут — это пользовательский атрибут на HTML-элементе, название которого начинается с data-. Это встроенная возможность стандарта HTML5. В дата-атрибутах можно хранить дополнительную информацию в стандартных HTML-элементах и работать с этой информацией в JS при помощи собственного API.

После data- указывается произвольное имя, описывающее значение:
• data-id — идентификатор объекта;
• data-theme — тема оформления;
• data-status — состояние элемента;
• data-user-id — идентификатор пользователя.

data-* полезен, когда элементу нужно передать дополнительные данные для поведения интерфейса, не отображая их пользователю.

📣 Code Ready | #атрибут
🎨 Цветовая палитра макета "Car Service":

HEX | RGB
#C1C1C1 | rgb(193,193,193)
#FF011D | rgb(255,1,29)
#1E1E1E | rgb(30,30,30)

⚠️ Цвет копируется одним кликом!

Сайтодел | #палитра
Если постоянно пишешь тексты, посты или контент-планы — забери готовый набор промптов, чтобы не начинать каждый раз с нуля.

В канале PROMPTO собрали 30 промптов для контента: посты, заголовки, сценарии, контент-план. Просто копируешь под свою задачу. Плюс разборы новых нейросетей и подборки сервисов.

Набор лежит в закрепе — заходи и забирай:
@promt_lib
💾 Interactive Wheel Menu – меню, которое появляется при нажатии на экран. Оно исчезает, если экран перестать удерживать.

Сайтодел | #сниппет #css