Как не использовать a(href="#")

Решил разобраться чем заменить HTML тэг a при верстке контролов, которые программируются яваскриптом.

Тесты всех вариантов, описанных ниже: jsfiddle.net/VovanR/omt6am8z/

Рассмотрим что можно использовать, а от чего лучше отказаться:

Для обеспечения перехода к странице по ссылке, если отключен JavaScript.

Пример №1: ссылка авторизации a(href="/login/") — открывает форму авторизации, а если JavaScript отключен, то осуществляет переходит на страницу авторизации.

Пример №2: ссылка a(href="#anchor-page-header") — анимация скроллинга к началу страницы. Без JavaScript происходит перемещение к началу страницы, если шапке сайта задан id="anchor-page-header" или там создан якорь a(name="anchor-page-header").

a(href="#")

Не использовать.

a(href="javascript:void(0)")

Использовать только для букмарклетов.

Например букмарклет для перехода на главную страницу:

<a href="javascript:window.location.href=window.location.protocol+'//'+window.location.host;void(0);" title="На главную">Index</a>

Index

a(href="") или a(href)

Не использовать.

a

Не использовать.

Равносильно span.

span

Использовать, если не нужна навигация клавишей Tab или с помощью плагина VimFx.

span(tabindex="0")

Использовать.

button(type="button")

Использовать.

Таблица возможностей

a(href="link_anywhere")
a(href="#")
a(href="javascript:void(0)")
a(href="") и a(href)
a
span
span(tabindex="0")
button(type="button")
Не нужет preventDefault
Навигация по Tab
Вызов по Enter
Вызов по Space
При отключенном JavaScript - - - - - - -
Нет URL при наведении

Дополнительные материалы: