繁体   English   中英

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

[英]Invoking the HREF attribute of a link with javascript using javascript!

我之前从未见过,但是如果HREF包含javascript:; // code ......;,则可以使用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上进行了测试。 这是标准化的,因此我不必担心将来会弃用此功能吗?

您不必担心将来会弃用它。 这是一个坏主意

真正发生的事情是:有一个使用javascript:协议的链接,该链接受到浏览器的尊重。 这意味着javascript:之后的所有内容都是JavaScript,应由JS解释器执行。

当您检索链接的href时,会将其作为字符串接收,例如“ javascript:clickme()”。 您可以对字符串使用eval来执行JavaScript。 现在,您会认为这会失败(因为前面是javascript:协议),但是不会,因为JavaScript具有标签,并且当您将其视为JavaScript代码时看起来像标签。

这样就行了,但这是个坏主意。 (由于eval )在最新版本的JavaScript ECMAScript 5th Edition的新“严格”模式下也不允许这样做。

通常,当我们认为需要对某些东西使用eval ,它表明我们的代码存在问题,并且需要进行一些重构。 该规则的例外是非常边缘的情况,我们大多数人永远都不会遇到。 在这种情况下,而不是在href属性包含我们要执行的代码,它应该只使用我们要执行的代码。 例如,您的示例仅将clickMe函数用作函数。 与其eval ,不如直接调用该函数。

它不会被弃用,但我看不到它的用途。

如果您确实想简化这一行,请执行以下操作:

 <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>

锚定控件主要用于导航,并且作为保持这种状态的一种好习惯。 如果您需要执行某些功能,请在跨度/ div上使用onclick。 您也可以使用按钮。

我想你的问题是线是否

eval(link.href);

已验证。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM