我之前从未见过这个,但如果HREF包含javascript:; //代码......;
,您可以使用javascript调用链接的HREF属性在下面的示例中,点击两个链接。他们做同样的事情,即使他们在HREF中有不同的javascript。
例如:
<script type="text/javascript">
function clickme()
{
var link = document.getElementById("clickme");
eval(link.href);
}
</script>
<a id="clickme" href="javascript:alert('hello');">I will alert hello</a>
<br />
<a href="javascript:clickme()">click me</a>
我在IE8,Firefox 3.6.8,Safari 5.0.1和Chrome 6.0.472.55上进行了测试。这是标准化的,所以我不必担心将来会弃用此功能吗?
答案 0 :(得分:4)
您不必担心将来会被弃用。这是一个坏主意现在。
真正发生的事情是:有一个使用javascript:
协议的链接,该协议受到浏览器的尊重。这意味着javascript:
之后的所有内容都是JavaScript,应该由JS解释器执行。
当您检索链接的href时,您会将其作为字符串接收,例如“的javascript:clickme()”。您可以在字符串上使用eval
来执行JavaScript。现在,你认为会失败(因为前面有javascript:
协议的东西),但事实并非如此,因为JavaScript有标签,当你看起来像一个标签将其视为JavaScript代码。
所以它有效,但这是一个坏主意。在最新版本的JavaScript,ECMAScript第5版的新“严格”模式下,它也被禁止(因为eval
。)
一般来说,当我们认为我们需要使用eval
时,它表明我们的代码存在问题,并且有些重构是有序的。该规则的例外是非常边缘的边缘情况,我们大多数人永远不会遇到。在这种情况下,不应让href
属性包含我们想要执行的代码,而应该使用我们想要执行的代码。例如,您的示例使用clickMe
函数作为唯一使用的函数。我们应该直接调用该函数,而不是eval
它。
答案 1 :(得分:1)
它不会被弃用,但我没有看到它的使用。
如果您确实要进行流式处理,请执行以下操作:
<script type="text/javascript">
function clickme()
{
clicked();
}
function clicked()
{
alert("hello");
}
</script>
<a id="clickme" href="javascript:clicked();">I will alert hello</a>
<br />
<a href="javascript:clickme()">click me</a>
或者更好的是:
<a href="#" onclick="clicked();">Click Me</a>
甚至更好:
<span onclick="clicked();" class="MakeMeLookLIkeLInk">Click Me</a>
锚点控件主要用于导航,并且作为保持这种方式的好习惯。如果您有需要进行的功能,请使用带有onclick的span / div。你也可以使用一个按钮。
答案 2 :(得分:0)
我认为你的问题是该行
eval(link.href);
有效。
答案是肯定的,确实如此。没有理由不能评估存储在某些属性中的代码,就像评估输入框内容的方式一样。
那就是说,这看起来像是一种非常糟糕的编码方式。如果你不小心,你可能会陷入循环循环。此外,这样的代码将很难维护。