Avatar ·

Что значит javascript:void(0) и зачем это использовать в ссылках?

Привет! Я только начал изучать JavaScript и часто вижу в коде других разработчиков такую конструкцию: ```html Нажми меня ``` Я понимаю, что `href="#"` тоже часто используют, но там страница перескакивает наверх. А тут вообще странно — в адресной строке ничего не меняется, и страница не перезагружается. Но я не до конца понимаю, что именно делает `javascript:void(0)`. Почему нельзя просто написать `href=""`? Или вообще убрать href? Я пробовал убрать — тогда ссылка перестаёт выглядеть как ссылка (нет подчёркивания, курсор мыши не меняется). А если написать `href="#"`, то при клике страница прыгает вверх, что бесит пользователей. Ещё я видел, что `void` — это оператор в JavaScript. Но что именно он делает? В интернете пишут, что он вычисляет выражение и возвращает `undefined`. Но зачем это нужно в ссылке? Объясните, пожалуйста, простыми словами, как это работает и когда это правильно использовать. Может, есть более современные способы сделать ссылку, которая ничего не делает? Я пробовал гуглить, но ответы слишком сложные для новичка. Буду благодарен за подробное объяснение с примерами. <<>>

Что такое javascript:void(0) и как это работает

Давайте разберёмся по порядку. Конструкция javascript:void(0) состоит из двух частей:

  • javascript: — это псевдо-протокол (как http: или ftp:). Когда браузер видит такой href, он вместо перехода по URL выполняет JavaScript-код, который идёт после двоеточия.
  • void(0) — это оператор void, который вычисляет выражение в скобках и всегда возвращает undefined. 0 — просто самое короткое выражение, можно было написать void(1) или void('hello') — результат тот же.

Зачем это нужно? Когда пользователь кликает по ссылке, браузер пытается перейти по URL из href. Если там обычная страница — происходит переход. Если там javascript: — выполняется код. Но после выполнения кода браузер смотрит на результат. Если результат — строка, он пытается открыть её как новую страницу (это плохо). А если результат — undefined, браузер ничего не делает. void(0) гарантирует, что вернётся именно undefined.

Пример для понимания

Сравните три варианта:

<!-- Вариант 1: без void — плохо -->
<a href="javascript:alert('Привет')">Кликни</a>
<!-- После alert браузер попытается открыть undefined как страницу — ничего страшного, но некрасиво -->

<!-- Вариант 2: с void — правильно -->
<a href="javascript:void(alert('Привет'))">Кликни</a>
<!-- void гарантирует, что после alert вернётся undefined, и страница не изменится -->

<!-- Вариант 3: современный способ -->
<a href="#" onclick="event.preventDefault(); alert('Привет')">Кликни</a>
<!-- event.preventDefault() отменяет стандартное поведение ссылки -->

Почему это устарело

В современной разработке javascript:void(0) считается плохой практикой по нескольким причинам:

  • Нарушает принцип прогрессивного улучшения — если у пользователя отключён JavaScript, ссылка просто ничего не делает (вместо того чтобы вести на реальную страницу-заглушку).
  • Плохо для SEO и доступности — скринридеры и поисковые боты не понимают такие ссылки.
  • Усложняет отладку — в консоли разработчика такие ссылки выглядят как "javascript:void(0)", что неинформативно.

Современные альтернативы

Лучше использовать <button> для действий (открыть модалку, отправить форму) или обычные ссылки с event.preventDefault():

<!-- Для действий используйте button -->
<button onclick="myFunction()">Нажми меня</button>

<!-- Если очень нужно именно ссылка (например, стилизация) -->
<a href="#" onclick="event.preventDefault(); myFunction()">Нажми меня</a>

<!-- Идеальный вариант: ссылка с реальным fallback -->
<a href="/help/page" onclick="event.preventDefault(); openModal()">Открыть справку</a>
<!-- Если JS выключен, пользователь перейдёт на страницу /help/page -->

Таким образом, javascript:void(0) — это исторический костыль, который решал проблему "ссылка не должна никуда вести". Сегодня от него лучше отказаться в пользу более современных и доступных подходов.

<<>>

Альтернативный взгляд: когда void всё ещё полезен

Несмотря на то, что javascript:void(0) в ссылках устарел, сам оператор void в JavaScript всё ещё используется в некоторых ситуациях:

  • В bookmarklet'ах — это маленькие скрипты, которые сохраняются как закладки браузера. Там конструкция javascript:void(...) по-прежнему стандарт, потому что закладка должна выполнить код и не перезагрузить страницу.
  • Для получения undefined — в старом коде (до ES5) можно было переопределить глобальное undefined, поэтому использовали void 0 как надёжный способ получить "настоящий" undefined.
  • В стрелочных функциях — если нужно выполнить действие, но вернуть undefined (например, в цепочке промисов): promise.then(() => void doSomething()) — это гарантирует, что возвращаемое значение не будет использовано случайно.

Но в повседневной разработке веб-страниц лучше использовать <button> или event.preventDefault(). Оператор void — это редкий гость в современном коде, и его основное применение сейчас — это именно bookmarklet'ы и специфические случаи работы с undefined.