Что означает «javascript: void (0)»?

1379
<a href="javascript:void(0)" id="loginlink">login</a>

Я видел такое hrefмного раз, но я не знаю, что именно это значит.

О, мой бог
источник
12
javascript:это одна из многих схем URI: en.wikipedia.org/wiki/URI_scheme , например data:.
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
3
Вы можете использовать только href="javascript:"для той же цели. Как указано в ответе на этот вопрос , эта void(0)часть изначально предназначалась для ранних версий браузеров, в которых javascript:обработка URI отличалась. Но теперь я даже не смог найти версию, в которой сокращение не сработало бы, по крайней мере, IE7 справляется с этим правильно.
пользователь
1
Я также видел href = "javascript: //", это лучше?
световой меч
href = "javascript: //" не работает для меня void (0) работает отлично.
sandip

Ответы:

1041

voidОператор оценивает данное выражение , а затем возвращается undefined.

voidОператор часто используется только для получения undefinedэлементарного значения, как правило , с использованием « void(0)» (что эквивалентно « void 0»). В этих случаях undefined вместо этого можно использовать глобальную переменную (при условии, что ей не присвоено значение, отличное от значения по умолчанию).

Объяснение предоставляется здесь: voidоператор .

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

Рахул
источник
9
что это значит, когда href задано «неопределенное примитивное значение»?
Боже,
7
«Обычно javascript: url перенаправляет браузер в текстовую версию результата оценки этого javascript.« Можете ли вы привести пример здесь? Я никогда не видел такого использования.
Боже,
87
Примером того, о чем говорит Феникс, является <a href="javascript: dosomething();"> ДЕЛАЙТЕ СЕЙЧАС! </a>. Если dosomething возвращает false, то нажатие на ссылку просто заставит браузер выйти из страницы и отобразить «false». Однако ... <a href="javascript: dosomething(); void(0)"> ДЕЛАЙТЕ СЕЙЧАС! </a> избегает проблемы. Идите вперед и вставьте JavaScript: 1 + 1; в адресную строку вашего браузера. Браузер должен отобразить «2»
Бретон
9
Потому что void - унарный оператор. Пустота - это не ценность и не функция. Ему нужно значение, чтобы оперировать справа, иначе он выдаст ошибку.
Бретон
14
попробуйте поискать в консоли ошибок? Это определенно генерирует синтаксическую ошибку. Это неверный JavaScript Дуглас Крокфорд рекомендует держаться подальше от пустоты, потому что унарная путаница с оператором / функцией / значением слишком дорога, чтобы с ней иметь дело.
Бретон
436

В дополнение к техническому ответу, javascript:voidозначает, что автор делает Doing It Wrong.

Нет веской причины использовать javascript:псевдо-URL (*). На практике это может привести к путанице или ошибкам, если кто-нибудь попробует что-то вроде «ссылка на закладку», «открыть ссылку в новой вкладке» и так далее. Это происходит довольно часто, теперь люди привыкли к нажатию средней кнопкой мыши для новой вкладки: она выглядит как ссылка, вы хотите прочитать ее на новой вкладке, но она вовсе не является реальной ссылкой, и дает нежелательные результаты, такие как пустая страница или ошибка JS при щелчке средней кнопкой мыши.

<a href="#">это общая альтернатива, которая, возможно, может быть менее плохой. Однако вы должны помнить об этом return falseиз onclickобработчика событий, чтобы предотвратить переход по ссылке и прокрутку вверх страницы.

В некоторых случаях может быть полезное место, на которое можно указать ссылку. Например, если у вас есть элемент управления, который вы можете нажать, чтобы открыть ранее скрытый элемент <div id="foo">, имеет смысл использовать его <a href="#foo">для ссылки на него. Или, если есть не-JavaScript способ сделать то же самое (например, «thispage.php? Show = foo», который устанавливает foo видимым для начала), вы можете сделать ссылку на это.

В противном случае, если ссылка указывает только на какой-либо сценарий, она на самом деле не является ссылкой и не должна быть помечена как таковая. Обычный подход должен был бы добавить onclickк <span>, <div>, или <a>без hrefи стиль его в некотором роде , чтобы понять , вы можете нажать на нее. Это то, что StackOverflow [сделал во время написания; теперь он использует href="#"].

Недостатком этого является то, что вы теряете контроль над клавиатурой, так как вы не можете переключаться на span / div / bare-a или активировать его с пробелом. Является ли это на самом деле недостатком, зависит от того, какое действие должен предпринять элемент. Вы можете, с некоторым усилием, попытаться имитировать взаимодействие с клавиатурой, добавив элемент tabIndexк элементу и прослушивая нажатие клавиши пробела. Но он никогда не будет на 100% воспроизводить реальное поведение браузера, не в последнюю очередь потому, что разные браузеры могут по-разному реагировать на клавиатуру (не говоря уже о невизуальных браузерах).

Если вы действительно хотите элемент, который не является ссылкой, но который можно активировать обычным способом с помощью мыши или клавиатуры, то вам нужен <button type="button">(или <input type="button">он так же хорош для простого текстового содержимого). Вы всегда можете использовать CSS, чтобы изменить его стиль, чтобы он выглядел скорее как ссылка, чем кнопка, если хотите. Но так как он ведет себя как кнопка, именно так вы и должны его пометить.

(*: в любом случае, при разработке сайта. Очевидно, что они полезны для букмарклетов. javascript:Псевдо-URL - это концептуальная причудливость: локатор, который не указывает на местоположение, а вместо этого вызывает активный код внутри текущего местоположения. Они вызвали большую безопасность проблемы как для браузеров, так и для веб-приложений, и они никогда не должны были изобретаться Netscape.)

bobince
источник
7
В дополнение к превосходному сообщению @bobince: пару месяцев назад я провёл некоторое исследование кроссбраузерной навигации по клавиатуре hrefs, включая причуды и побочные эффекты; некоторые из вас могут найти это полезным: jakub-g.github.com/accessibility/onclick
jakub.g
2
@ThinkBonobo: Так изменилось в какой-то момент с 2009 года! Обновлено.
Бобинц
59
Это мнение и не отвечает на вопрос. void(0)нужен во многих случаях; «#» - это хак, который приносит целый ряд проблем (он не будет работать в приложении, которое я пишу, которое привело меня на эту страницу).
felwithe
12
Я согласен с @feltwithe. Зачем заставлять других «Делать это особым образом»? За 15 лет программирования мне еще предстоит увидеть, как девиз «это всегда должно быть сделано таким образом» не приводит людей к беспорядку их собственного творчества
Стивен де Салас
4
Использование фрагмента-идентификатора является плохой идеей с точки зрения UX, поскольку это приводит к тому, что документ переходит на верх страницы, если preventDefaultне используется. Пожалуйста, не делайте этого в случае использования якоря в качестве кнопки на форме.
Джош Хабдас
124

Это значит, что ничего не поделаешь. Это попытка не ссылаться ни на какую ссылку. Но это не правильный путь.

Вы должны на самом деле просто return falseв onclickслучае, например, так:

<a href="#" onclick="return false;">hello</a>

Обычно он используется, если ссылка делает что-то вроде «JavaScript-y». Например, опубликовать AJAX-форму или обменять изображение, или что-то еще. В этом случае вы просто делаете любую вызываемую функцию return false.

Однако, чтобы сделать ваш веб-сайт совершенно потрясающим, обычно вы добавляете ссылку, которая выполняет то же действие, если человек, просматривающий его, решает не запускать JavaScript.

<a href="backup_page_displaying_image.aspx"
   onclick="return coolImageDisplayFunction();">hello</a>
Полдень шелк
источник
33
нет нет - возврат false остановит поведение по умолчанию, поэтому # никогда не появится
Magnar
22
протокол javascript: url является стандартом де-факто, а не настоящим стандартом. Так что href = "#" onclick = "return false;" соответствует стандартам, в то время как href = "javascript: void (0)" - нет, потому что не существует официального стандарта, определяющего, что именно должно делать.
Бретон
10
Кроме того, Дугласу Крокфорду не нравится void, поэтому jslint будет жаловаться на это. По сути, поскольку void является оператором, а не значением, он чертовски запутанен и порождает много вопросов, таких как этот. Лучше всего этого избежать. ха - ха.
Бретон
4
Брэндон: см. Ответы Брентона. Способ, который я рекомендую, является наиболее поддерживаемым, и, как я уже говорил во второй части моего поста, на «правильном» сайте вы даже никогда не будете использовать «#», потому что вы будете предоставлять резервные системы для решения проблемы отсутствия. JavaScript.
Шелковый полдень
19
+1 за включение совершенно потрясающего примера. Даже если у вас нет запасного статического HTML-кода для того, что вы делаете в JavaScript, вы всегда можете сделать что-то подобное <a href="enableJavaScriptToSeeMyCompletelyAwesomeSite.html" onclick="completelyAwesome();return false;">.
Грант Вагнер
73

Существует огромная разница в поведении "#" по сравнению с javascript: void

"#" прокручивает вас в верхнюю часть страницы, в то время как "javascript: void (0);" не.

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

Сальвин Фрэнсис
источник
26
@Salvin: поведение прокрутки к верхней части страницы можно подавить, вернувшись falseк обработчику событий: onclick="doSomething();return false;"или, если doSomething()вернется false, вы можете использовать onclick="return doSomething();".
Грант Вагнер
41
@GrantWagner - Или 5 лет спустя e.preventDefault().
Trysis
1
Вы можете редактировать / удалить этот ответ , так как "#"это не прокручивать в верхней части , когда вы возвращаетесь ложь.
Навин
4
@ Навин, ты прав, но сейчас это устаревшая практика. Комментарий от trysis теперь считается правильным.
Тим Сегин
66

Это очень популярный метод добавления функций JavaScript к ссылкам HTML.
Например: [Print]ссылки, которые вы видите на многих веб-страницах, написаны так:

<a href="javascript:void(0)" onclick="callPrintFunction()">Print</a>

Почему нам нужно, hrefпока onclickодни могут сделать работу? Потому что, когда пользователи наводят курсор на текст «Печать», когда его нет href, курсор изменится на каретку (ꕯ) вместо указателя (👆). Только имея hrefна aтеге проверяет его в качестве гиперссылки.

Альтернативой href="javascript:void(0);"является использование href="#". Эта альтернатива не требует включения JavaScript в браузере пользователя, поэтому она более совместима.

Хай - Вуонг До Тхань
источник
7
и ничего полезного, если javascript выключен.
Jasen
12
Вам не нужно hrefполучать курсор указывающей руки; все, что нужно, это немного CSS.
Джон Монтгомери
1
Почему бы вам не поставить функцию JavaScript в href вместо onclick?
Сиддхартха Ганди
2
Я согласен с @Sid - если вы используете его для запуска функции javascript, тогда <a href="javascript:callPrintFunction()">он чище (хотя, вероятно, он должен быть buttonне anchor, если он вас никуда не приведет).
DaveMongoose
href="#"может привести к неприятным сюрпризам - таким, как прерванные запросы xhr, которые вызываются при нажатии на эту ссылку. Недавно мне было трудно отлаживать веб-сайт, который прервал запрос на вход в oidc, если пользователь оказался по адресу, который не был корневым для сайта. #href заставил его перезагрузить адрес до того, как запрос xhr будет выполнен.
JustAMartin
44

Вы всегда должны иметь href на своих тегах a . Вызов функции JavaScript, которая возвращает 'undefined', подойдет. Так же будет ссылка на «#».

Якорные теги в Internet Explorer 6 без href не a:hoverприменяют стиль.

Да, это ужасное и незначительное преступление против человечества, но опять же, так же как и Internet Explorer 6 в целом.

Надеюсь, это поможет.

Internet Explorer 6 на самом деле является серьезным преступлением против человечества.

jscharf
источник
25

Стоит отметить, что вы иногда будете видеть void 0 при проверке неопределенности, просто потому, что для этого требуется меньше символов.

Например:

something === undefined

против

something === void 0

По этой причине некоторые методы минимизации заменяют неопределенное на void 0.

Шквал
источник
10
Одним примечательным примером является TypeScript ( живой пример ), который компилирует значения параметров по умолчанию для проверки void 0. Разница в 3 символа складывается быстро, когда многие методы используют значения параметров по умолчанию.
Джон Вайс
1
«По этой причине некоторые методы минимизации заменяют неопределенное на void 0». Наконец то я это понимаю! Спасибо @squall за подробный ответ.
Ахмед Махмуд
22

Использование javascript:void(0)означает, что автор HTML неправильно использует элемент привязки вместо элемента кнопки.

Якорные теги часто используются с событием onclick для создания псевдокнопок, устанавливая href в «#» или «javascript: void (0)», чтобы предотвратить обновление страницы. Эти значения вызывают неожиданное поведение при копировании / перетаскивании ссылок, открытии ссылок в новых вкладках / окнах, закладках, а также в тех случаях, когда JavaScript все еще загружается, выдает ошибки или отключен. Это также передает неверную семантику вспомогательным технологиям (например, программам чтения с экрана). В этих случаях рекомендуется использовать <button>вместо. В общем, вы должны использовать только якорь для навигации, используя правильный URL.

Источник: страница MDN<a> .

Ронни Ройстон
источник
4
+1 за поднятие семантического html по старому вопросу ... Ссылки идут местами, кнопки делают вещи - если мы не хотим, чтобы это выглядело как кнопка, мы должны просто очистить стили.
kevlarr
Большим исключением из этого являются карты изображений, для которых может потребоваться выполнение JavaScript; и поскольку это не кнопка, это ссылка, которая имеет многоугольные границы, это единственный путь.
17

voidявляется оператором, который используется для возврата undefinedзначения, поэтому браузер не сможет загрузить новую страницу.

Веб-браузеры будут пытаться взять все, что используется в качестве URL-адреса, и загрузить его, если только это не функция JavaScript, которая возвращает ноль. Например, если мы нажмем на такую ​​ссылку:

<a href="javascript: alert('Hello World')">Click Me</a>

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

Важно отметить, что оператор void должен иметь значение и не может использоваться сам по себе. Мы должны использовать это так:

<a href="javascript: void(0)">I am a useless link</a>
Amr
источник
1
Я видел, как люди используют javascript: null вместо void ... но это проблема. Chrome null работает, в Firefox он пытается загрузить страницу null. Рад, что вы обновились. Интересная ошибка.
Гэвин Пикин
Я нашел несколько других применений в кодовой базе, таких как javascript: null, но с javascript: null (), который не определен, так что это работает.
Гэвин Пикин
1
Так что в основном это как prevendDefault в jquery и возвращает false?
Роберт Роча
16

Чтобы понять эту концепцию, сначала нужно понять оператор void в JavaScript.

Синтаксис для оператора void: void «expr»вычисляет expr и возвращает undefined.

Если вы реализуете void как функцию, это выглядит следующим образом:

function myVoid(expr) {
    return undefined;
}

Этот оператор void имеет одно важное применение - отбрасывание результата выражения.

В некоторых ситуациях важно возвращать undefined, а не результат выражения. Тогда пустота может быть использована, чтобы отбросить этот результат. Одна из таких ситуаций связана с javascript: URL, которые следует избегать для ссылок, но полезны для букмарклетов. Когда вы посещаете один из этих URL-адресов, многие браузеры заменяют текущий документ результатом оценки «содержимого» URL-адресов, но только если результат не определен. Следовательно, если вы хотите открыть новое окно без изменения текущего отображаемого содержимого, вы можете сделать следующее:

javascript:void window.open("http://example.com/")
Гопал Ядав
источник
2
Спасибо за разъяснение, для чего именно аргумент 'void'! В других ответах не было ясно, только то, что «пустота требует аргумента».
dbeachy1
Хороший ответ, но одна деталь, реализация void будет выглядеть примерно так: function myVoid(expr) { expr(); return undefined; } Вы забыли добавить expr ();
Хуанма Менендес
1
@Juanma Menendez: не правда. exprпри myVoid()вызове уже вычисляется ( результат этого выражения передается как параметр)
Udo G
@ UdoG Мне любопытно, откуда ты знаешь этих людей? не могли бы вы объяснить.
Хуанма Менендес
@JuanmaMenendez: выражения в параметрах функций всегда вычисляются перед вызовом самой функции. Извините, у меня нет под рукой документа, который бы это прояснил, но попробуйте сами: function() { alert("foo"); }это правильное выражение . void(function() { alert("foo"); })возвращает undefinedи не показывает предупреждение, тогда myVoid(function() { alert("foo"); })как (в вашей версии, а не Gopal Yadav ).
Удо G
14

voidОператор оценивает данное выражение , а затем возвращает неопределенное значение. Это позволяет избежать обновления страницы.

Абхай Сингх
источник
9

Веб-разработчики используют, javascript:void(0)потому что это самый простой способ предотвратить поведение aтега по умолчанию . void(*anything*)возвращается, undefinedи это ложное значение. и возвращение ложного значения похоже return falseна onclickслучай aтега, который предотвращает его поведение по умолчанию.

Поэтому я думаю, что javascript:void(0)это самый простой способ предотвратить поведение aтега по умолчанию .

Мохамад Ширализаде
источник
8

Ссылка должна иметь цель HREF, которая должна быть указана, чтобы она могла использоваться в качестве экранного объекта.

Большинство браузеров не будут анализировать расширенный JavaScript в

<A HREF="" 

тег, такой как:

<A href="JavaScript:var elem = document.getElementById('foo');" 

поскольку тег HREF в большинстве браузеров не допускает пробелы или преобразует пробелы в% 20, HEX равнозначен пробелу, что делает ваш JavaScript абсолютно бесполезным для интерпретатора.

Поэтому, если вы хотите использовать тег HREF для выполнения встроенного JavaScript, вы должны указать допустимое значение для HREF FIRST, которое не слишком сложно (не содержит пробелов), а затем предоставить JavaScript в теге атрибута события, например OnClick. , OnMouseOver, OnMouseOut и т. Д.

Типичный ответ - сделать что-то вроде этого:

<A HREF="#" onclick="var elem = document.getElementById('foo');">Get the object</a>

Это прекрасно работает, но заставляет страницу переходить наверх, потому что это указывает знак фунта / хэш-тег.

Простое указание знака фунта / хеш-тега в теге HREF фактически указывает корневой якорь, который всегда по умолчанию является верхней частью страницы, и вы можете указать другое местоположение, указав атрибут NAME внутри тега A HREF.

<A NAME='middleofpage'></A>

Затем вы можете изменить свой тег A HREF, чтобы перейти на «middleofpage» и выполнить JavaScript в событии OnClick, как только это произойдет так:

<A HREF="#middleofpage" onclick="var elem = document.getElementById('foo');">Get the object</a>

Будет много раз, когда вы не хотите, чтобы эта ссылка перепрыгивала, поэтому вы можете сделать две вещи:

<A HREF="#thislinkname" name='thislinkname' onclick="var elem = document.getElementById('foo');">Get the object</a>

Теперь при нажатии на нее она никуда не денется, но это может привести к повторному центрированию страницы из текущего окна просмотра. Это не красиво. Каков наилучший способ предоставления встроенного JavaScript с использованием A HREF, но без необходимости делать что-либо из перечисленного выше? JavaScript: недействительным (0);

<A HREF="JavaScript:void(0);" onclick="var elem = document.getElementById('foo');">Get the object</a>

Это говорит браузеру, что нужно идти НИЧЕГО, но вместо этого выполнить действительный JavaScript: void (0); Функция сначала в теге HREF, потому что она не содержит пробелов и не будет анализироваться как URL. Вместо этого он будет выполняться компилятором. VOID - это ключевое слово, которое, когда оно снабжено параметром 0, возвращает UNDEFINED, которое больше не использует ресурсы для обработки возвращаемого значения, которое может возникнуть без указания 0 (это более удобно для управления памятью / производительности).

Следующим, что происходит, является выполнение OnClick. Страница не перемещается, ничего не происходит для отображения.


источник
+1 для объяснения всех различных способов якорь , как это может быть обработан. Я придерживаюсь мнения, что <a>элемент всегда должен куда-то идти ; если только на странице выполняется некоторый javascript, то <button>вместо него следует использовать a . Использование <button>более семантическое и избавляет вас от всей этой дискуссии о том, что взломать на якорь href. Изменить: похоже, что ответ @Ronnie Royston ниже уже имеет этот аргумент покрыты.
Rabadash8820
1

JavaScript: URL-адреса в стороне; здесь void может быть полезен для написания более короткого кода.

var error1 = false,
    error2 = false,
    error3 = false;

function error1() {

  error1 = true;
}

function myFunction() {

  // You can easily return and call a function at once, if you don't care about myFunction's return value
  if (!someCondition1)
    return error1();

  // What if you want to set a value first?
  if (!someCondition2) {
    error2 = true;
    return
  }

  // Shortest way to return and set a value at once
  if (!someCondition3)
    return void(error3 = true);

  // More code goes here
}
Мацей Кравчик
источник
Было бы хорошо, если бы downvoters могли по крайней мере сказать, почему они понизили. Я знаю, что это не по теме вопроса, но я думаю обо всех людях, которые приходят сюда из результатов поиска.
Мацей Кравчик