JavaScript - href vs onclick回调函数在超链接

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

把JavaScript调用放在href属性中(像这样)有什么区别或好处吗?

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

vs.把它放在onclick属性(绑定到onclick事件)?

1791684 次浏览

将onclick放在href中会冒犯那些坚信内容与行为/动作分离的人。争论的焦点是你的html内容应该只关注内容,而不是表现形式或行为。

现在的典型路径是使用javascript库(例如。Jquery),并使用该库创建一个事件处理程序。它看起来像这样:

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

就我个人而言,我觉得把javascript调用放在HREF标签中很烦人。我通常不太注意某些东西是不是javascript链接,而且经常想在一个新窗口中打开东西。当我尝试这样做与这些类型的链接之一,我得到一个空白页面上什么都没有和javascript在我的位置栏。但是,通过使用onlick可以避免这一点。

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

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

更好的做法是第二种方式,将javascript放到onclick属性中,如果没有可用的脚本功能,则忽略该属性。在href字段中放置一个有效的URL(通常是'#'),以供那些没有javascript的人使用。

对于javascript,一个不同之处在于onclick处理程序中的this关键字将引用具有onclick属性的DOM元素(在本例中是<a>元素),而href属性中的this将引用window对象。

对于演讲,如果一个href属性没有从一个链接(即<a onclick="[...]">),那么默认情况下,浏览器将显示text游标(而不是经常需要的pointer游标),因为它将<a>作为一个锚,而不是一个链接。

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


但是,如果您想知道从DOM对象的单击中获得动态操作的最佳方法是什么,那么使用javascript将事件与文档内容分开是最佳方法。你可以通过多种方式做到这一点。一个常见的方法是使用javascript库,如jQuery来绑定一个事件:

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

最好的方法是:

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

问题是这将在浏览器中添加一个散列(#)到页面URL的末尾,从而要求用户单击返回按钮两次才能进入您的页面之前的页面。考虑到这一点,您需要添加一些代码来停止事件传播。大多数javascript工具包已经有了这个函数。例如,dojo工具包使用

dojo.stopEvent(event);

这样做

编辑警告:请参阅评论,在这个答案中使用“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>

# EYZ0

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

# EYZ0

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

# EYZ0

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

# EYZ0

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

# EYZ0

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

为什么好吗?因为return false将阻止浏览器跟踪该链接

# EYZ0

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

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

我用了下面这行代码:

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

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

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

例如,尝试运行下面的示例并双击(快!)每个链接。 第一个链接将只执行一次。 第二个链接将执行两次。< / p >
<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运行正常。

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

正如许多人所说的那样,最好是将事件处理程序绑定到元素上,然而,<a href="javascript:doStuff();">do stuff</a>在每个现代浏览器中都能完美地工作,我在呈现模板时广泛使用它,以避免必须为每个实例重新绑定。在某些情况下,这种方法提供了更好的性能。YMMV

另一个有趣的消息是....

# EYZ0,href在直接调用javascript时有不同的行为。

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

是的,我省略了href。虽然这并不符合规范,但它可以在所有浏览器中工作,尽管理想情况下,它应该包括href="javascript:void(0);"作为良好的衡量标准

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

这是

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

我经历过javascript: hrefs不能工作时,页面嵌入到Outlook的网页功能,其中一个邮件文件夹被设置为显示url

首先,将url放在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),而不必担心每次都要绑定。

<a href="#" onclick="try{FUNCTION_YOU_WANT()}catch(e){}return false">click here</a>

这个也可以

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

(onclick)在带有bootstrap的Angular项目中并不适用。

投票最多的答案在今天已经过时了

我建议完全相反,循序渐进地看原因:

好:

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

这取决于,可能是好的,因为爬虫跟踪href目标,如果MyFunction()(动态链接)产生任何有意义的内容,它比在click事件中更有可能被跟踪,后者可能有多个或没有侦听器。

# EYZ0:

<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或其他类似的框架附加onclick处理程序的元素的ID。

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

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>

我不敢相信13年后,所有这些答案在语义上都是错误的!一个锚元素<a>:

...使用它的href属性,创建一个超链接到网页,文件,电子邮件地址,同一页面中的位置,或任何其他< >强URL < / >强可以地址。

其中的内容应该指明< >强链接的目的地< / >强。如果存在href属性,在聚焦于元素时按enter键将激活它。

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a

因此,在javascript中使用href=是一个糟糕的实践和糟糕的web语义。你应该在button元素上使用onclick=事件处理程序属性,如下所示:

HTML元素是一个交互式元素,由用户通过鼠标、键盘、手指、语音命令或其他辅助技术激活。一旦激活,它就会执行可编程操作,例如提交表单或打开对话框。

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button

和事件处理程序onclick=:

所有事件处理程序属性接受一个字符串。该字符串将用于合成一个JavaScript函数,如function name(/arg游戏/) {body},其中name是属性的名称,body是属性的值。

https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes#event_handler_attributes

由于您不是导航到URL或链接目的地,而是触发Javascript函数,正确的方法是使用onclick。如果你需要一个按钮上的锚标记的样式,只需使用CSS。

底线是:你能做并不意味着你就应该做。