href与onclick中的JavaScript函数

Sku*_*ner 449 javascript href

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

将JavaScript调用放在href属性中是否有任何区别或好处(如下所示:

<a href="javascript:my_function();window.print();">....</a>
Run Code Online (Sandbox Code Playgroud)

)将它放在onclick属性中(将其绑定到onclick事件)?

dem*_*emp 942

坏:

<a id="myLink" href="javascript:MyFunction();">link text</a>
Run Code Online (Sandbox Code Playgroud)

好:

<a id="myLink" href="#" onclick="MyFunction();">link text</a>
Run Code Online (Sandbox Code Playgroud)

更好:

<a id="myLink" href="#" onclick="MyFunction();return false;">link text</a>
Run Code Online (Sandbox Code Playgroud)

更好1:

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

更好2:

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

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

最好:

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

$('#myLink').click(function(){ MyFunction(); return false; });
Run Code Online (Sandbox Code Playgroud)

  • 如果`href`没有设置为`#`而是设置为noJS浏览器的实际链接,那么将会有另一种解决方案. (20认同)
  • <a id="myLink" href="javascript:MyFunction();">有什么不好? (13认同)
  • 如果我告诉你,第一个(坏的)使用middleclick在所有浏览器中使用相同(右)的方式会怎样. (5认同)
  • 只有我谦虚的5美分:"最好的"选项是使用按钮进行点击(onclick事件?),并将锚点与他们的href一起留在他们最初的设计意图中:成为其他页面链接的锚点. (5认同)
  • 它不是另一种解决方案,而是对"更好"点的延伸.在这种情况下,如果浏览器不支持JavaScript或关闭它,那么用户将被带到一些警告\解释页面.如果浏览器支持JS则返回false将阻止浏览器跟踪链接. (2认同)
  • `javascript:void(0)`不会比你的**更好1**? (2认同)
  • 使用javascript的on click绑定有一个缺点:稍后,当您调试其他表单时,很难找到将javascript绑定到该元素的位置和类型。 (2认同)
  • **为什么**?如果有人提供详细解释或网站链接?谢谢 (2认同)
  • 我想添加到**最佳**方法并使其**比最好**更好**。删除带有无用的 `href="#"` 的整个 `a` 标记,并将 `onclick` 处理程序直接应用于内容。如果内容是标签,您只需在其上应用“myLink”id即可。如果内容不是标签,请在其上包围一个“span”标签,并将“myLink” id应用于“span”。最后在 CSS 中添加 `cursor:pointer;`。这样,链接就像按钮一样非常整洁,不会在 URL 中添加丑陋的“#”,也不会在链接工具提示上显示这个丑陋的“#”。 (2认同)
  • 在点击开始时停止事件应该优于 return false,因为 javascript 中的任何崩溃都会触发 href。讽刺的是,“坏”选项是这种情况下唯一安全的选项。 (2认同)
  • 请否决这个答案,因为这是一种非常糟糕的做法。对于依赖于锚点或简单地丢失滚动位置的事情来说,链接到“#”可能会产生灾难性的结果。 (2认同)
  • 但是,为什么不好?为什么好 ?为什么更好?为什么还要更好1?为什么还要更好2?为什么最好?如果可行,那么可行。 (2认同)

Par*_*and 260

将onclick放在href中会冒犯那些坚信内容与行为/行为分离的人.这个论点是你的html内容应该只关注内容,而不是表现或行为.

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

$('a').click( function(e) {e.preventDefault(); /*your_code_here;*/ return false; } );
Run Code Online (Sandbox Code Playgroud)

  • 如果您不必对事件对象执行任何操作,那么普通的javascript非常简单.使用obj = document.getElementById()获取DOM节点,然后设置obj.onclick = foo (11认同)
  • 但问题不在于询问将`href`中的JS调用内联与`onclick`中的内联之间的区别?假设您出于某种原因将其内联,您应该使用哪个?(在实践中,我会按照你的建议做,但你似乎已经跳过了这两个属性之间的区别.) (6认同)
  • 有一次我提倡将函数调用内联而不是为链接设置一个 onclick 事件是如果您在页面内动态创建链接,这些链接都将调用相同的函数但可能没有唯一的 id。我有一个网络表单,用户可以在其中添加和删除项目,我将 onclick 放在动态创建的 div 中链接的 href 中,这样我就可以更快地开始处理脚本,而不是使用诸如相对 id 或班级名称。 (2认同)

Ada*_*dam 66

javascript而言,一个区别是处理程序中的this关键字onclick将引用其onclick属性的DOM元素(在本例中为<a>元素),而thishref属性中将引用该window对象.

在以下方面介绍,如果href属性是从链路(即不存在<a onclick="[...]">),那么,在默认情况下,浏览器将显示的text光标(而不是经常期望的pointer光标),因为它是处理<a>作为锚,而不是一个连结.

行为方面,当通过导航指定动作时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>
Run Code Online (Sandbox Code Playgroud)

  • 感谢您确认我怀疑"href"与"onclick"中的"this"不同. (8认同)

小智 18

我用

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

很长一段路,但它完成了工作.使用A样式进行简化然后变为:

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

  • `nohref`是`area`标签的一部分,而不是'a`!您的示例与`<a onClick="alert('Hello World')"> HERE </a>`相同 (9认同)
  • +1太棒了!:-)我之前从未听说过'nohref`属性.这是处理此类javascript操作的最合乎逻辑/最优雅的方式.这与FF12和IE8兼容.因此我将替换所有的`href ="JavaScript:void(0);"`by`nohref`.非常感谢.干杯. (8认同)
  • 只是另一个“不要这样做”警告。这是完全不标准且糟糕的建议。“a”标签上不存在“nohref”。 (8认同)
  • 主流浏览器不支持它,我们为什么要使用它?http://www.w3schools.com/tags/att_area_nohref.asp (7认同)

Kam*_*rey 11

除此之外,href显示在浏览器的状态栏上,而不是onclick.我认为在那里显示javascript代码不是用户友好的.


lin*_*3rd 10

最好的方法是:

<a href="#" onclick="someFunction(e)"></a>
Run Code Online (Sandbox Code Playgroud)

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

dojo.stopEvent(event);
Run Code Online (Sandbox Code Playgroud)

这样做.

  • 我想提醒一下,如果你使用`href ="#"`浏览器将寻找一个命名的锚标签,因为它找不到它,那么它将使窗口滚动到页面顶部,如果你已经在顶部,可能不会引起注意的事情.要避免这种行为,请使用:`href ="javascript :;"`而不是. (8认同)
  • 而不是stopEvent,为什么不返回false(onclick ="someFunction(e); return false;") (7认同)

小智 8

它使用这行代码对我有用:

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


zom*_*bat 7

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

更好的做法是将javascript放入onclick属性的第二种方法,如果没有可用的脚本功能,则忽略该属性.在href字段中放置一个有效的URL(通常为"#"),以便为没有javascript的人提供后备.

  • 但是,这实际上并不正确.'#'是命名链接的指示符,它不是javascript标识符.它是一个有效的URL,不需要识别Javascript. (2认同)

Edu*_*rdo 7

最好的答案是一种非常糟糕的做法,永远不要链接到一个空的哈希,因为它会在以后产生问题。

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

另一个有趣的小提示。

onclickhref直接调用javascript时有不同的行为。

onclickthis正确地传递上下文,而href不会,或者换句话说,<a href="javascript:doStuff(this)">no context</a>将不会<a onclick="javascript:doStuff(this)">no context</a>

是的,我省略了href。尽管它不符合规范,但可以在所有浏览器中使用,尽管理想情况下,它应该包含一个href="javascript:void(0);"很好的措施


Jan*_*roň 6

最高票数的答案今天已过时

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

好的:

<a id="myLink" href="javascript:MyFunction();">link text</a>
Run Code Online (Sandbox Code Playgroud)

这取决于,可能是好的,因为爬虫遵循 href 目标,并且如果MyFunction()(动态链接)产生任何有意义的内容,那么它比点击事件更有可能被遵循,点击事件可能有多个或没有侦听器。

坏的

<a id="myLink" href="#" onclick="MyFunction();">link text</a>
Run Code Online (Sandbox Code Playgroud)

#意味着无意义的链接,爬虫通常只对前 x 个链接感兴趣,因此可以阻止他们跟踪页面后面的一些有意义的链接。

更差:

<a id="myLink" href="#" onclick="MyFunction();return false;">link text</a>
Run Code Online (Sandbox Code Playgroud)

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

最差:

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

$('#myLink').click(function(){ MyFunction(); return false; });
Run Code Online (Sandbox Code Playgroud)

jQuery 在 2020 年以后就已经过时了,不应该在新项目中使用

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>
Run Code Online (Sandbox Code Playgroud)


小智 5

就我个人而言,我发现将 javascript 调用放在 HREF 标签中很烦人。我通常不太注意某些东西是否是 javascript 链接,而且经常想在新窗口中打开东西。当我尝试使用这些类型的链接之一执行此操作时,我得到一个空白页面,上面没有任何内容,并且我的位置栏中有 javascript。但是,通过使用 onlick 稍微回避了这一点。


Tit*_*Mix 5

这有效

<a href="#" id="sampleApp" onclick="myFunction(); return false;">Click Here</a>
Run Code Online (Sandbox Code Playgroud)

  • 欢迎使用堆栈溢出!虽然此代码片段可能会解决问题,但 [包括解释](//meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而那些人可能不知道您提出代码建议的原因。也请尽量不要在您的代码中添加解释性注释,因为这会降低代码和解释的可读性! (3认同)

jch*_*nes 5

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

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

典型的绑定方法

普通链接:

<a href="https://www.google.com/">Google<a/>
Run Code Online (Sandbox Code Playgroud)

对于 JS 来说是这样的:

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

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

无绑定方法

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

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

这对于 JS:

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

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