My web application uses a lot of <a href="#">Perform client script action</a>
anchor links which are used for scripting (a habit I picked-up from my days as a Dreamweaver user well over 10 years ago) and now I'm beginning to question if this is necessary.
I don't actually know why <a href="#">
is used in the first place - my guess is the presence of the href
attribute causes browsers to apply the :link
and :visited
psuedo-classes which simplifies stylesheets. It also makes the browser implicitly apply the cursor: pointer
property which may be desirable.
I use jQuery (after a brief stint with MooTools) and the links work just as well without the href="#"
attribute and value, so should I just remove the attribute entirely and modify my stylesheet to compensate for the removal of the :link
psuedo-class? Is there anything else I might be missing, any kind of semi-documented voodoo that the href attribute imbues the anchor element?
Using the "#" character as a placeholder basically makes the link "active." The browser interprets it as a tag that points to something else. If href is empty, the browser will assume the a tag is just another tag.
The tag is fine to use without an href attribute. Contrary to many of the answers here, there are actually standard reasons for creating an anchor when there is no href. Semantically, "a" means an anchor or a link. If you use it for anything following that meaning, then you are fine.
Empty HREF links basically mean re-navigate the current page. It's like a Refresh operation which resubmits to the server.
In HTML5, using an a anchor element without an href attribute is valid. It is considered to be a “placeholder hyperlink.” You can use class and other attributes, but you can not use target, download, rel, hreflang, and type.
<a>
stands for anchorIf you include the [href]
attribute on an <a>
element, it is an anchor that points to a location, which means that you could go to a new page, a particular fragment of the current page (hence the #
being called the fragment identifier), or a particular fragment of a new page.
<a>
elements without an [href]
attribute were historically assigned a [name]
attribute, which could be used as the destination of the fragment identifier. Browsers later added support for linking to any item's [id]
attribute, and this is now the preferred method for linking to a document fragment.
<a>
elements?An a[href]
element is a link (which is why they are matched with :link
in css). links are clickable. An a
element without the [href]
attribute is otherwise just a placeholder for where a link might otherwise have been placed, and not clickable, nor are they in the tabbing order of the page.
If you want your links to be keyboard navigable which is important for accessibility (WAI-ARIA), you'll need to do one of the following:
<button type="button">
[href]
attribute[tabindex="0"]
and one of [role="button"]
or [role="link"]
(and possibly some styling)More information about the [role]
attribute can be found in the Roles Model section of the WAI-ARIA docs.
If you don't have a reason to keep the [href]
attribute, you might as well be using a <button>
element:
<button type="button"> ^^^^^^^^^^^^^
The [type]
attribute is used to make the element a generic button, otherwise <button>
will default to [type="submit"]
, which may not be desirable as it could trigger form submission.
If you can't use a <button>
(usually occurs when the inner markup must contain a <div>
) you can fake a <button>
using:
<div role="button" tabindex="0">Some clickable text</div>
You'll need to listen for keypress
events and trigger click
events for Enter and Space.
If you're keeping the <a>
element and its [href]
attribute, there are a number of options for its value.
E.x.
<a href="/some/location/for/users/without/js">
<a href="#document-fragment">
If you need to provide support for users with JS disabled, you might as well direct them to a page that performs equivalent functionality without JS.
By extension, this also includes providing document fragment links to link to the content within the same document. For example, a toggleable region may be marked up as:
<a href="#more" class="toggleable">Read More</a> <div id="more">Lorem ipsum dolor sit amet</div>
So that with JS the region can be collapsed and expanded, and without JS the link will take the user to the appropriate content on the page.
E.x.
<a href="#">
<a href="javascript:void(0)">
<a href="about:blank">
If you're preventing the default behavior behind-the-scenes in JavaScript, and you're not supporting users with JS disabled, you can use a "dud" href value to keep the link in the tabbing order and automatically enable Enter to trigger the click
event. You should add [role="button"]
as semantically the <a>
tag is no longer being used as a link, but as a button.
<a href="#" role="button">Some clickable text</a>
Personally I prefer to use href="javascript:void(null);"
, to give the browser an href that won't mess up any other use of hashes.
The only difference I've noticed about href-less links is that the browser will not underline them by default, so just add that style in and you should be good.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With