Яке значення "href" слід використовувати для посилань JavaScript, "#" або "javascript: void (0)"?


4076

Нижче наведено два способи створення посилання, яке є єдиною метою запуску JavaScript-коду. Що краще, з точки зору функціональності, швидкості завантаження сторінки, цілей перевірки тощо?

function myJsFunc() {
    alert("myJsFunc");
}
<a href="#" onclick="myJsFunc();">Run JavaScript Code</a>

або

function myJsFunc() {
    alert("myJsFunc");
}
 <a href="javascript:void(0)" onclick="myJsFunc();">Run JavaScript Code</a>


202
Якщо я чогось не пропускаю, <a href="javascript:void(0)" onclick="myJsFunc();">абсолютно немає сенсу. Якщо вам потрібно використовувати javascript:протокол psuedo, onclickатрибут також не потрібен . <a href="javascript:myJsFunc();">зробить просто чудово.
Веслі Мерч

65
@WesleyMurch - Якщо myJsFunc()має значення, що повертається, ваша сторінка зламається. jsfiddle.net/jAd9G Ви б все одно доведеться використовувати voidось так: <a href="javascript:void myJsFunc();">. Але тоді поведінка все-таки відрізнялася б. Викликання посилання через контекстне меню не викликає clickподії.
gilly3

38
Чому б не просто <a href="javascript:;" onclick="myEvent()"?
3к-

26
javascript:;набагато швидше набрати, ніжjavascript:void(0)
Майк Каузер

78
Спочатку думав , що, якщо дивитися на це: «чому ви б використовувати <a>тег , якщо то , що ви хочете зробити , це НЕ відкрити іншу сторінку з допомогою нативної функції браузера, а є деякі JavaScript" дії " , щоб бути викликана просто з допомогою? spanТег з класом js-triggerмабуть, набагато краще ". Або я щось пропускаю?
Адрієн Бе

Відповіді:


2164

Я використовую javascript:void(0).

Три причини. Заохочення використання #серед команди розробників неминуче призводить до того, що деякі використовують зворотне значення функції, що називається так:

function doSomething() {
    //Some code
    return false;
}

Але потім вони забувають використовувати return doSomething()в onclick і просто користуються doSomething().

Друга причина уникнення #- те, що фінал return false;не виконується, якщо викликана функція видає помилку. Отже, розробникам доводиться пам'ятати також, щоб обробляти будь-яку помилку в викликаній функції.

Третя причина - це випадки, коли onclickвластивість події призначається динамічно. Я вважаю за краще мати можливість викликати функцію або призначати її динамічно без необхідності кодувати функцію спеціально для того чи іншого способу вкладення. Отже, моя onclick(або на чому-небудь) розмітка в HTML виглядає так:

onclick="someFunc.call(this)"

АБО

onclick="someFunc.apply(this, arguments)"

Використання javascript:void(0)дозволяє уникнути всіх перерахованих вище головних болів, і я не знайшов жодного прикладу зворотного боку.

Отже, якщо ви самотній розробник, то ви можете чітко зробити свій вибір, але якщо ви працюєте як команда, ви повинні або заявити:

Використовуйте href="#", переконайтеся, що onclickзавжди міститься return false;в кінці, що будь-яка викликана функція не видає помилку, і якщо ви додаєте функцію динамічно до onclickвластивості, переконайтеся, що, а також не кидаючи помилку, вона повертається false.

АБО

Використовуйте href="javascript:void(0)"

Друге явно набагато простіше спілкуватися.


329
Я завжди відкриваю кожне посилання на новій вкладці, і саме тому я особисто ненавиджу це, коли люди використовують href="javascript:void(0)"метод
Тімо Хуовінен

182
Вибачте, не погоджуйтесь, чому ця відповідь має стільки результатів? Будь-яке використання javascript:слід вважати поганою практикою, нав'язливою та не витонченою децензацією.
Lankymart

52
Наступні два відповіді набагато кращі та розумніші, ніж ця. Також перші два аргументи є недійсними, оскільки event.preventDefault()є саме для того, щоб запобігти поведінці за замовчуванням (як, наприклад, стрибок на верхню частину сторінки) і зробити кращу роботу в цьому без всякої return false;божевільності.
sudee

136
Перемотка вперед до 2013 року: javascript:void(0)порушує Політику щодо захисту вмісту на сторінках HTTPS з підтримкою CSP. Одним із варіантів було б тоді використовувати href='#'та event.preventDefault()обробник, але мені це не дуже подобається. Можливо, ви можете встановити умову щодо використання href='#void'та переконайтесь, що жодного елемента на сторінці немає id="void". Таким чином, натискання посилання на неіснуючий якір не прокручує сторінку.
jakub.g

24
Ви можете використовувати "#", а потім прив'язати подію клацання до всіх посилань із "#" як href. Це було б зроблено в jQuery з:$('a[href="#"]').click(function(e) { e.preventDefault ? e.preventDefault() : e.returnValue = false; });
Натан

1325

Ні.

Якщо у вас є фактична URL-адреса, яка має сенс використовувати її як HREF. Onclick не спрацьовує, якщо хтось із середніх клацань клацне на вашому посиланні, щоб відкрити нову вкладку або якщо у неї відключений JavaScript.

Якщо це неможливо, вам слід принаймні вставити тег прив’язки до документа за допомогою JavaScript та відповідних обробників подій клацання.

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

Перевірте ненав’язливий JavaScript та прогресивне вдосконалення (обидві Вікіпедії).


19
Чи можете ви навести приклад того, як можна "вставити тег прив’язки до документа за допомогою JavaScript та відповідних обробників подій клацання"?
користувач456584

11
Навіщо взагалі вводити тег прив’язки, якщо він просто призначений для використання для дозволу елемента а) клацанням b) відображення курсору "покажчика". Мабуть, не важливо навіть вводити тег прив’язки до цього сценарію.
розчавити

12
+1 для жодного, але підходів є понад. Фактом залишається використання однієї javascript:або #обох поганих практик, і їх не слід заохочувати. Приємні статті btw.
Ланкімарт

13
@crush: я також не використовував би діва або проліт; відверто кажучи, це, здається, <button>було зроблено саме для цього. Але погоджено: це, мабуть, не повинно бути конкретно, <a>якщо немає відповідного місця для посилання на нього.
cHao

14
@cHao Button - це, мабуть, найкращий вибір. Я припускаю, що головний момент полягає в тому, що елемент HTML не слід вибирати на основі його зовнішнього вигляду презентації, а його значення для структури документа.
розчавити

775

Робити <a href="#" onclick="myJsFunc();">Link</a>або <a href="javascript:void(0)" onclick="myJsFunc();">Link</a>що-небудь ще, що містить onclickатрибут - це було нормально ще п’ять років тому, хоча зараз це може бути поганою практикою. Ось чому:

  1. Він сприяє практиці нав'язливого JavaScript, який виявився важким у підтримці та складному масштабі. Детальніше про це в ненав’язливому JavaScript .

  2. Ви витрачаєте свій час на написання неймовірно надмірно багатослівного коду - що має дуже мало (якщо є) користі для вашої кодової бази.

  3. Зараз існують кращі, легші та більш досяжні та масштабовані способи досягнення бажаного результату.

Непомітний спосіб JavaScript

Просто hrefатрибут взагалі не має ! Будь-яке гарне скидання CSS допоможе піклуватися про стиль відсутності курсора за замовчуванням, так що це не проблема. Потім приєднайте свою функціональність JavaScript, використовуючи витончені та ненав’язливі найкращі практики - які є більш доступними, оскільки ваша логіка JavaScript залишається в JavaScript, а не в розмітці - що важливо, коли ви починаєте розробляти широкомасштабні програми JavaScript, які вимагають розбиття вашої логіки на чорношкірі компоненти та шаблони. Детальніше про це у великомасштабній архітектурі додатків JavaScript

Простий приклад коду

// Cancel click event
$('.cancel-action').click(function(){
    alert('Cancel action occurs!');
});

// Hover shim for Internet Explorer 6 and Internet Explorer 7.
$(document.body).on('hover','a',function(){
    $(this).toggleClass('hover');
});
a { cursor: pointer; color: blue; }
a:hover,a.hover { text-decoration: underline; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a class="cancel-action">Cancel this action</a>

Blackboxed Backbone.js приклад

Для прикладу масштабованого, чорного кольору , компонента Backbone.js - див. Цей робочий приклад jsfiddle тут . Зверніть увагу, як ми використовуємо ненав'язливі практики JavaScript, і в невеликій кількості коду є компонент, який можна повторювати по всій сторінці кілька разів без побічних ефектів або конфліктів між різними екземплярами компонентів. Дивовижний!

Примітки

  • Якщо пропустити hrefатрибут aелемента, це призведе до недоступності елемента за допомогою tabнавігації по клавішах. Якщо ви бажаєте, щоб ці елементи були доступні за допомогою tabключа, ви можете встановити tabindexатрибут або використовувати buttonелементи замість цього. Ви можете легко стилювати елементи кнопок, щоб вони виглядали як звичайні посилання, як зазначено у відповіді Tracker1 .

  • Відмова hrefатрибуту на aелементі призведе до того, що Internet Explorer 6 та Internet Explorer 7 не перейматимуть на a:hoverстилістику, тому ми додали просту тривигу в JavaScript, щоб зробити це a.hoverзамість цього. Це цілком нормально, як якщо б у вас немає атрибуту href і немає витонченої деградації, тоді ваше посилання все одно не працюватиме - і у вас виникнуть більші проблеми.

  • Якщо ви хочете, щоб ваша дія все ще працювала з відключеним JavaScript, тоді використовуйте aелемент з hrefатрибутом, який спрямовується на якусь URL-адресу, яка буде виконувати дію вручну замість запиту Ajax або будь-якого іншого способу. Якщо ви робите це, то ви хочете переконатися, що ви робите під event.preventDefault()час дзвінка по клацанню, щоб переконатися, що після натискання кнопки вона не переходить за посиланням. Цей варіант називається витонченою деградацією.


163
Будьте уважні, залишаючи атрибути href вимкненими не для перехресних веб-переглядачів, і ви втратите на таких речах, як ефекти наведення курсора в Internet Explorer
Томас Девіс,

16
Будьте обережні: buttonзапропонований тут підхід, стильовий за допомогою зв’язку, зазнає неминучого "3d" активного стану в IE9 і нижче .
Бреннан Робертс

44
Я вважаю цю відповідь надмірно догматичною. Бувають випадки, коли ви просто хочете застосувати поведінку JS до 1 або 2 href. У цьому випадку зайве визначити додатковий CSS та ввести цілу функцію JS. У деяких випадках (наприклад, додавання вмісту за допомогою CMS) вам фактично заборонено вводити нові CSS або окремі JS, а вбудоване - це все, що ви можете зробити. Я не бачу, як вбудоване рішення є менш доступним на практиці для 1 або 2 простих JS href. Завжди будьте підозрілими у широких загальних твердженнях щодо поганої практики, включаючи цю :)
Джордан Рігер

17
З усіма тими "нотатками", які важко вирішити (налаштування табіндексу вимагає неприємностей на складній сторінці!). Набагато краще просто зробити javascript:void(0). Це прагматична відповідь і єдина розумна відповідь у реальному світі.
Абхі Беккерт

14
Якщо ви дбаєте про те, щоб зробити ваш веб-додаток доступним (і вам слід), простота і розумність аргументують href. Божевілля лежить у напрямку табіндексу.
jkade

328

'#'поверне користувача до верхньої частини сторінки, тому я зазвичай переходжу з ним void(0).

javascript:; також поводиться як javascript:void(0);


68
Спосіб уникнути цього - повернути помилку в обробник подій onclick.
Гуванте

34
Повернення помилки в обробнику подій не уникне цього, якщо JavaScript JS не запуститься успішно.
Квентін,

28
використання "#someNonExistantAnchorName" добре працює, тому що йому нікуди перескакувати.
scunliffe

21
Якщо у вас є базовий href, тоді #або перевезе #somethingвас до цього прив’язки на базовій href сторінці, а не на поточній сторінці.
Абхі Беккерт

11
Шебанг ( #!) робить трюк, але це, безумовно, погана практика.
Ніл

276

Я б чесно не запропонував жодного. Я б використав стилізовану <button></button>для такої поведінки.

button.link {
  display: inline-block;
  position: relative;
  background-color: transparent;
  cursor: pointer;
  border: 0;
  padding: 0;
  color: #00f;
  text-decoration: underline;
  font: inherit;
}
<p>A button that looks like a <button type="button" class="link">link</button>.</p>

Таким чином ви можете призначити свій onclick. Я також пропоную зв’язування через скрипт, не використовуючи onclickатрибут у тезі елемента. Єдиний готч - це текстовий ефект psuedo в старих ІЕ, які неможливо відключити.


Якщо ОБОВ'ЯЗКОВО використовувати елемент A, використовуйте його javascript:void(0);з причин, які вже були згадані.

  • Завжди перехоплюватиметься у випадку невдачі події onclick.
  • Не буде відбуватися помилкових викликів завантаження або викликати інші події на основі зміни хешу
  • Хеш-тег може спричинити несподівану поведінку, якщо клацання провалюється (викидання onclick), уникайте цього, якщо це не є відповідною поведінкою, що випадає, і ви хочете змінити історію навігації.

ПРИМІТКА. Ви можете замінити 0рядок таким, javascript:void('Delete record 123')який може слугувати додатковим індикатором, який показуватиме, що насправді буде робити клацання.


У IE8 / IE9 я не можу видалити 1px "3D" зміщення у кнопці: активний стан.
Бреннан Робертс

@BrennanRoberts Так, на жаль, будь-яка стилізація кнопок є більш проблематичною для IE ... Я все ще вважаю, що це, мабуть, найбільш підходящий підхід, не те, що я не порушую власні правила при нагоді.
Tracker1

Тоді не використовуйте, <button>а input type=buttonзамість цього?
Патрік Афферрангер

4
Потім використовуйте <clickable>елемент. Або <clickabletim>якщо ви віддаєте перевагу. На жаль, використання нестандартного тегу або звичайного діва може ускладнити користувачам клавіатури зосередження елемента.
joeytwiddle

28
Ця відповідь має бути зверху. Якщо у вас виникає ця дилема, швидше за все, ви справді потребуєте цього button. І IE9 швидко втрачає частку ринку, на щастя, і активний ефект 1px не повинен заважати нам використовувати семантичну розмітку. <a>це посилання, це покликане направити вас кудись для дій, які ми маємо <button>.
mjsarfatti

141

Перший, в ідеалі з реальним посиланням, на яке слід користуватися, якщо у користувача відключений JavaScript. Просто переконайтеся, що повернути помилку, щоб запобігти появі події клацання, якщо JavaScript виконується.

<a href="#" onclick="myJsFunc(); return false;">Link</a>

Якщо ви використовуєте Angular2, такий спосіб працює:

<a [routerLink]="" (click)="passTheSalt()">Click me</a>.

Дивіться тут https://stackoverflow.com/a/45465728/2803344


19
Тож у користувацьких агентах з увімкненим JavaScript і підтримуваною функцією ця функція запускає функцію JavaScript, повертаючись назад (для користувальницьких агентів, де JS не працює з будь-якої причини) на посилання вгору сторінки? Це рідко є розумним запасом.
Квентін,

21
"в ідеалі з реальним посиланням, на яке слід користуватися, якщо користувач відключив JavaScript", він повинен перейти на корисну сторінку не #, навіть якщо це просто пояснення, що для роботи сайту потрібен JS. що стосується невдачі, я би розраховував, що розробник перед тим, як розгорнути, використовувати належну функцію виявлення функцій браузера тощо.
Зак

Я б припустив (сподіваюся), що щось подібне було б лише для показу спливаючого вікна або чогось подібного простого. У цьому випадку за замовчуванням буде URL-адреса спливаючої сторінки. Якщо це частина веб-програми або вимкнення JS повністю порушить сторінку, то цей код має інші проблеми ...
Brian Moeskau

5
Мої веб-програми розроблені для того, щоб виграшно виграти, тому посилання все одно стане корисною сторінкою. Якщо ваш веб-додаток не є клієнтом для чату чи інтерактивним, це може спрацювати, якщо ви встигнете розробити дизайн з урахуванням деградації.
Зак

2
Проблема полягає в тому, що якщо myJsFunc видає помилку, вона не буде захоплена для помилки повернення.
Tracker1

106

Ні якщо ви запитаєте мене;

Якщо ваше "посилання" має єдину мету запускати якийсь код JavaScript, воно не кваліфікується як посилання; скоріше фрагмент тексту з функцією JavaScript, приєднаною до нього. Я рекомендую використовувати <span>тег із onclick handlerдоданим до нього та деяким базовим CSS, щоб імітувати посилання. Посилання створюються для навігації, і якщо ваш код JavaScript не призначений для навігації, він не повинен бути <a>тегом.

Приклад:

function callFunction() { console.log("function called"); }
.jsAction {
    cursor: pointer;
    color: #00f;
    text-decoration: underline;
}
<p>I want to call a JavaScript function <span class="jsAction" onclick="callFunction();">here</span>.</p>


126
Цей підхід обмежує "посилання" лише на операцію миші. Якір можна відвідати за допомогою клавіатури, і його подія "onclick" запускається при натисканні клавіші введення.
AnthonyWJones

40
Кольори жорсткого кодування у вашому CSS заважають браузеру використовувати користувальницькі кольори, які користувач може визначити, що може бути проблемою з доступністю.
Хосам Алі

30
<span>s не призначені робити нічого. <A>nchors і <buttons>для цього використовуються!
redShadow

22
Тут buttonsє кращим вибором, а використання span- ні.
apnerve

1
Я думаю, що проміжок кращий, ніж тег прив’язки. Яковий тег існує, щоб направити вас на його обов'язковий атрибут href. Якщо ви не збираєтеся використовувати href, не використовуйте якір. Він не обмежує посилання лише мишею, оскільки це не посилання. У ньому немає href. Це більше схоже на кнопку, але вона не публікується. Проміжок, який не призначений робити щось, абсолютно недійсний. Розгляньте спадне меню, яке активується при наведенні курсору. Ймовірно, це комбінація прольотів і дівок, що виконує функцію кнопки, яка розширює область на екрані.
NibblyPig

97

В ідеалі ви б це зробили:

<a href="javascriptlessDestination.html" onclick="myJSFunc(); return false;">Link text</a>

Або, що ще краще, ви матимете за замовчуванням посилання дії в HTML, і ви додасте подію onclick до елемента ненав’язливо через JavaScript після надання DOM, таким чином гарантуючи, що якщо JavaScript не присутній / не використовується, ви не будете мати непотрібні обробники подій, які позбавляють ваш код і потенційно можуть запаморочити (або принаймні відволікати на нього) ваш фактичний вміст.


76

Використання просто #робить кумедні рухи, тому я рекомендую використовувати, #selfякщо ви хочете заощадити на наборі зусиль JavaScript bla, bla,.


7
WOW, великі пальці вгору за цю пораду. Ніколи не знав, що ви можете використовувати #selfназвані теги та уникати прикрої поведінки браузера, що переходить на верхню сторінку сторінки. Дякую.
alonso.torres

34
Для довідки, #selfсхоже , це не є особливим. Будь-який ідентифікатор фрагмента, який не відповідає імені або ідентифікатору будь-якого елемента в документі (і не є порожнім або "вгорі"), повинен мати однаковий ефект.
cHao

1
Зазвичай я просто використовую придумане ім'я якоря, але, думаю, я почну робити це, щоб бути послідовним у своїй роботі.
Дуглас.Сезар

11
Я запропонував встановити #voidконвенцію в іншому коментарі, але насправді #selfвін такий короткий і простий для запам'ятовування. Все краще, ніж#
jakub.g

6
Але якщо ви натиснете на це посилання, користувачеві буде дивно бачити "#void" в URL-адресі, схоже на помилку чи помилку, те ж саме з #self або будь-яким іншим.
pmiranda

68

Я використовую наступне

<a href="javascript:;" onclick="myJsFunc();">Link</a>

замість цього

<a href="javascript:void(0);" onclick="myJsFunc();">Link</a>

2
Я використовую javascript:(без крапки з двокрапкою), тому що це виглядає акуратніше на панелі стану після наведення курсора.
Боан

4
Цей код може спричинити погані сюрпризи у старих IE. У якийсь момент він використовував для розбиття будь-яких анімаційних ефектів із зображеннями, включаючи перекидання та навіть анімовані gifs: groups.google.com/forum/#!topic/comp.lang.javascript/…
Ілля Стрельцин

Ви завжди можете це зробити ... javascript:void('Do foo')оскільки недійсність повернеться невизначеною незалежно, вона подасть користувачеві показник того, що буде зроблено клацання. Де Do fooможна бути Delete record Xабо що завгодно.
Tracker1

53

Я погоджуюся з пропозиціями в іншому місці, в яких зазначається, що слід використовувати звичайний URL в hrefатрибуті, а потім викликати якусь функцію JavaScript в onclick. Недолік полягає в тому, що вони автоматично додаються return falseпісля виклику.

Проблема такого підходу полягає в тому, що якщо функція не працюватиме або виникне якась проблема, посилання стане нерозбірливим. Подія Onclick завжди повернеться false, тому звичайна URL-адреса не буде викликана.

Є дуже просте рішення. Нехай функція повертається, trueякщо вона працює правильно. Потім використовуйте повернене значення, щоб визначити, чи слід скасувати клацання чи ні:

JavaScript

function doSomething() {
    alert( 'you clicked on the link' );
    return true;
}

HTML

<a href="path/to/some/url" onclick="return !doSomething();">link text</a>

Зауважте, що я заперечую результат doSomething()функції. Якщо він працює, він повернеться true, тому він буде заперечений ( false) і path/to/some/URLзаклик не буде викликаний. Якщо функція повернеться false(наприклад, браузер не підтримує те, що використовується у межах функції, або що-небудь інше піде не так), вона буде відхилена trueі path/to/some/URLвикликається.


50

#краще ніж javascript:anything, але наступне ще краще:

HTML:

<a href="/gracefully/degrading/url/with/same/functionality.ext" class="some-selector">For great justice</a>

JavaScript:

$(function() {
    $(".some-selector").click(myJsFunc);
});

Ви завжди повинні прагнути до витонченої деградації (у випадку, якщо у користувача не ввімкнено JavaScript ... і коли це стосується специфікацій та бюджету). Також вважається поганою формою використання атрибутів JavaScript та протоколу безпосередньо в HTML.


1
@Muhd: Повернення має активуватися clickза посиланнями…
Ry-

50

Я рекомендую <button>замість цього використовувати елемент, особливо якщо контроль повинен викликати зміну даних. (Щось на зразок пошти.)

Ще краще, якщо ви будете вводити елементи ненав’язливо, тип прогресивного вдосконалення. (Дивіться цей коментар .)


2
Я теж думаю, що це найкраще рішення. Якщо у вас є елемент, який призначений для виконання дії, немає причин для нього бути посиланням.
mateuscb

Якщо ви запитували, і ваш href виглядав би як "#something", деякі з інших перерахованих відповідей можуть послужити, але: Без href, що посилається на щось розумне, немає сенсу взагалі мати href або навіть посилання. Запропоноване використання кнопки може робити або використовувати будь-який інший елемент, окрім посилання вдячних ніде.
kontur

1
Ще однією перевагою цього є те, що Bootstrap .btnробить кнопки та посилання зовнішніми.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

З точки зору користувача, buttonтакож не вводить # в URL-адресу і не показує ahref як JavaScript:;
Coll

39

Якщо ви не виписуєте посилання за допомогою JavaScript (щоб ви знали, що він увімкнено у веб-переглядачі), в ідеалі вам слід надати належне посилання для людей, які переглядають JavaScript відключеним, а потім запобігти дії за посиланням за замовчуванням у вашому onclick обробник подій. Таким чином, ті, з увімкненим JavaScript, запускають цю функцію, а ті, у кого відключений JavaScript, перейдуть на відповідну сторінку (або місце розташування на одній сторінці), а не просто натискають на посилання і нічого не станеться.


36

Однозначно хеш ( #) краще, тому що в JavaScript це псевдосхема:

  1. забруднює історію
  2. створює нову копію двигуна
  3. працює в глобальному масштабі і не поважає систему подій.

Звичайно "#" з обробником onclick, який запобігає дії за замовчуванням, [набагато] краще. Більше того, посилання, що має єдину мету запустити JavaScript, насправді не є "посиланням", якщо ви не відправляєте користувача на якийсь розумний якор на сторінці (просто # буде відправлено вгору), коли щось піде не так. Ви можете просто імітувати зовнішній вигляд зв'язку із таблицею стилів і взагалі забути про href.

Крім того, щодо пропозиції cowgod, зокрема цього: ...href="javascript_required.html" onclick="...Це хороший підхід, але він не розрізняє сценарії "відключений JavaScript" та "onclick fails".


1
@Berker Yüceer, чому CW?
Безкоштовні консультації

30

Я зазвичай йду

<a href="javascript:;" onclick="yourFunction()">Link description</a>

Він коротший, ніж javascript: void (0) і робить те саме.


27

Я б використав:

<a href="#" onclick="myJsFunc();return false;">Link</a>

Причини:

  1. Це робить hrefпросто, пошукові системи цього потребують. Якщо ви використовуєте що-небудь інше (наприклад, рядок), це може спричинити 404 not foundпомилку.
  2. Коли миша наводить посилання, це не показує, що це сценарій.
  3. Використовуючи return false;сторінку, не перескакує на верхню частину і не порушує backкнопку.

я не згоден з "1." тому що він дає помилку, коли ви покладете ур-скрипт посилання, коли сценарії заборонені. тож такі посилання слід додавати з кодом js. таким чином люди можуть уникати цих посилань, поки сценарій не дозволений і взагалі не бачать помилок.
Berker Yüceer

25

Я вибираю використання javascript:void(0), оскільки використання цього може запобігти натискання правої кнопки миші, щоб відкрити меню вмісту. Алеjavascript:; коротше і робить те ж саме.


24

Отже, коли ви робите деякі <a />теги JavaScript з тегом, і якщо ви також ставите href="#", ви можете додати false false в кінці події (у випадку вбудованої прив'язки події), наприклад:

<a href="#" onclick="myJsFunc(); return false;">Run JavaScript Code</a>

Або ви можете змінити атрибут href за допомогою JavaScript, наприклад:

<a href="javascript://" onclick="myJsFunc();">Run JavaScript Code</a>

або

<a href="javascript:void(0)" onclick="myJsFunc();">Run JavaScript Code</a>

Але семантично всі перераховані вище способи досягти цього помилкові (хоча це добре працює) . Якщо будь-який елемент не створений для навігації по сторінці та має деякі елементи JavaScript, пов’язані з ним, то це не повинно бути <a>тегом.

Ви можете просто використовувати <button />натомість для того, щоб робити речі або будь-який інший елемент, наприклад, b, span або будь-який інший варіант, який відповідає вашим потребам, оскільки вам дозволяється додавати події на всі елементи.


Таким чином, є одна перевага для використання<a href="#"> . Ви отримуєте вказівник курсора за цим типовим елементом, коли це робите a href="#". З цього приводу я думаю, що ви можете використовувати CSS для подібного, cursor:pointer;що також вирішує цю проблему.

І врешті-решт, якщо ви пов'язуєте подію з самим кодом JavaScript, там ви можете зробити, event.preventDefault()щоб цього досягти, якщо ви використовуєте<a> тег, але якщо ви не використовуєте <a>тег для цього, ви отримуєте перевагу, ви не ' не потрібно це робити.

Тож, якщо бачите, краще не використовувати теги для подібних речей.


23

Не використовуйте посилання з єдиною метою запуску JavaScript.

Використання href = "#" прокручує сторінку доверху; використання void (0) створює навігаційні проблеми в браузері.

Замість цього використовуйте інший елемент, крім посилання:

<span onclick="myJsFunc()" class="funcActuator">myJsFunc</span>

І стилізуйте його за допомогою CSS:

.funcActuator { 
  cursor: default;
}

.funcActuator:hover { 
  color: #900;
}

13
Використовуйте кнопку, а не проміжок. Кнопки, природно, потрапляють у фокусний порядок, тому можна отримати доступ без миші / трекпада / тощо.
Квентін

4
Додаючи коментар тонни Квентіна: як написано в даний час, користувачі клавіатури не дотягнуться до spanелемента, тому що це елемент, що не фокусується. Ось чому вам потрібна кнопка.
Цундоку

1
Ви можете зробити його орієнтованим, додавши tabindex="0"до проміжку. Однак, використання кнопки краще, оскільки вона дає вам бажану функціональність безкоштовно. Щоб зробити його доступним за допомогою проміжного періоду, вам потрібно не лише приєднати обробник клацань, але й обробник подій клавіатури, який шукає натискання клавіші пробілу або клавішу введення, а потім запускає звичайний обробник клацань. Ви також хочете змінити другий селектор CSS .funcActuator:hover, .funcActuator:focusтак, щоб видно факт, що елемент має фокус.
Марний код

22

Було б краще використовувати jQuery,

$(document).ready(function() {
    $("a").css("cursor", "pointer");
});

і опустити і те, href="#"і href="javascript:void(0)".

Розмітка тегів прив’язки буде подібною

<a onclick="hello()">Hello</a>

Досить просто!


5
Це те, що я збирався сказати. Якщо у посиланні є резервна URL-адреса, яка має сенс, скористайтеся цим. В іншому випадку просто опустіть href або використовуйте щось більш семантично відповідне, ніж <a>. Якщо єдиною причиною, за якою всі виступають, включаючи href, є наведення пальця на наведення курсора, простий "a {cursor: pointer;}" зробить трюк.
Метт Кантор

12
Це дає жахливу доступність. Спробуйте в ТАК: ви не можете позначити публікацію без використання миші. Посилання "посилання" та "редагування" доступні за допомогою вкладки, але "прапор" - ні.
Nicolás

6
Я згоден з цим варіантом. Якщо якір не має іншого призначення, крім JavaScript, він не повинен мати href. @Fatih: Використання jQuery означає, що якщо JavaScript відключений, посилання НЕ буде вказувати.
Скотт Ріппей

3
Якщо ви збираєтеся йти цим маршрутом, чому б не зв’язати клік також за допомогою jQuery? Частина чудового використання jQuery - це можливість відокремити ваш JavaScript від розмітки.
Muhd

4
Я не можу повірити, що ця відповідь має 11 голосів. Це жахливо. Чому ви додаєте стиль через Javascript (та jQuery ??), а потім визначаєте свою дію onclick у HTML? Страшний.
МММ

20

Якщо ви використовуєте AngularJS , ви можете скористатись такими:

<a href="">Do some fancy JavaScript</a>

Який нічого не зробить.

На додачу

  • Це не відведе вас до верхньої частини сторінки, як при (#)
    • Тому вам не потрібно явно повертатись falseіз JavaScript
  • Це короткий лаконічний

6
Але це призведе до перезавантаження сторінки, і оскільки ми завжди використовуємо JavaScript для зміни сторінки, це неприпустимо.
Генрі Ху

@HenryHu Я зрозумів, що причина його не перезавантажувалася через AngularJS. Дивіться мою оновлену відповідь.
вихор

19

Якщо немає, hrefможливо, немає підстав використовувати тег прив’язки.

Ви можете додавати події (клацання, наведення курсора тощо) майже на кожен елемент, то чому б не просто використовувати a spanчи a div?

А для користувачів з вимкненим JavaScript: якщо немає резервного резерву (наприклад, альтернатива href), вони, принаймні, не можуть бачити та взаємодіяти з цим елементом взагалі, яким би він не був <a>або <span>тегом.


19

Зазвичай у вас завжди має бути зворотне посилання, щоб переконатися, що клієнти з відключеним JavaScript все ще мають певну функціональність. Ця концепція називається ненав’язливим JavaScript.

Приклад ... Скажімо, у вас є таке посилання на пошук:

<a href="search.php" id="searchLink">Search</a>

Ви завжди можете зробити наступне:

var link = document.getElementById('searchLink');

link.onclick = function() {
    try {
        // Do Stuff Here        
    } finally {
        return false;
    }
};

Таким чином, людей із відключеним JavaScript спрямовано, search.phpа ваші глядачі з JavaScript переглядають вашу розширену функціональність.


17

Я особисто використовую їх у поєднанні. Наприклад:

HTML

<a href="#">Link</a>

з трохи jQuery

$('a[href="#"]').attr('href','javascript:void(0);');

або

$('a[href="#"]').click(function(e) {
   e.preventDefault();
});

Але я використовую це лише для запобігання переходу сторінки до вершини, коли користувач натискає на порожній якір. Я рідко використовую OnClick та інші onподії безпосередньо в HTML.

Моєю пропозицією було б використовувати <span>елемент з classатрибутом замість якоря. Наприклад:

<span class="link">Link</span>

Потім призначте функцію .linkза допомогою сценарію, загорненого в тіло та безпосередньо перед </body>тегом або у зовнішньому документі JavaScript.

<script>
    (function($) {
        $('.link').click(function() {
            // do something
        });
    })(jQuery);
</script>

* Примітка. Для динамічно створених елементів використовуйте:

$('.link').on('click', function() {
    // do something
});

А для динамічно створених елементів, створених за допомогою динамічно створених елементів, використовуйте:

$(document).on('click','.link', function() {
    // do something
});

Тоді ви можете стилізувати прольотний елемент так, щоб він виглядав як якір з невеликим CSS:

.link {
    color: #0000ee;
    text-decoration: underline;
    cursor: pointer;
}
.link:active {
    color: red;
}

Ось приклад jsFiddle вищезгаданого.


16

Залежно від того, що ви хочете досягти, ви можете забути onclick і просто використовувати href:

<a href="javascript:myJsFunc()">Link Text</a>

Вона обходить необхідність повернення помилкових. Цей #варіант мені не подобається, тому що, як уже згадувалося, користувач перенесе верхню частину сторінки. Якщо ви маєте десь ще надіслати користувача, якщо він не має JavaScript (що рідко, де я працюю, але дуже хороша ідея), запропонований метод Стіва чудово працює.

<a href="javascriptlessDestination.html" onclick="myJSFunc(); return false;">Link text</a>

Нарешті, ви можете використовувати, javascript:void(0)якщо ви не хочете, щоб хто-небудь ходив куди-небудь і якщо ви не хочете викликати функцію JavaScript. Це чудово працює, якщо у вас є зображення, з яким ви хочете, щоб відбулася подія перемикання миші, але користувач не може нічого натиснути на нього.


3
Єдиним недоліком цього (з пам’яті, я можу помилятися) є те, що IE не вважає A A, якщо у вас немає href всередині нього. (Тож правила CSS не працюватимуть)
Бенжол,

16

Коли у мене є кілька штучних посилань, я вважаю за краще надати їм клас «без зв’язку».

Потім у jQuery я додаю такий код:

$(function(){
   $('.no-link').click(function(e){
       e.preventDefault();
   });
});

А для HTML посилання просто

<a href="/" class="no-link">Faux-Link</a>

Мені не подобається використовувати Hash-Tags, якщо вони не використовуються для якорів, і я роблю вищезазначене лише тоді, коли у мене більше двох штучних посилань, інакше я переходжу з javascript: void (0).

<a href="javascript:void(0)" class="no-link">Faux-Link</a>

Як правило, мені подобається взагалі уникати використання посилань і просто загортати щось в проміжок часу і використовувати це як спосіб активувати якийсь код JavaScript, як спливаюче вікно чи розкриття вмісту.


16

Я вважаю, ви представляєте помилкову дихотомію. Це не єдині два варіанти.

Я погоджуюся з паном D4V360, який припустив, що, хоч ви і використовуєте тег прив’язки, у вас тут справді немає якоря. Все, що у вас є, - це спеціальний розділ документа, який повинен вести себе трохи інакше. <span>Тег є набагато більш підходящим.


Крім того, якщо ви замінили на aa span, вам потрібно пам'ятати, щоб зробити його фокусируемим за допомогою клавіатури.
AndFisher

16

Я спробував обидва в Google Chrome з інструментами для розробників, і це id="#"зайняло 0,32 секунди. Тоді як javascript:void(0)метод зайняв лише 0,18 секунди. Тож у Google chrome javascript:void(0)працює краще та швидше.


Насправді вони не роблять те ж саме. # змушує перейти на верхню частину сторінки.
Йохен Шульц

13

Я в основному перефразую з цієї практичної статті, використовуючи прогресивне вдосконалення . Коротка відповідь полягає в тому, що ви ніколи не використовуєте javascript:void(0);або, #якщо ваш користувальницький інтерфейс вже не зробив висновок, що JavaScript увімкнено, в такому випадку ви повинні використовуватиjavascript:void(0); . Крім того, не використовуйте проліт як посилання, оскільки це семантично помилково для початку.

Використання зручних для SEO маршрутів у вашій програмі, таких як / Головна / Дія / Параметри - також є хорошою практикою. Якщо у вас є посилання на сторінку, яка спочатку працює без JavaScript, ви можете покращити цю роботу після цього. Використовуйте реальне посилання на робочу сторінку, а потім додайте подію onlick для покращення презентації.

Ось зразок. Головна / ChangePicture - це робоче посилання на форму на сторінці, доповнену користувальницьким інтерфейсом та стандартними кнопками подання HTML, але виглядає приємніше, вводячись у модальний діалог із кнопками jQueryUI. Будь-який спосіб працює, залежно від браузера, який задовольняє мобільну розробку.

<p><a href="Home/ChangePicture" onclick="return ChangePicture_onClick();" title="Change Picture">Change Picture</a></p>

<script type="text/javascript">
    function ChangePicture_onClick() {
        $.get('Home/ChangePicture',
              function (htmlResult) {
                  $("#ModalViewDiv").remove(); //Prevent duplicate dialogs
                  $("#modalContainer").append(htmlResult);
                  $("#ModalViewDiv").dialog({
                      width: 400,
                      modal: true,
                      buttons: {
                          "Upload": function () {
                              if(!ValidateUpload()) return false;
                              $("#ModalViewDiv").find("form").submit();
                          },
                          Cancel: function () { $(this).dialog("close"); }
                      },
                      close: function () { }
                  });
              }
        );
        return false;
    }
</script>

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