Чи безпечний тег прив’язки без атрибута href?


232

Чи добре використовувати тег прив’язки, не включаючи hrefатрибут, а замість цього використовувати обробник подій JavaScript натисканням? Тож я б пропустив hrefповністю, навіть не пустуючи ( href="").


1
Хоча подія onclick все ще спрацьовує? Я хочу використовувати теги прив’язки замість span / div, тому що це єдиний розумний тег, який підтримує CSS: наведіть курсор на IE
Джон

3
@Martin ANCHORS можна отримати доступ та активувати за допомогою клавіатури. Регулярні елементи SPAN не можуть. Дивіться тут: jsfiddle.net/simevidas/4DTxv/2
Šime


2
У HTML5 якоря без атрибута href є гіперпосиланнями заповнювачів: dev.w3.org/html5/markup/a.html
Ігнасіо Лаго

1
Ви впевнені, що замість цього не хочете кнопки? Це означає, що вкладка тощо працює, і ви можете стилізувати свої кнопки так, щоб вони були схожими на посилання. Правда, я не знаю про коливання в IE.
robbie_c

Відповіді:


217

У HTML5 правильне використання aелемента без hrefатрибута. Він вважається "гіперпосиланням на заповнення місця".

Приклад:

<a>previous</a>

Шукайте "гіперпосилання заповнювача" на довідковій сторінці тегів прив’язки w3c: https://www.w3.org/TR/2016/REC-html51-20161101/textlevel-semantics.html#the-a-element .

І це також згадується у вікі тут: https://www.w3.org/wiki/Elements/a

Посилання на заповнення заповнення - це для випадків, коли ви хочете використовувати якірний елемент, але не маєте його пересуватися кудись. Це стане в нагоді для розмітки поточної сторінки в навігаційному меню або стежці. (Старим підходом було б використовувати тег span або тег прив’язки з класом, який називається "active", або "current" для його стилю та JavaScript для скасування навігації.)

Посилання на заповнювач місця також корисна у випадках, коли ви хочете динамічно встановити призначення посилання через JavaScript під час виконання. Ви просто встановите значення атрибута href, і тег прив’язки стає доступним для натискання.

Дивитися також:


3
Яке визначення поняття "заповнення заповнювача"?
Gyum Fox

14
Прийміть до відома , що без стилю не буде автоматично додаватися до елементу. hrefcursor: pointer
Лука

38

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

http://webdesignfan.com/yslow-tutorial-part-2-of-3-reducing-server-calls/

Моя порада - використовувати <a href="#"> </a>

Якщо ви використовуєте JQuery, не забудьте також використовувати:

.click(function(event){
    event.preventDefault();
    // Click code here...
});

7
Я не можу використовувати href = "#", тому що я використовую закладку Ajax, що передбачає зміну хешу, що я можу зробити?
Джон

5
Замість використання javascript: void (0); всередині href я використовую javascript:; коротше писати.
Аллі

16
Штраф за ефективність застосовується лише в тому випадку, якщо ви фактично вказали порожній атрибут href. Питання стверджує, що атрибута href взагалі немає.
Піт Б

18
Насправді, згідно зі статтею (і це має сенс), потенційне покарання ефективності застосовується лише до порожніх атрибутів src . Це нічого не говорить про продуктивність про порожні атрибути href.
bergie3000

1
Привіт @Gunnar, посилань, схоже, зараз немає. Чи є у вас інша довідка щодо претензії?
user31782

25

Коротка відповідь: Ні.

Довга відповідь:

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

Друге. У вас повинна бути альтернатива, коли JavaScript не запускається (оскільки повільно завантажувався з сервера, перервано інтернет-з'єднання (наприклад, мобільний сигнал у рухомому поїзді), JS вимкнено, тощо, тощо).

Скористатися прогресивного поліпшення з допомогою ненав'язливих JS.


Проблема полягає в тому, що я хочу щось, до чого можу приєднати подію клацання методом jQuery "click", який також підкреслюється та підкреслюється як посилання, коли миша перекидає його. Що ще, окрім тега якоря без якоря, може досягти цього без CSS? (тобто як-це без додавання вручну базової взаємодії, зберігаючи простоту призначення прямого клацання через jQuery).
Трайнко

@Triynko - використовуй посилання, але роби це правильно. Дивіться останній рядок відповіді.
Квентін

5
Tabindex для тегів "a" діє з HTML4 (принаймні) w3schools.com/tags/att_global_tabindex.asp
technoTarek

@technoTarek - Так, але це hrefбуло обов'язково (якщо тільки це не названий якор, в такому випадку tabindex не мав сенсу). Використання tabindexдля додавання нефокусованих елементів до порядку вкладки - це нова інновація в HTML 5.
Квентін

4
Це просто неправильно. Якщо ви посилалися на старішу специфікацію HTML у той час, я не можу сказати, але згідно з специфікацією HTML5, справді цілком справедливо мати aтег без hrefатрибута.
Майкл

23

Якщо вам доведеться використовувати href для зворотної сумісності, ви також можете використовувати

<a href="javascript:void(0)">link</a>

замість #, якщо ви не хочете використовувати атрибут


1
Мені потрібен тег <a>, який поводився як посилання у всіх, крім функції. Це зробило для мене трюк.
Jad S

13

Тег прекрасно використовувати без атрибута href. Всупереч багатьом відповідям тут є фактично стандартні причини створення якоря, коли немає href. Семантично "а" означає якір або ланку. Якщо ви використовуєте його для чогось, що слідує за цим значенням, то у вас все добре.

Одне стандартне використання тегу без href - це створення поіменних посилань. Це дозволяє використовувати якір з ім'ям = blah, а згодом ви можете створити прив’язку з href = # blah для посилання на названий розділ поточної сторінки. Однак це застаріло, оскільки ви також можете використовувати ідентифікатори таким же чином. Як приклад, ви можете використовувати тег заголовка з id = заголовок, а пізніше ви можете мати якір, що вказує на href = # заголовок.

Моя думка, однак, не в тому, щоб пропонувати використовувати властивість імені. Лише надати один випадок використання, коли вам не потрібен href, а тому міркування, чому він не потрібен.


2
Я думаю, що питання намагалося задати і на що відповідають інші відповіді, чи безпечно опускати hrefатрибут для <a>елемента , який використовується як інтерактивний елемент (тобто посилання). Як ви зазначаєте, без hrefатрибуту це просто просто ... не посилання, а лише якір, що зовсім інша річ.
BoltClock

1
Так, але - лише підкреслимо - тег <a> все ще діє в цих випадках використання.
монокром

9

З точки зору доступності <a>без href не вдається вкладки, всі посилання повинні бути в змозі вкладки, тому додайте tabindex = '0 ", якщо у вас немає href.


1
Або скористайтеся кнопкою, якщо вона буде виконувати вбудовану дію на сторінці замість перенаправлення.
SimonDever

8

<a>Тег без «HREF» може бути зручно при використанні меню багаторівневого і вам потрібно розширити на наступний рівень , але не хочете , щоб ярлик меню , щоб бути активною ланкою. У мене жодного разу не виникало жодних проблем із його використанням.


1
Ви намагалися отримати доступ до цього меню за допомогою клавіатури?
аїй

Щойно я дізнався, що в IE, якщо ви наведіть курсор на деякі посилання, і один з них є якірним без href, невелике спливаюче вікно з URL-адресою внизу залишається там, показуючи попередній URL, а не зникаючи. Якір хоч і не можна натискати, тому це не велика проблема, але мені достатньо, щоб замість нього поїхати з дівом.
Андрій

1

У деяких браузерах ви зіткнетеся з проблемами, якщо вам не нададуть атрибут href. Я пропоную вам написати свій код приблизно так:

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

ви можете замінити код () на власну функцію чи логіку, але пам’ятайте, що потрібно вказати false false; заява в кінці.


Я використовую Backbone.js з Backbone.Router і маю #для сторінки покажчика. Для деяких моїх посилань на навигації я не хочу запускати маршрут, до #якого трапляється, якщо ви використовуєте a href="#"його сам. Використання <a href="#" onclick="return false;"зупиняє спрацьовування маршруту, але подія натискання все ще переходить на мій обробник (який використовує події DOM, підключені через jQuery та Backbone.Radio). Дякую @ shashwat13 :)
Девід Вільямсон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.