哦,神奇的混乱JavaScript世界。你发布的代码可能不会做大多数程序员认为的那样。
以下每行之间有所不同:
<a onclick="alert('Hello World!')"...>example</a> //V1
<a href="javascript: alert('Hello World!')"...>example</a> //V2
<a onclick="javascript: alert('Hello World')"...>example</a> //V3
尽管它们都会提示Hello World!
第一种(V1)通过[onclick]
属性绑定了一个内联的click
事件。它还可能包含一个[href]
属性,在[onclick]
属性执行后导航到另一个位置,或者在代码中绑定任意数量的其他click
事件,假设默认行为没有被阻止。
第二个例子(V2)将可执行的javascript:
URL设置为[href]
属性。它可能还包含[onclick]
属性或在外部脚本中绑定的其他click
事件。
第一和第二个例子(V1和V2)都执行相同的代码,即:
alert('Hello World!')
第三个例子(V3)通过[onclick]
属性绑定了一个内联的click
事件,就像V1一样,然而执行的代码不同。执行的代码是:
javascript: alert('Hello World')
虽然它看起来像是一个javascript:
URL,但实际上只是在JavaScript中使用标签。
JavaScript中的标签对于跳出嵌套循环非常有用,如下例代码所示:
label: for (i = 0; i < 5; i++) {
for (j = 0; j < 5; j++) {
console.log(i, j);
if (i === 2 && j === 3) {
break label;
}
}
}
在大多数内联JavaScript中,常常被滥用,因为作者不了解这三种格式之间的区别。
为什么使用 javascript: <code>
是不好的?
这是一个先入为主的问题。它假定使用 javascript:<code>
是不好的。
javascript:<code>
并不是不好的。它只是一种工具。工具本身并没有好坏之分,只有使用工具的人才有。即使有人把锤子当成武器,你也不会称它为"坏"。
javascript:<code>
有一些好用的地方。但是在大多数情况下,你不应该使用它,因为它是错误的工具。然而,如果你正在编写一个书签脚本,你就需要使用 javascript:<code>
格式。
此外,有一些小众情境可能会合理地保留javascript内联。例如,在页面上添加一个简单的打印按钮:
<a href="#" onclick="window.print(); return false">Print</a>
尽管即使这个例子也可以很容易地通过使用类和将JavaScript外部化来替换:
<a href="#" class="print">Print</a>
<script>
$(document).on('click', '.print', function () {
window.print();
return false;
});
</script>
onclick="func()"
和常见的添加专用类来挂钩的方法class="a_class func_class"
之间几乎没有什么区别。 - user1106925