Что означает javascript:void(0) в HTML-ссылках?
Я столкнулся со следующим шаблоном в HTML-коде:
<a href="javascript:void(0)" id="loginlink">login</a>
Может кто-нибудь объяснить, что делает значение javascript:void(0) в атрибуте href и почему оно часто используется в веб-разработке?
javascript:void(0) в атрибуте href HTML-ссылки создает кликабельный элемент, который предотвращает поведение навигации браузера по умолчанию при клике. Вместо загрузки новой страницы или прокрутки к разделу текущей страницы, ссылка выполняет выражение void(0), которое возвращает undefined и по сути ничего не делает, позволяя любым прикрепленным обработчикам событий JavaScript (таким как onclick) контролировать поведение вместо этого.
Содержание
- Что на самом деле делает
javascript:void(0) - Почему разработчики используют этот паттерн
- Безопасность и альтернативы
- Лучшие практики для интерактивных элементов
- Стратегии миграции
Что javascript:void(0) на самом деле делает
Выражение javascript:void(0) combines two JavaScript concepts:
-
Оператор
void: Вычисляет переданное ему выражение и возвращаетundefined. Это означает, чтоvoid(0)вычисляется доundefinedбез побочных эффектов или значений. -
Протокол
javascript:: Схема URI, которая выполняет JavaScript-код вместо навигации к ресурсу.
Когда вы используете <a href="javascript:void(0)">, вы говорите браузеру выполнить JavaScript-код void(0) вместо выполнения обычного поведения ссылки. Как объясняется на freeCodeCamp, это означает “ничего не делать - не перезагружать, не навигировать, не запускать какой-либо код.”
<!-- Эта ссылка никуда не будет вести -->
<a href="javascript:void(0)" onclick="showLoginModal();">Вход</a>
Почему разработчики используют этот паттерн
Предотвращение поведения навигации по умолчанию
Основная причина, по которой разработчики используют javascript:void(0), - это предотвращение нежелательной навигации страницы при создании интерактивных элементов, которые запускают JavaScript-действия. Как отмечено в DEV Community, этот метод “предотвращает обновление страницы и изменение URL при клике на ссылку.”
Создание интерактивных элементов
Многие разработчики используют теги-якоря с javascript:void(0) для создания псевдо-кнопок или интерактивных элементов. Этот паттерн распространен для:
- Модальных диалогов
- Выпадающих меню
- Навигации по вкладкам
- Интерактивных форм
- Динамической загрузки контента
Как объясняется на GeeksforGeeks, “javascript:void(0) позволяет ссылкам выполнять JavaScript без ухода со страницы, что полезно для действий, таких как показ всплывающих окон.”
Общие случаи использования:
- Ссылки входа, открывающие модальные формы
- Пункты меню, запускающие JavaScript-функции
- Интерактивные элементы в одностраничных приложениях
- Элементы, которые должны быть доступны с клавиатуры, но не навигационные
Безопасность и альтернативы
Риски безопасности
Использование javascript:void(0) создает несколько проблем безопасности:
-
Уязвимости XSS: Как отмечено в GitHub issue React, JavaScript-URL могут быть использованы для атак межсайтового скриптинга.
-
Конфликты с политикой безопасности контента: Современные браузеры и фреймворки безопасности часто блокируют
javascript:URL по умолчанию. -
Проблемы доступности: Скринридеры могут не правильно объявлять эти элементы как интерактивные.
Лучшие альтернативы
| Альтернатива | Плюсы | Минусы |
|---|---|---|
<a href="#" onclick="return false;"> |
Предотвращает навигацию, широко поддерживается | Фрагмент URL (#) остается в адресной строке |
<a href="javascript:void(0);"> |
Предотвращает навигацию | Риски безопасности, устарело в фреймворках |
<button onclick="..."> |
Семантически верный, доступный, без проблем безопасности | Требует стилизации для соответствия ссылкам |
<a href="#" role="button"> |
Доступный, дружелюбный к клавиатуре | Фрагмент остается в URL |
Согласно Sentry, “Установка значения href ссылки на “” или “#” является лучшей альтернативой” javascript:void(0).
Лучшие практики для интерактивных элементов
Использование семантического HTML
Наиболее семантически правильный подход - использовать подходящие HTML-элементы для их предполагаемого назначения. Как подчеркивается на GeeksforGeeks, “Это злоупотребляет тегом <a>, который предназначен для навигации. Вместо этого используйте <button> для действий.”
Рекомендации современных фреймворков
Современные JavaScript-фреймворки, такие как React, явно не рекомендуют javascript: URL. В GitHub issue React указано, что “React 16.9.0 устаревает javascript: URL” в качестве меры предосторожности.
Вопросы доступности
Правильная доступность требует, чтобы интерактивные элементы:
- Были доступны с клавиатуры
- Предоставляли соответствующие ARIA-роли
- Имели четкие состояния фокуса
- Работали со скринридерами
<!-- Лучшая альтернатива: использование элемента button -->
<button id="loginlink" onclick="showLoginModal();">Вход</button>
<!-- Альтернатива: доступная ссылка с правильной ролью -->
<a href="#" role="button" onclick="showLoginModal(); return false;">Вход</a>
Стратегии миграции
Пошаговая миграция
- Идентификация интерактивных элементов: Найдите все теги
<a>сjavascript:void(0), которые запускают JavaScript-действия - Замена на подходящие элементы: Используйте
<button>для действий,<a>для навигации - Обновление обработчиков событий: Перенесите с href на соответствующие атрибуты событий
- Тестирование доступности: Убедитесь в навигации с клавиатуры и совместимости со скринридерами
Пример миграции
До:
<a href="javascript:void(0)" class="btn" onclick="showModal();">Открыть модальное окно</a>
После:
<button class="btn" onclick="showModal();">Открыть модальное окно</button>
Вопросы CSS-стилизации
При замене ссылок на кнопки, возможно, потребуется скорректировать CSS:
/* Сделать кнопку похожей на ссылку */
.btn {
background: none;
border: none;
color: #0066cc;
text-decoration: underline;
cursor: pointer;
padding: 0;
font: inherit;
}
/* Сделать ссылку похожей на кнопку */
.link-button {
background: #f0f0f0;
border: 1px solid #ccc;
padding: 8px 16px;
border-radius: 4px;
cursor: pointer;
}
Заключение
javascript:void(0) - это техника, используемая для предотвращения навигации по умолчанию для ссылок при сохранении кликабельных элементов, но она имеет значительные недостатки с точки зрения безопасности и доступности. Современная веб-разработка отдает предпочтение семантическим HTML-элементам, таким как <button> для интерактивных действий, поскольку они обеспечивают лучшую доступность, безопасность и поддерживаемость. При работе с JavaScript-фреймворками, такими как React, все более важно избегать javascript: URL altogether и использовать правильные обработчики событий вместо этого. Переход к более семантической и доступной разметки не только улучшает качество кода, но и повышает пользовательский опыт на различных устройствах и вспомогательных технологиях.
Источники
- Что означает “javascript:void(0)”? - Stack Overflow
- Понимание выражения javascript:void(0) - DEV Community
- Что означает javascript:void(0)? - GeeksforGeeks
- Что на самом деле означает javascript:void(0)? Объяснение - Creative Tim
- JavaScript Void 0 – Что означает javascript:void(0);? - freeCodeCamp
- Что означает “javascript:void(0)”? | Sentry
- Что означает JavaScript Void(0)? - Quackit
- Что означает javascript:void(0)? · CoreUI
- Понимание выражения javascript:void(0) - Medium
- Что означает JavaScript:Void(0)? - freeCodeCamp
- Ложное предупреждение о предосторожности безопасности (javascript: URLs) · GitHub React Issue
- Какое значение href следует использовать для пустых JavaScript-ссылок, “#” или “javascript:void(0)”? | Sentry
- JavaScript - Избегайте “javascript:void(0)” для пустых ссылок - 30 seconds of code
- Странная особенность с XSS через JavaScript URI - DigiNinja
- Как разрешить
javascript:void(0)для использования в атрибутах HTML-элементов через Content-Security-Policy? - Stack Overflow