Чи дійсно використовувати <a> (тег прив’язки) без атрибута href?


152

Я використовую Twitter Bootstrap для створення сайту, і багато його функціональності залежить від обгортання речей <a>, навіть якщо вони просто збираються виконувати Javascript. У мене виникли проблеми з href="#"тактикою, яку рекомендує документація Bootstrap, тому я намагався знайти інше рішення.

Але потім я спробував просто видалити hrefатрибут. Я використовував <a class='bunch of classes' data-whatever='data'>і маю JavaScript обробляти решту. І це працює.

І все-таки щось мені говорить, я не повинен цього робити. Правильно? Тобто, технічно <a>це повинно бути посиланням на щось, але я не зовсім впевнений, чому це проблема. Або це?


Відповіді:


245

Елемент <a>nchor - це просто прив'язка до або від деякого вмісту. Спочатку специфікація HTML дозволена для названих anchors ( <a name="foo">) та пов'язаних якорів (<a href="#foo"> ).

Названий формат якоря використовується рідше, оскільки ідентифікатор фрагмента тепер використовується для визначення [id]атрибуту (хоча для зворотної сумісності ви все ще можете вказати [name]атрибути). Елемент без атрибута залишається в силі .<a>[href]

Що стосується семантики та стилю, то <a>елемент не є посиланням ( :link), якщо він не має [href]атрибута. Побічним ефектом цього є те, що <a>елемент [href]за замовчуванням не буде в порядку вкладки.

Справжнє питання полягає в тому, чи <a>єдиний елемент є відповідним представленням а <button>. На семантичному рівні існує чітка різниця між a linkі a button.

Кнопка - це те, що при натисканні викликає дію.

Посилання - це кнопка, яка викликає зміну навігації в поточному документі. Навігація, що виникає, може бути переміщенням у документі у випадку ідентифікаторів фрагмента ( #foo) або переміщенням до нового документа у разі URL-адрес ( /bar).

Оскільки посилання є спеціальним типом кнопок, вони часто перекривали свої дії для виконання альтернативних функцій. Продовжувати використання якоря як кнопки все нормально з точки зору консистенції, хоча семантично це не зовсім точно.

Якщо ви стурбовані семантикою та доступністю використання <a>елемента (або <span>або <div>) як кнопки, вам слід додати такі атрибути:

<a role="button" tabindex="0" ...>...</a>

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

Для <span>та <div>елементів ви можете додати слухачів ключа JavaScript для Spaceабо Enterвикликати clickподію. <a href>і <button>елементи роблять це за замовчуванням, але елементи, які не мають кнопок, не роблять. Іноді має більше сенсу прив’язувати clickтригер до іншої клавіші. Наприклад, може бути пов'язана кнопка "довідка" у веб-додатку F1.


1
@Zacqary, [role="button"]не робить нічого конкретного, вам все одно потрібно слухати події клацання (але ви все одно зробите це, щоб зробити кнопку JS). Він призначений для використання для допоміжної навігації (він же читачів екрана), щоб читач екрану знав представляти елемент як кнопку, а не його початкове семантичне значення. Додавання [tabindex]додає елемент до порядку вкладки. За особливих обставин ви, можливо, не хочете / потребуєте кнопки, яку можна переміщувати в порядку вкладки, тому це необов'язковий атрибут. Елементи, які вже є кнопками, не потрібні, [role="button"]оскільки це зайве.
zzzzBov

Чи дійсно HTML, щоб мати тег прив’язки без href та без імені? У нашому додатку є декілька посилань на видалення, які відключені (отже, атрибут href), але все ж відображаються користувачеві.
Джошуа Мухайм

1
@JoshuaMuheim, сподіваюся, ви не заперечуєте, але я розмістив ваше запитання як окреме окреме питання .
zzzzBov

Просто хотілося додати зауваження, що якщо ви використовуєте це для створення "кнопок" для дій Javascript ... видалення атрибута href повністю також призведе до того, що Chrome (і, ймовірно, інші браузери) припинять зміна курсору при наведенні курсору миші. Очевидно, що це легко додавати за допомогою CSS - але лише головою.
Мир

@Mir, якщо ви не збираєтесь використовувати [href], ви, ймовірно, повинні використовувати <span>кнопку для.
zzzzBov

45

Я думаю, ви можете знайти свою відповідь тут: Чи безпечний тег прив’язки без атрибуту href?

Крім того, якщо ви не хочете працювати з href без зв’язку, ви можете використовувати його так:

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

3
javascript:undefined
Справді

2
@ rybo111 ти маєш рацію, але я все ж віддаю перевагу void (0); в основному тому, що це виглядає краще. Мені не подобається, що мої клієнти бачать речі як "невизначені" ;-)
Олексій

9
<a href="javascript:;">text</a>?
діневала

javascript:;використовується для розбиття таких речей, як ефекти перекидання і навіть gif-анімації в IE6. І для жодних операцій з посиланням немає виділених HTML елементів button. У той же час, такі речі, як AJAX посилання, можуть використовувати їх hrefs для резервних дій, якщо JS не працює.
Ілля Стрельцин

14

Так, правильно використовувати тег прив’язки без hrefатрибута.

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

Так, ви можете використовувати classі інші атрибути, але ви не можете використовувати target, download, rel, hreflang, іtype .

target, download, rel, hreflang, І typeатрибути повинні бути опущені , якщо атрибут HREF немає.

Щодо частини " Чи повинен я? ", Дивіться перше цитування: " там, де в іншому випадку посилання могло б бути розміщено, якби воно було доречним ". Тож я б запитав " Якби у мене не був JavaScript, чи використовував би я цей тег як посилання? ". Якщо відповідь "так", то так, ви повинні використовувати <a>без href. Якщо ні, то я б все одно користувався нею, адже продуктивність для мене важливіша, ніж краща семантика, але це лише моя особиста думка.

Крім того, слід стежити за різною поведінкою та стилем (наприклад, немає підкреслення, немає курсору, не a :link).

Джерело: Рекомендація W3C HTML5


Йдеться не стільки про "семантику
кращих

3

Це дійсно. Наприклад, ви можете використовувати його для показу модалів (або подібних речей, які відповідають на data-toggleтаdata-target атрибути).

Щось на зразок:

<a role="button" data-toggle="modal" data-target=".bs-example-modal-sm" aria-hidden="true"><i class="fa fa-phone"></i></a>

Тут я використовую чудовий значок шрифту, який краще як aтег, а не як button, щоб показати модальний. Крім того, встановлення role="button"змінює вказівник на тип дії. Без будь-якого hrefабо role="button"вказівник курсору не змінюється.


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