你是否需要在 onclick 中指定 "javascript:"?

48

据我所知,在onclick中你永远不需要指定协议:

onclick="javascript:myFunction()" 不好

onclick="myFunction()"

今天我注意到在这篇文章中,Google Analytics正在使用它:

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

这个例子是不是完全错误的,还是在除了 href 之外的地方指定 javascript: 有时有其必要性?


文章链接已经失效了。它的标题是什么? - Peter Mortensen
@PeterMortensen:它已经不存在了。 - Ry-
8个回答

50

这里的一些回答声称,"javascript:"前缀是"旧日遗留物",暗示浏览器有特别处理这个前缀以保持向后兼容性。是否有确凿的证据表明这种情况(有人检查过源代码吗)?

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

对我来说,这只是读起来像这样:
javascript:
    alert(42);

意思是,“javascript:”只是一个标签,没有实际作用。 这也可以运行:
<span onclick="foobar:alert(42)">Test</span>

更新:
我进行了一项小实验,结果表明,是的,“javascript:”在IE中得到特殊处理,但绝对不会在Firefox,Safari,Opera或Chrome中得到特殊处理。
<span onclick="javascript:while (true) { alert('once'); break javascript; }">Test</span>

在非 IE 浏览器中,这将只警示一次 "once",然后跳出循环。在 IE 中,会出现 "Label not found" 的错误。以下代码在所有浏览器中均正常工作:

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

更新2:

我刚刚意识到上面答案中的链接http://crisp.tweakblogs.net/blog/the-useless-javascript-pseudo-protocol.html基本上讲述了相同的内容。


我还没有测试过这个,但我确信它在与Flash中的getURL函数一起使用时具有特定的功能,即它会尝试调用页面上的Javascript函数而不是执行URL。 - Luke
哪些版本的Internet Explorer有/具有此行为? - Peter Mortensen

8

在锚点上从来不需要使用,这也不是一个好的习惯。锚点仅用于导航。 关于此主题的文章是无用的JavaScript:伪协议


8
在最初,您也可以在Internet Explorer中使用 VBScript而不是JavaScript,因此指定“javascript:…”是标准的。
今天,这并不会有什么坏处...将来可能会出现其他想要成为浏览器脚本语言的语言。

5

我一直认为,这是基于一个事实而产生的不良使用,即你可以在URL中使用javascript:前缀来调用JavaScript。

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

(Web Forms,有人了解吗?)

只有无知的网页开发者才不会意识到事件声明和超链接声明之间的区别而使用它。

我认为即使在现在的大多数情况下,事件属性也是不好的实践方式,最好的方法是使用.attachEvent(Internet Explorer)和addEventListener(其他浏览器,通常如此)来附加事件。

最后……Google并不总是全能的上帝。他们更关心东西是否有效,而不是始终遵循标准。


4

7
那个部分有没有提到onclick中的javascript: - Ry-

3

我认为“javascript:”前缀是旧时代的遗留物,当时可能还存在除JavaScript之外的任何其他东西来处理事件的模糊可能性。

今天它是可选的,并且出于向后兼容性的原因而保留。但我不会说它本质上是“坏”的,只是不必要的。


2
这是一个伪协议 - 它可以用于锚点的href属性,表示要运行的代码而不是要导航到的URL。 - Jason Bunting
当然。我没有考虑到这一点,因为我更喜欢使用<a onclick="...">。 - Tomalak

2
在Internet Explorer中,可以将页面的默认语言设置为VBScript。在早期,总是有这样的想法,即另一种语言可能会用于浏览器脚本。事实证明,没有出现任何实质性形式的这种语言。
我个人不太关注这种语言前缀。

0

这是对你的维护程序员来说很好的实践。编译器知道区别,但那些刚从大学毕业的Web开发人员可能不知道。


3
如果那个“刚从大学毕业的年轻网页开发者”不知道那个,他上大学干嘛去了? :-) - Tomalak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接