Що означає "javascript: void (0)"?


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

Я бачив такі hrefбагато разів, але не знаю, що саме це означає.


12
javascript:є однією з багатьох схем URI: en.wikipedia.org/wiki/URI_scheme , як data:.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

3
Ви можете використовувати просто href="javascript:"з тією ж метою. Як зазначено у відповіді на це питання , void(0)частина спочатку була призначена для ранніх версій браузерів, де javascript:обробка URI відрізнялася. Але тепер я навіть не зміг знайти версію, де скорочення не працюватиме, принаймні IE7 це правильно обробляє.
користувач

1
Я також бачив href = "javascript: //", це краще?
світловий меч

href = "javascript: //" не працює для мене void (0) працює чудово.
пісок

Відповіді:


1040

voidОператор оцінює цей вислів , а потім повертається undefined.

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

Тут надано пояснення: voidоператор .

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


9
що це означає, коли href надається "невизначене примітивне значення"?
omg

7
"як правило, JavaScript: url перенаправить браузер на звичайну текстову версію результату оцінки цього javascript." Можна зробити приклад тут? Я ніколи не бачив такого використання.
omg

87
Приклад того, про що говорить фенікс, - <a href="javascript: dosomething() ;"> РОБИТИ ЗАРАЗ! </a>. Якщо dosomething поверне помилкове значення, то натискання на посилання просто призведе до того, що браузер вийде зі сторінки та відобразить "false". Однак ... <a href="javascript: dosomething(); void(0)"> РОБИТИ ЗАРАЗ! </a> дозволяє уникнути проблеми. Вперед і вставте javascript: 1 + 1; в адресний рядок веб-переглядачів. Браузер повинен відображати "2"
Бретон,

9
Тому що void - одинаковий оператор. Пустота не є значенням, а також не функцією. Йому потрібне значення, щоб діяти праворуч, інакше воно призведе до помилки.
Бретон

14
спробуйте шукати в консолі помилок? Він визначально видає синтаксичну помилку. Це недійсний JavaScript. Дуглас Крокфорд рекомендує триматися подалі від порожнечі через одинакову плутанину оператора / функції / значення, занадто дорого, щоб мати справу.
Бретон

435

Окрім технічної відповіді, javascript:voidозначає, що автор - це робити неправильно.

Немає вагомих причин використовувати 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елемент і слухаючи клавішу Space. Але це ніколи не буде на 100% відтворювати реальну поведінку браузера, не в останню чергу тому, що різні браузери можуть по-різному реагувати на клавіатуру (не кажучи вже про невізуальні браузери).

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

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


7
На додаток до чудового допису від @bobince: я пару місяців тому провів декілька досліджень щодо керованості між клавіатурою браузера href, включаючи химерність та побічні ефекти; деякі з вас можуть бути корисними: jakub-g.github.com/accessibility/onclick
jakub.g

2
@ThinkBonobo: Так змінився в якийсь момент з 2009 року! Оновлено.
bobince

59
Ця думка не відповідає на запитання. void(0)потрібен у багатьох випадках; "#" - це злом, який приносить із собою цілу низку проблем (він би не працював у додатку, про який я пишу, що привів мене на цю сторінку).
фельдшер

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
ні ні - return false зупинить поведінку за замовчуванням, тому # ніколи не з’явиться
Magnar

22
Протокол javascript: url - це стандарт дефакто, а не справжній стандарт. Тож href = "#" onclick = "повернути помилкове;" відповідає стандартам, а href = "javascript: void (0)" немає, тому що не існує офіційного стандарту, який би визначав, що слід робити.
Бретон

10
Крім того, Дуглас Крокфорд не любить нікчемності, тому 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();".
Грант Вагнер

40
@GrantWagner - Або, через 5 років, e.preventDefault().
trysis

1
Ви можете відредагувати / видалити цю відповідь, оскільки "#"вона не прокручується до вершини, коли ви повертаєте помилкову.
Навін

4
@Navin ви маєте рацію, але це вже застаріла практика. Коментар тризі вважається правильним.
Тім Сегуїн

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 вимкнено.
Ясен

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 на ваших через тег. Виклик функції JavaScript, яка повертає "невизначений", буде добре. Так буде посилання на "#".

Якірні теги в Internet Explorer 6 без href не a:hoverзастосовують стиль.

Так, це жахливо і незначний злочин проти людства, але знову ж таки, як і Internet Explorer 6 взагалі.

Я сподіваюся, що це допомагає.

Internet Explorer 6 - це фактично великий злочин проти людства.


25

Варто зазначити, що іноді ви побачите пустоту 0 під час перевірки на невизначеність, просто тому, що для цього потрібно менше символів.

Наприклад:

something === undefined

vs.

something === void 0

Деякі методи мінімізації замінюють невизначений на пусті 0 з цієї причини.


10
Один помітний приклад - TypeScript ( живий приклад ), який збирає значення параметрів за замовчуванням для перевірки void 0. 3-символьна різниця швидко збільшується, коли багато методів використовують параметри за замовчуванням.
Джон Вайш

1
"Деякі методи мінімізації з цієї причини замінюють невизначений нуль 0." Нарешті я це розумію! Дякую @squall за ретельну відповідь.
Ахмед Махмуд

22

Використання javascript:void(0)означає, що автор HTML неправильно використовує елемент прив’язки замість елемента кнопки.

Теги прив’язки часто зловживають під час події onclick для створення псевдо кнопок, встановлюючи href на "#" або "javascript: void (0)", щоб запобігти оновленню сторінки. Ці значення викликають несподівану поведінку під час копіювання / перетягування посилань, відкриття посилань у нових вкладках / вікнах, закладки та коли JavaScript все ще завантажується, вимикається помилки або відключається. Це також передає некоректну семантику допоміжним технологіям (наприклад, зчитувачам екрану). У цих випадках рекомендується використовувати <button>замість цього. Як правило, ви повинні використовувати якір для навігації лише за допомогою належної URL-адреси.

Джерело: MDN в <a>Page .


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>

1
Я бачив, як люди використовують javascript: null замість void ... але це проблема. Chrome null працює, у Firefox він намагається завантажити сторінку null. Радий, що ви оновлені. Цікавий клоп.
Гавін Пікін

Я знайшов інші види використання в кодовій базі, як javascript: null, але з javascript: null (), який не визначено, так що це працює.
Гевін Пікін

1
Так що в основному це як jveck's prevendDefault і повернення false?
Роберт Роша

16

Щоб зрозуміти цю концепцію, слід спочатку зрозуміти недійсний оператор у JavaScript.

Синтаксис оператора void - це: void «expr»який оцінює expr і повертає невизначений.

Якщо ви реалізуєте void як функцію, це виглядає так:

function myVoid(expr) {
    return undefined;
}

Цей недійсний оператор має одне важливе використання - відкидання результату вираження.

У деяких ситуаціях важливо повернути невизначене на відміну від результату вираження. Тоді недійсність може бути використана для відмови від цього результату. Одна з таких ситуацій пов’язана з JavaScript: URL-адреси, яких слід уникати для посилань, але корисні для закладок. Коли ви відвідуєте одну з цих URL-адрес, багато браузерів замінюють поточний документ результатом оцінки URL-адреси "вміст", але лише якщо результат не визначений. Отже, якщо ви хочете відкрити нове вікно без зміни поточного відображеного вмісту, ви можете зробити наступне:

javascript:void window.open("http://example.com/")

2
Дякуємо, що уточнили, для чого саме є аргумент "недійсним"! В інших відповідях було не зрозуміло, лише те, що "недійсність бере аргумент".
dbeachy1

Хороша відповідь, але одна деталь, недійсна реалізація буде чимось на зразок: 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 ).
Udo 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 еквівалент SPACE, який робить ваш JavaScript абсолютно марним для інтерпретатора.

Отже, якщо ви хочете використовувати тег HREF для виконання вбудованого JavaScript, ви повинні вказати дійсне значення для HREF FIRST, яке не надто складне (не містить пробілу), а потім надати JavaScript у тезі атрибутів події, як OnClick , OnMouseOver, OnMouseOut тощо.

Типова відповідь - зробити щось подібне:

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

Це прекрасно працює, але це змушує сторінку перескакувати доверху, оскільки знак фунта / хеш-тег підказує це зробити.

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

<A NAME='middleofpage'></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: void (0);

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

Це сповіщає браузер переходити ЗАРАЗ, але замість цього виконувати дійсний JavaScript: void (0); функція спочатку в тезі HREF, оскільки вона не містить пробілу, і не буде аналізуватися як URL-адреса. Замість цього він буде працювати компілятором. VOID - це ключове слово, яке при постачанні з параметром 0 повертається НЕ ВИЗНАЧЕНО, яке не використовує більше ресурсів для обробки значення повернення, яке відбудеться без вказівки 0 (це більше управління пам’яттю / продуктивністю).

Наступне, що трапляється - виконується OnClick. Сторінка не переміщується, нічого не відбувається на екрані.


+1 для пояснення всіх різних способів якір , як це може бути оброблений. Я вважаю, що <a>елемент завжди повинен кудись ходити ; якщо його тільки на сторінці виконувати якийсь JavaScript, то <button>замість нього слід використовувати. Використання <button>є і більш семантичним, і позбавляє вас від усієї дискусії про те, що зламати в якір href. Редагувати: схоже, що відповідь @Ronnie Royston нижче наведена в цьому аргументі.
Рабадаш8820

1

JavaScript: URL-адреси вбік; саме тут пустота може бути корисною для написання коротшого коду.

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
}

Було б добре, якби прихильники могли хоч би сказати, чому вони виступали. Я знаю, що це не в темі питання, але я думаю про всіх людей, які приходять сюди з результатів пошуку.
Мацей Кравчик
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.