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

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

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

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


当前回答

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

其他回答

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

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

好:

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

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

bad:

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

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

在表示方面,如果链接中缺少href属性(例如<a onclick="[…]">),那么默认情况下,浏览器将显示文本游标(而不是通常需要的指针游标),因为它将<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>

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

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

我用了下面这行代码:

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