views:

1349

answers:

8

AFAIK, you never need to specify the protocol in an onclick:

onclick="javascript:myFunction()" = bad

onclick="myFunction()" = good

Today I noticed in this article on Google Anallytics that they are using it:

<a href="http://www.example.com" onClick="javascript: pageTracker._trackPageview('/outgoing/example.com');">

Is this example just plain wrong, or is there ever a reason to specify javascript: in anything other then a href?

+1  A: 

It's good practice for your maintenance programmer. The compiler knows the difference, but that young, just-out-of-college web developer may not.

George Stocker
If the "young, just-out-of-college web developer" may not know *that*, WTF did he went to college for? :-)
Tomalak
beer and chicks of course!
Steven A. Lowe
+2  A: 

I think the "javascript:" prefix is a leftover from the olde days when there still was the vague possibility that anything other than JavaScript could be handling the event.

Today it's optional and kept for backwards compatibility reasons. But I wouldn't say it's bad as such, it's just unnecessary.

Tomalak
It is a pseudoprotocol - it can be used in an anchor's href attribute, to indicate code to run rather than a URL to navigate to.
Jason Bunting
Of course. Didn't think of that because I rather use <a onclick="...">
Tomalak
+6  A: 

It's never needed on anchors and is never good practice. An anchor is for navigation only. Here's an article about this topic: http://crisp.tweakblogs.net/blog/the-useless-javascript-pseudo-protocol.html

I.devries
+2  A: 

in the beginning, you could also use vbscript in IE instead of javascript, so specifying "javascript: ..." was standard

today, well, it doesn't hurt... there could always be some other wanna-be browser scripting language in the future.

Steven A. Lowe
+1  A: 

It is possible in IE to set the default language set to VBScript f or a page.

In the early days there was all ways the idea that another language may be used for scripting in a browser.

As it has turned out no such language has materialised in substantial form.

I don't bother with this language prefix myself.

AnthonyWJones
+6  A: 

See here: http://www.w3.org/TR/html4/interact/scripts.html#h-18.2.2

Loki
+2  A: 

I have always believed that it was bad usage based on the fact that you can call javascript within a url with the javascript: prefix:

<a href="javascript:void(alert('really bad usage!'))">

(WebForms, someone?)

And only ignorant web-developer that never realized the difference between an event-declaration and a href-declaration used it.

I would say that even event-attributes are bad practice in most cases nowadays, and the preferred way to atach an event is by using .attachEvent (IE) and addEventListener (the rest, as usual)

And finally... Google isn't always GOD almighty. They tend to be of more concern that stuff works instead of following standards all the time.

jishi
+15  A: 

Some of the responses here claim that the "javascript:" prefix is a "leftover from the old days", implying that it's intentionally, specially handled by the browsers for backwards compatibility. Is there solid evidence that this is the case (has anyone checked source code)?

<span onclick="javascript:alert(42)">Test</span>

To me, this just reads as:

javascript:
    alert(42);

Meaning, that "javascript:" is just a label and has no effect. This works, too:

<span onclick="foobar:alert(42)">Test</span>

Update:

I did a little experiment and it turns out that, yes, "javascript:" is handled specially by IE, but definitely not so by Firefox, Safari, Opera or Chrome:

<span onclick="javascript:while (true) { alert('once'); break javascript; }">Test</span>

On non-IE, this will just alert "once", once and then break out of the loop. On IE, I get a "Label not found" error. The following works fine in all browsers:

<span onclick="foo:while (true) { alert('once'); break foo; }">Test</span>

Update 2:

I just realized the link http://crisp.tweakblogs.net/blog/the-useless-javascript-pseudo-protocol.html in one of the answers above pretty much talks about the same thing.

Ates Goral
I haven't tested this but I do believe it has specific function when used with the getURL function from within Flash in that it will try to call a Javascript function on the page rather then executing the URL.
Luke