5.10 Defining Browser- or Feature-Specific Links

NN 2, IE 3

5.10.1 Problem

You want a link to navigate to different destinations based on browser or object model feature support.

5.10.2 Solution

A link can have multiple destinations, usually with one URL hardwired to the href attribute of the <a> tag, and scripted URLs invoked from the <a> element's onclick event handler. The latter must cancel the default behavior of the href attribute.

In the following example, the scripted navigation goes to one of two destinations: one for Windows Internet Explorer users and one for all other users who are using browsers capable of referencing elements via the W3C DOM document.getElementById( ) syntax. For all other browsers, the hardwired URL is the destination:

function linkTo(ieWinUrl, w3Url) {
    var isWin = (navigator.userAgent.indexOf("Win") != -1);
    // invoke function from Recipe 5.3
    var isIE5Min = getIEVersionNumber( ) >= 5;
    var isW3 = (document.getElementById) ? true : false;
    if (isWin && isIE5Min) {
        location.href = ieWinUrl;
        return false;
    } else if (isW3) {
        location.href = w3Url;
        return false;
    return true
<a href="std/newProds.html" title="To New Products" 
onclick="return linkTo('ieWin/newProds.html', 'w3/newProds.html')">New Products</a>

When the scripted navigation succeeds, the function returns a value of false, which forces the onclick event handler to evaluate to return false. This automatically cancels the default behavior of the <a> tag. But if the browser is scriptable and not in either of the desired categories, the onclick event handler evaluates to return true, allowing the default navigation action of the <a> tag to prevail.

5.10.3 Discussion

For a public web site that you hope will be indexed by search engine spiders and "bots," make sure that every <a> tag has a default destination assigned to its href attribute, even if you expect most of your visitors' browsers to follow the scripted path. Most automated services don't interpret JavaScript, but avidly follow href links.

Another consideration when scripting links is that the URL assigned to the href property is the one that appears in the status bar whenever the user rolls the cursor atop the link. There are many user interface design philosophies about what should appear in the status bar. Inexperienced users may be flummoxed by all the slashes and filename weirdness that appears there; experienced users may prefer to see the path of the destination to see if the link will be taking them where they anticipate going.

You have the option, via onmouseover and onmouseout event handlers of the link, to assign customized strings to the status bar to override the default behavior. In the previous example, you could have the link display a message such as "See our latest new products...". This might be okay for the parallel structure hinted at by the example (all links go to new products pages). Experienced users, however, may still prefer to see a real URL. You could even go to the extreme of devising onmouseover and onmouseout event handlers that pass parameters just like the linkTo( ) function to display browser-specific URLs.

One last suggestion, which may be useful in many situations, is to use the location.replace( ) method, rather than assigning a URL to the location.href property. In the previous example, the statement:

location.href = ieWinUrl;

can be changed to:


The replace( ) method instructs the browser to overwrite the browser's navigation history so that the new page takes the place of the current page. Once at the new page, a click of the Back button does not return the user to the page that had the link in it. You will have to judge from user testing of your site whether this technique is applicable.

5.10.4 See Also

Recipe 10.2 to keep the current page out of the browser's history list; Recipe 10.6 for using URLs to pass data from document to document.