views:

921

answers:

4

window.location.hash

When using a link for a javascript action, I usually do something like this:

<a href="#">Link Text</a>

That way, when someone clicks the link before the page loads nothing terrible happens.

Html Base Tag

On my current project I use this same construct, but with a base tag:

<html>
<head>
    <base href="http://example.com/" />
</head>
<body>
    <a href="#">Link Text</a>
</body>
</html>

However, if the page url is:

http://example.com/dir/page

clicking the link navigates to

http://example.com/#

rather than

http://example.com/dir/page#

How can I fix this?

+2  A: 

Either remove your base tag or change your href attributes to be fully qualified. What you are observing is the intended behavior when you mix base with a elements.

Ken Browning
+1 Brad, you're trying to work around a problem that doesn't need to exist. Do you really need to use the base tag?
sanchothefat
A: 

Return false on the onclick event to disable the link:

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

(This is just an example of how you’d do it inline. But try to avoid inline declarations and use techniques of progressive enhancements.)

Gumbo
OP specified "That way, when someone clicks the link before the page loads nothing terrible happens" which suggests the onclick handler hasn't been attached yet. Inline javascript is ugly and should be avoided
Gareth
After your edit, it's progressive enhancement which is *causing* this problem. The problem is the user is clicking the "link" *before* the extra click handlers have been added. In that case, there's no way to avoid link navigation. The solution is to make it *not* a link
Gareth
Or, of course, make it a link which has an equivalent non-javascript action. Depending on what the action is, that's probably the best solution anyway
Gareth
+1  A: 

If there's no URL that is suitable for a non-javascript user, then don't use an <a>. <a> tags are for links to other pages.

Any visible HTML element can have an onclick and won't have this problem you describe.

Gareth
I second this motion. Use a <span> or something that isn't an <a> if it doesn't actually go anywhere.
Zack Mulgrew
This has negative implications for keyboard users though: now you can't focus the element. There is an argument for using <button>/<input type="button"> here.
bobince
A: 

If you're inclined to use an a tag another solution is to not use # as the href target (when you don't specify one it causes a jump to the top of the page which I find undesirable). What you can do is:

<a href="javascript:">Some Link that Goes nowhere</a>

Really though, unless you are doing something that requires that to be an a tag a span would be your best bet:

CSS:

.generic_link {
  text-decoration:underline;
}
.generic_link:hover {
  text-decoration:none;
}

HTML:

<span class="generic_link">Something that really isn't a link</span>
Adam
See Gumbo's comment, returning false from a click handler stops the link being followed. javascript: URLs are generally best avoided.
bobince