HTML Anchors with 'name' or 'id'?
You shouldn’t use
<h1><a name="foo"/>Foo Title</h1> in any flavor of HTML served as
text/html, because the XML empty element syntax isn’t supported in
<h1><a name="foo">Foo Title</a></h1> is OK in HTML4. It is not valid in HTML5 as currently drafted.
<h1 id="foo">Foo Title</h1> is OK in both HTML4 and HTML5. This won’t work in Netscape 4, but you’ll probably use a dozen other features that don’t work in Netscape 4.
When one wants to refer to some part of a webpage with the "
http://example.com/#foo" method, should one use
<h1><a name="foo"/>Foo Title</h1>
<h1 id="foo">Foo Title</h1>
They both work, but are they equal, or do they have semantic differences?
Wikipedia makes heavy use of this feature like this:
<a href="#History">[...]</a> <span class="mw-headline" id="History">History</span>
And Wikipedia is working for everybody, so I would feel safe sticking with this form.
Also don't forget, you can use this not only with spans but with divs or even table cells, and then you have access to the :target pseudo-class on the element. Just watch out not to change the width, like with bold text, cause that moves content around, which is disturbing.
Named anchors - my vote is to avoid:
- "Names and ids are in the same namespace..." - Two attributes with the same namespace is just crazy. Let's just say deprecated already.
- "Anchors elements without href atribute" - Yet again, the nature of an element (hyperlink or not) is defined by having an atribute?! Double crazy. Common sense says to avoid it altogether.
- If you ever style an anchor without a pseudo-class, the styling applies to each. In CSS3 you can get around this with attribute selectors (or same styling for each pseudoclass), but still it's a workaround. This usually doesn't come up because you choose colors per pseudo-class, and the underline being present by default it only makes sense to remove, which makes it the same as other text. But you ever decide to make your links bold, it'll cause trouble.
- Netscape 4 might not support the id feature, but still an unknown attribute won't cause any trouble. That's what called compatibility for me.
Just an observation about the markup The markup form in prior versions of HTML provided an anchor point. The markup forms in HTML5 using the id attribute, while mostly equivalent, require an element to identify, almost all of which are normally expected to contain content.
An empty span or div could be used, for instance, but this usage looks and smells degenerate.
One thought is to use the wbr element for this purpose. The wbr has an empty content model and simply declares that a line break is possible; this is still a slightly gratuitous use of a markup tag, but much less so than gratuitous document divisions or empty text spans.
How about using name attribute for old browsers and id attribute to the new browsers. Both options will be used and fallback method will be implemented by default!!!
<h1 id="foo">Foo Title</h1>
Just created the JS global:
The value of
window.foo will be the
HTMLElement for the
Unless you can guarantee all values used in
id attributes are safe, you may prefer sticking to
<h1 name="foo">Foo Title</h1>
ID method will not work on older browsers, anchor name method will be deprecated in newer HTML versions... I'd go with id.
As in the comments, you could always use both to hedge your bets.