【问题标题】:JavaScript - href vs onclick for callback function on HyperlinkJavaScript - href vs onclick 用于超链接上的回调函数
【发布时间】:2010-11-07 10:21:24
【问题描述】:

我想在没有任何重定向的情况下单击运行一个简单的 JavaScript 函数。

将 JavaScript 调用放在 href 属性中是否有任何区别或好处(像这样):

<a href="javascript:my_function();window.print();">....</a>

对比将其放入onclick 属性中(将其绑定到onclick 事件)?

【问题讨论】:

标签: javascript


【解决方案1】:

不好:

<a id="myLink" href="javascript:MyFunction();">link text</a>

好:

<a id="myLink" href="#" onclick="MyFunction();">link text</a>

更好:

<a id="myLink" href="#" onclick="MyFunction();return false;">link text</a>

更好1:

<a id="myLink" title="Click to do something"
 href="#" onclick="MyFunction();return false;">link text</a>

更好2:

<a id="myLink" title="Click to do something"
 href="PleaseEnableJavascript.html" onclick="MyFunction();return false;">link text</a>

为什么更好?因为return false 会阻止浏览器跟踪链接

最佳:

使用 jQuery 或其他类似框架通过元素的 ID 附加 onclick 处理程序。

$('#myLink').click(function(){ MyFunction(); return false; });

【讨论】:

  • 会有另一种解决方案,这将是最好的,其中href 未设置为#,而是设置为 noJS 浏览器的实际链接。
  • 如果我告诉你只有第一个(坏的)一个在所有带有 middleclick 的浏览器中都以相同(正确)的方式工作。
  • 只是我不起眼的 5 美分:“最好的”选项是使用按钮进行点击(onclick 事件?),并让锚点的 href 与他们最初的设计意图保持一致:成为其他页面链接的锚点。
  • 但是,为什么不好?为什么好 ?为什么更好?为什么更好 1 ?为什么更好2?为什么最好?如果它有效,它就有效。
【解决方案2】:

将 onclick 放在 href 中会冒犯那些坚信内容与行为/动作分离的人。论点是您的 html 内容应该只关注内容,而不是展示或行为。

如今的典型路径是使用 javascript 库(例如 jquery)并使用该库创建事件处理程序。它看起来像:

$('a').click( function(e) {e.preventDefault(); /*your_code_here;*/ return false; } );

【讨论】:

  • 或 mootools、prototype、dojo ... 或纯 javascript,但这将是更多代码但值得练习。
  • 如果你不需要对事件对象做任何事情,纯 javascript 非常简单。用 obj = document.getElementById() 获取 DOM 节点,然后设置 obj.onclick = foo
  • 但问题不在于将 JS 调用内联到 href 与内联到 onclick 之间的区别吗?假设您出于某种原因要将它内联,您应该使用哪个? (实际上,我会按照您的建议进行操作,但您似乎跳过了这两个属性之间的区别。)
  • 我主张将函数调用内联而不是为链接设置 onclick 事件的一次是,如果您在页面内动态创建链接,这些链接都将调用相同的函数但可能没有唯一的 ID。我有一个网络表单,用户可以在其中添加和删除项目,我将 onclick 放在动态创建的 div 内链接的 href 中,这样我就可以更快地开始处理脚本,而不是使用不太具体的东西,比如相对 id 或类名。
【解决方案3】:

javascript 而言,一个区别是 onclick 处理程序中的 this 关键字将引用其 onclick 属性的 DOM 元素(在本例中为 @987654324 @ 元素),而href 属性中的this 将引用window 对象。

表示而言,如果链接中没有href 属性(即&lt;a onclick="[...]"&gt;),那么默认情况下,浏览器将显示text 光标(而不是经常-desired pointer 光标),因为它将&lt;a&gt; 视为锚点,而不是链接。

行为而言,当通过href 导航指定操作时,浏览器通常支持使用快捷方式或上下文菜单在单独的窗口中打开该href。仅通过 onclick 指定操作时,这是不可能的。


但是,如果您要问通过单击 DOM 对象获得动态操作的最佳方法是什么,那么使用与文档内容分开的 javascript 附加事件是最好的方法。您可以通过多种方式做到这一点。一种常见的方法是使用 jQuery 之类的 javascript 库来绑定事件:

<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<a id="link" href="http://example.com/action">link text</a>
<script type="text/javascript">
    $('a#link').click(function(){ /* ... action ... */ })
</script>

【讨论】:

  • 感谢您确认我怀疑“href”与“onclick”中的“this”不同。
【解决方案4】:

编辑警告:请参阅 cmets,此答案中“nohref”的使用不正确。

我用

Click <a nohref style="cursor:pointer;color:blue;text-decoration:underline"
onClick="alert('Hello World')">HERE</a>

还有很长的路要走,但它可以完成工作。使用 A 样式来简化 然后变成:

<style> A {cursor:pointer;color:blue;text-decoration:underline; } </style> 
<a nohref onClick="alert('Hello World')">HERE</a>

【讨论】:

  • +1 真的很棒! :-) 我以前从未听说过nohref 属性。这是处理此类 javascript 操作的最合乎逻辑/最优雅的方式。这与 FF12 和 IE8 兼容。因此,我将用nohref 替换我所有的href="JavaScript:void(0);"。非常感谢。干杯。
  • 目前主流浏览器都不支持,为什么要用这个? w3schools.com/tags/att_area_nohref.asp
  • nohrefarea 标签的一部分,而不是a!您的示例与&lt;a onClick="alert('Hello World')"&gt;HERE&lt;/a&gt; 相同
  • 只是另一个“不要做这个警告”。这是完全不标准和不好的建议。 nohref 不存在于 a 标记上。
【解决方案5】:

最佳答案是一种非常糟糕的做法,永远不应该链接到空哈希,因为它可能会在未来产生问题。

正如许多其他人所说,最好将事件处理程序绑定到元素,但是,&lt;a href="javascript:doStuff();"&gt;do stuff&lt;/a&gt; 在每个现代浏览器中都能完美运行,我在渲染模板时广泛使用它以避免必须为每个实例重新绑定。在某些情况下,这种方法可以提供更好的性能。 YMMV

另一个有趣的花絮....

onclick & href 在直接调用javascript时有不同的行为。

onclick 将正确传递 this 上下文,而 href 不会,或者换句话说,&lt;a href="javascript:doStuff(this)"&gt;no context&lt;/a&gt; 不会工作,而 &lt;a onclick="javascript:doStuff(this)"&gt;no context&lt;/a&gt; 会。

是的,我省略了href。虽然这不符合规范,但它适用于所有浏览器,不过,理想情况下,它应该包含 href="javascript:void(0);" 以进行良好的衡量

【讨论】:

    【解决方案6】:

    除了这里的所有,href 显示在浏览器的状态栏上,而 onclick 不显示。我认为在那里显示 javascript 代码对用户不友好。

    【讨论】:

      【解决方案7】:

      最好的方法是:

      <a href="#" onclick="someFunction(e)"></a>
      

      问题在于,这将在浏览器中页面 URL 的末尾添加一个井号 (#),因此需要用户单击两次后退按钮才能转到您之前的页面。考虑到这一点,您需要添加一些代码来停止事件传播。大多数 javascript 工具包已经有了这个功能。例如,dojo 工具包使用

      dojo.stopEvent(event);
      

      这样做。

      【讨论】:

      • 我想警告,如果你使用href="#",浏览器会寻找一个命名的锚标签,因为它不会找到它,然后它会让窗口滚动到顶部页面的顶部,如果您已经在顶部,则可能不会引起注意。要避免这种行为,请改用:href="javascript:;"
      • @alonso.torres 好点,但这就是为什么我提到使用 dojo.stopEvent() - 它会停止事件传播/冒泡和点击锚点的默认行为。
      • 而不是stopEvent,为什么不直接返回false (onclick="someFunction(e);return false;")
      【解决方案8】:

      这行得通

      <a href="#" id="sampleApp" onclick="myFunction(); return false;">Click Here</a>
      

      【讨论】:

      • 欢迎来到 Stack Overflow!虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性 cmets 挤满你的代码,因为这会降低代码和解释的可读性!
      【解决方案9】:

      在任何不是专门用于脚本编写的属性中包含javascript: 是一种过时的 HTML 方法。虽然从技术上讲它有效,但您仍在将 javascript 属性分配给非脚本属性,这不是一个好习惯。它甚至可能在旧浏览器甚至一些现代浏览器上失败(谷歌论坛帖子似乎表明 Opera 不喜欢 'javascript:' url)。

      第二种方法是更好的做法,将您的 javascript 放入 onclick 属性中,如果没有可用的脚本功能,该属性将被忽略。在 href 字段(通常为“#”)中放置一个有效的 URL,以供没有 javascript 的用户使用。

      【讨论】:

      • 我看不出 'javascript:' href 和带有 onclick 属性的 '#' href 之间有什么区别。对于没有启用 JS 的浏览器,两者同样无用。
      • harto,这实际上是不正确的。 '#' 是命名链接的指示符,它不是 javascript 标识符。它是一个有效的 URL,不需要识别 Javascript。
      【解决方案10】:

      使用这行代码对我有用:

      <a id="LinkTest" title="Any Title"  href="#" onclick="Function(); return false; ">text</a>
      

      【讨论】:

        【解决方案11】:

        就我个人而言,我发现将 javascript 调用放在 HREF 标记中很烦人。我通常不会真正关注某个东西是否是 javascript 链接,并且经常想在新窗口中打开东西。当我尝试使用其中一种类型的链接执行此操作时,我得到一个空白页面,上面没有任何内容,并且我的位置栏中有 javascript。但是,使用 onlick 可以避免这一点。

        【讨论】:

          【解决方案12】:

          首先,最好使用href 中的网址,因为它允许用户复制链接、在另一个选项卡中打开等等。

          在某些情况下(例如频繁更改 HTML 的网站),每次更新时都绑定链接是不切实际的。

          典型的绑定方法

          普通链接:

          <a href="https://www.google.com/">Google<a/>
          

          对于 JS 来说是这样的:

          $("a").click(function (e) {
              e.preventDefault();
              var href = $(this).attr("href");
              window.open(href);
              return false;
          });
          

          这种方法的好处是标记和行为的清晰分离,并且不必在每个链接中重复函数调用。

          无绑定方法

          如果不想每次都绑定,可以使用onclick,传入元素和事件,例如:

          <a href="https://www.google.com/" onclick="return Handler(this, event);">Google</a>
          

          这对于 JS:

          function Handler(self, e) {
              e.preventDefault();
              var href = $(self).attr("href");
              window.open(href);
              return false;
          }
          

          这种方法的好处是您可以随时加载新链接(例如通过 AJAX),而不必担心每次都绑定。

          【讨论】:

            【解决方案13】:

            在 javascript 中使用“href”时我注意到的另一件事:

            如果两次点击之间的时间差很短,“href”属性中的脚本将不会被执行。

            例如,尝试运行以下示例并双击(快!)每个链接。 第一个链接将只执行一次。 第二个链接将执行两次。

            <script>
            function myFunc() {
                var s = 0;
                for (var i=0; i<100000; i++) {
                    s+=i;
                }
                console.log(s);
            }
            </script>
            <a href="javascript:myFunc()">href</a>
            <a href="#" onclick="javascript:myFunc()">onclick</a>
            

            在 Chrome(双击)和 IE11(三次单击)中复制。 在 Chrome 中,如果您点击速度足够快,您可以点击 10 次,并且只执行 1 个函数。

            Firefox 工作正常。

            【讨论】:

              【解决方案14】:
               <hr>
                          <h3 class="form-signin-heading"><i class="icon-edit"></i> Register</h3>
                          <button data-placement="top" id="signin_student" onclick="window.location='signup_student.php'" id="btn_student" name="login" class="btn btn-info" type="submit">Student</button>
                          <div class="pull-right">
                              <button data-placement="top" id="signin_teacher" onclick="window.location='guru/signup_teacher.php'" name="login" class="btn btn-info" type="submit">Teacher</button>
                          </div>
                      </div>
                          <script type="text/javascript">
                              $(document).ready(function(){
                              $('#signin_student').tooltip('show'); $('#signin_student').tooltip('hide');
                              });
                          </script>   
                          <script type="text/javascript">
                              $(document).ready(function(){
                              $('#signin_teacher').tooltip('show'); $('#signin_teacher').tooltip('hide');
                              });
                          </script>   
              

              【讨论】:

                【解决方案15】:

                最受欢迎的答案今天已过时

                我会建议完全相反,请逐步查看原因:

                好:

                <a id="myLink" href="javascript:MyFunction();">link text</a>
                

                这取决于,可能很好,因为爬虫会跟随 href 目标,如果MyFunction()(动态链接)产生了任何有意义的内容,那么它比点击事件更有可能被关注,点击事件可能有多个或没有侦听器.

                不好

                <a id="myLink" href="#" onclick="MyFunction();">link text</a>
                

                #表示无意义的链接,爬虫往往只对前x个链接感兴趣,因此会阻止它们在页面后面跟踪一些有意义的链接。

                更糟:

                <a id="myLink" href="#" onclick="MyFunction();return false;">link text</a>
                

                与之前相同,加上return false 可防止点击链接。如果其他一些脚本想要添加另一个侦听器并更新目标(例如通过代理重定向),他们不能不修改 onclick(好吧,这只是一个小挫折,因为这些用例是相当理论上的)。

                最差:

                使用 jQuery 或其他类似框架通过元素的 ID 附加 onclick 处理程序。

                $('#myLink').click(function(){ MyFunction(); return false; });
                

                jQuery 在 2020+ 和 should not be used in new projects 已过时。

                href 中的事件

                href 属性处理程序不获取事件对象,因此处理程序不会隐式查看哪个链接是源。您可以将其添加到 onclick 处理程序中,该处理程序会在跟随 href 之前触发:

                <a href="javascript:my_function(event2)" onclick="event2=event">
                  JS based link
                </a>
                
                <script>
                function my_function(e) {
                  console.log(e.target); // the source of the click
                  if(something) location.href = ...; // dynamic link
                }
                </script>
                

                【讨论】:

                  【解决方案16】:

                  当页面嵌入 Outlook 的网页功能时,javascript: hrefs 不起作用,其中邮件文件夹设置为显示 url

                  【讨论】:

                    【解决方案17】:
                    <a href="#" onclick="try{FUNCTION_YOU_WANT()}catch(e){}return false">click here</a>
                    

                    【讨论】:

                    • 感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation 将通过展示为什么这是解决问题的好方法,并使其对有其他类似问题的未来读者更有用,从而大大提高其长期价值。请编辑您的答案以添加一些解释,包括您所做的假设。
                    【解决方案18】:

                    这个也可以

                    <a (click)='myFunc()'>Click Here </a>
                    

                    (onclick)在带有引导程序的 Angular 项目中对我不起作用。

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2015-11-02
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2012-12-10
                      • 2016-02-18
                      • 1970-01-01
                      相关资源
                      最近更新 更多