使用javascript使用javascript调用链接的HREF属性!

时间:2010-09-10 21:43:39

标签: javascript click href invoke

我之前从未见过这个,但如果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上进行了测试。这是标准化的,所以我不必担心将来会弃用此功能吗?

3 个答案:

答案 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);

有效。

答案是肯定的,确实如此。没有理由不能评估存储在某些属性中的代码,就像评估输入框内容的方式一样。

那就是说,这看起来像是一种非常糟糕的编码方式。如果你不小心,你可能会陷入循环循环。此外,这样的代码将很难维护。