Do you ever need to specify '[removed]' in

2019-01-01 11:08发布

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 than a href?

8条回答
长期被迫恋爱
2楼-- · 2019-01-01 11:36

See Specifying the scripting language (in 18.2.2 in HTML 4.01 Specification, Scripts).

查看更多
深知你不懂我心
3楼-- · 2019-01-01 11:44

It's never needed on anchors and is never good practice. An anchor is for navigation only. An article about this topic is The useless JavaScript: pseudo-protocol.

查看更多
与风俱净
4楼-- · 2019-01-01 11:44

In the beginning, you could also use VBScript in Internet Explorer instead of JavaScript, so specifying "javascript: ..." was standard.

Today, well, it doesn't hurt... There could always be some other wannabe browser scripting language in the future.

查看更多
若你有天会懂
5楼-- · 2019-01-01 11:47

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.

查看更多
梦醉为红颜
6楼-- · 2019-01-01 11:47

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.

查看更多
浮光初槿花落
7楼-- · 2019-01-01 11:49

In Internet Explorer, It is possible to set the default language set to VBScript for a page. In the early days there was always 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.

查看更多
登录 后发表回答