JS
Статьи о JavaScript — инструкции, советы, полезные руководства.
Popover API или Dialog API: что выбрать?
После продолжительного изучения темы выяснилось, что Popover API и Dialog API кардинально отличаются с точки зрения доступности. Если вы стоите перед выбором, придерживайтесь такого правила:
- Используйте Popover API для большинства поповеров.
- Используйте Dialog API только для модальных диалогов.
- 14 марта 2026
Прощай, innerHTML — привет, setHTML: усиленная защита от XSS в Firefox 148
Firefox 148 стал первым браузером, реализовавшим стандартизированный Sanitizer API — новый инструмент, который встраивает санитизацию HTML непосредственно в процесс вставки содержимого в DOM и делает защиту от XSS доступной по умолчанию.
Межсайтовый скриптинг (XSS) по-прежнему остаётся одной из наиболее распространённых уязвимостей в интернете. Новый стандартизированный Sanitizer API даёт веб-разработчикам простой способ очищать ненадёжный HTML перед его вставкой в DOM. Firefox 148 стал первым браузером, поставившим этот API в стабильную версию, — ожидается, что остальные браузеры последуют примеру в ближайшее время.
XSS-уязвимость возникает, когда сайт непреднамеренно позволяет злоумышленникам внедрять произвольный HTML или JavaScript через пользовательский контент. С её помощью атакующий может отслеживать и подменять действия пользователей и систематически похищать их данные — до тех пор, пока уязвимость не будет устранена. XSS исторически крайне сложен в предотвращении и на протяжении почти десяти лет стабильно входит в тройку самых опасных веб-уязвимостей (CWE-79).
Mozilla участвовала в борьбе с XSS с самого начала: ещё в 2009 году Firefox инициировал разработку стандарта Content-Security-Policy (CSP). CSP позволяет сайтам ограничивать, какие ресурсы (скрипты, стили, изображения и т. д.) браузер вправе загружать и исполнять, формируя надёжный рубеж обороны. Тем не менее, несмотря на постоянные улучшения, CSP так и не получил широкого распространения: его внедрение требует существенных архитектурных изменений и регулярного внимания специалистов по безопасности.
Sanitizer API призван заполнить этот пробел, предоставляя стандартизированный механизм преобразования вредоносного HTML в безопасный. Метод setHTML() встраивает санитизацию непосредственно в процесс вставки HTML, обеспечивая защиту на уровне умолчаний. Пример очистки небезопасного HTML:
document.body.setHTML(`<h1>Hello my name is <img src="x"
onclick="alert('XSS')">`);
При такой санитизации элемент <h1> будет сохранён, а элемент <img> вместе с атрибутом onclick — удалён, что устраняет XSS-атаку. В результате останется следующий безопасный HTML:
<h1>Hello my name is</h1>Разработчики могут усилить защиту от XSS с минимальными изменениями в коде, заменив подверженные ошибкам присваивания innerHTML на вызовы setHTML(). Если настройки по умолчанию окажутся слишком строгими или, напротив, недостаточно строгими для конкретного случая, можно передать пользовательскую конфигурацию, определяющую, какие элементы и атрибуты следует сохранить или удалить. Для экспериментов до внедрения API на продакшн-сайте рекомендуется воспользоваться песочницей Sanitizer API.
Для ещё более надёжной защиты Sanitizer API можно сочетать с
Trusted Types,
которые централизуют контроль над разбором и вставкой HTML. После перехода на setHTML() включить принудительное применение Trusted Types становится проще — зачастую без необходимости создавать сложные пользовательские политики. Строгая политика может разрешать setHTML(), блокируя остальные небезопасные способы вставки HTML, что помогает предотвращать регрессии в безопасности.
Sanitizer API упрощает замену присваиваний innerHTML на вызовы setHTML() в существующем коде, устанавливая новый безопасный стандарт и защищая пользователей от XSS-атак. Firefox 148 поддерживает как Sanitizer API, так и Trusted Types. Принятие этих стандартов позволит любому разработчику предотвращать XSS без выделенной команды безопасности и масштабных архитектурных изменений.
- 13 марта 2026
Как сделать кнопку «Скопировать» на странице
Наверняка вы сто раз видели кнопку Скопировать, например, возле блоков кода в любимой нейронке, чтобы быстро их скопипастить. Давайте разберемся, как самостоятельно сделать такую же (кнопку, а не нейронку).
- 21 ноября 2025
UUID в JavaScript: Полное руководство
Генерация UUID — одна из тех фундаментальных задач, с которой сталкивается каждый разработчик. Universally Unique Identifier, или универсальный уникальный идентификатор, решает простую, но критически важную задачу: создание гарантированно уникального идентификатора.
- 20 ноября 2025
Как спарсить JSON (100% рабочий способ)
JSON (JavaScript Object Notation) — это текстовый формат для представления структурированных данных. Он повсеместно используется для обмена информацией между клиентом и сервером, хранения конфигураций и сериализации состояний. В JavaScript его преобразование в рабочие объекты выполняется стандартным методом JSON.parse(). Ниже описаны корректные и надёжные способы его применения — от базового использования до промышленных практик.
- 18 ноября 2025
40 самых популярных регулярных выражений в JavaScript
Часто бывает нужна какая-нибудь конкретная регулярка — например, проверить почту или номер телефона. Собрали 40 часто встречаемых, чтобы они всегда были под рукой (или, на худой конец, в закладках).
| # | Название | Регулярное выражение |
|---|---|---|
| 1 | Проверка email | /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/ |
| 2 | Проверка URL | /^https?:\/\/[\w\-]+(\.[\w\-]+)+[/#?]?.*$/ |
| 3 | Только цифры | /^\d+$/ |
| 4 | Только буквы | /^[a-zA-Z]+$/ |
| 5 | Телефон РФ | /^(?:\+7|8)[\s-]?\(?\d{3}\)?[\s-]?\d{3}[\s-]?\d{2}[\s-]?\d{2}$/ |
| 6 | HEX-цвет | /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/ |
| 7 | IPv4-адрес | /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/ |
| 8 | Дата ДД.ММ.ГГГГ | /^(0[1-9]|[12]\d|3[01])\.(0[1-9]|1[012])\.(19|20)\d{2}$/ |
| 9 | Время ЧЧ:ММ | /^([01]\d|2[0-3]):([0-5]\d)$/ |
| 10 | Сильный пароль (8+ символов, буквы + цифры) | /^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$/ |
| 11 | Хотя бы одна заглавная буква | /(?=.*[A-Z])/ |
| 12 | Только латиница и цифры | /^[a-zA-Z0-9]+$/ |
| 13 | YouTube ID из ссылки | /(?:v=|\/embed\/|\.be\/)([^?&"]{11})/ |
| 14 | Удалить HTML-теги | /<[^>]*>/g |
| 15 | Удалить лишние пробелы | /\s+/g |
| 16 | Найти все цифры | /\d+/g |
| 17 | Заменить цифры на * | /\d/g |
| 18 | CamelCase → snake_case | /([A-Z])/g |
| 19 | snake_case → camelCase | /_[a-z]/g |
| 20 | Первая буква заглавная | /^\w/ |
| 21 | Все слова с заглавной | /\b\w/g |
| 22 | Повторяющиеся слова | /\b(\w+)\b\s+\1\b/gi |
| 23 | UUID | /^[0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i |
| 24 | Base64 | /^(data:[^;]+;base64,)?[A-Za-z0-9+/=]+$/ |
| 25 | Число с плавающей точкой | /^-?\d*(\.\d+)?$/ |
| 26 | Сумма в рублях | /^\d{1,3}(?:\s\d{3})*(?:[.,]\d{1,2})?\s?₽?$/ |
| 27 | @упоминания | /@\w+/g |
| 28 | #хэштеги | /#\w+/g |
| 29 | Удалить эмодзи | /[\u{1F600}-\u{1F6FF}|\u{2600}-\u{26FF}|\u{2700}-\u{27BF}]/gu |
| 30 | Только кириллица | /^[а-яА-ЯёЁ]+$/u |
| 31 | Логин (3–20 символов) | /^[a-zA-Z0-9_-]{3,20}$/ |
| 32 | Есть спецсимволы | /[^a-zA-Z0-9\s]/ |
| 33 | Пробелы в начале/конце | /^\s|\s$/ |
| 34 | Все числа в тексте | /-?\d+(\.\d+)?/g |
| 35 | Сжать пробелы | /\s+/g |
| 36 | Пустая строка или пробелы | /^\s*$/ |
| 37 | Простая CSV-строка | /^[^,\r\n]+(,[^,\r\n]+)*$/ |
| 38 | IPv6 (упрощённо) | /^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$/ |
| 39 | Только пробелы и табы | /^[\s\t]*$/ |
| 40 | Случайный пароль 12 символов (паттерн) | /[A-Za-z0-9]{12}/ |
Сохрани страницу — и 40 самых полезных регулярных выражений всегда под рукой!
- 9 ноября 2025

Полный гайд по объекту Date в JavaScript
Объект Date позволяет создавать, сравнивать и форматировать дату и время. Используется для отображения текущего времени, вычисления интервалов и работы с таймзонами в веб-приложениях.
Доступно в Baseline в статусе «Widely Available» с 2018-01-29
- 8 ноября 2025
Chrome DevTools останется без «живого» редактирования JS
Инструменты разработчика в браузере Chrome лишатся одной из своих экспериментальных возможностей — «живого редактирования» JavaScript-кода. Как сообщила команда разработчиков в официальном блоге, функция будет полностью удалена в феврале 2026 года с выходом версии Chrome 145. Это решение отражает эволюцию современных инструментов веб-разработки.
- 23 октября 2025

Форматирование относительного времени в JavaScript
API Intl.RelativeTimeFormat доступно в Baseline в статусе «Widely Available» с 16 марта 2023 года. Это мощный инструмент для отображения относительного времени в локализованном виде, например, «через минуту», «вчера» или «2 недели назад». Он автоматически адаптируется к языку и культурным особенностям региона, делая интерфейс более понятным и дружелюбным для пользователей.
В этой статье мы разберём, как работает Intl.RelativeTimeFormat, и приведём несколько примеров его использования.
- 17 октября 2025

Что такое null-коалесцентный оператор ?? в JavaScript
Операторы ?? и ??= стали доступны в Baseline в статусе «Widely Available» с 16 марта 2023 года. Они упрощают работу с переменными, которые могут быть null или undefined, позволяя задавать значения по умолчанию или обновлять переменные только в этих случаях. Это делает код чище и понятнее, особенно при работе с потенциально отсутствующими данными.
В этой статье мы разберём, как работают операторы нулевого слияния, и покажем примеры их использования.
- 15 октября 2025