JavaScript链接中“href”值的选择:“#”还是“javascript:void(0)”?

JavaScript链接中“href”值的选择:“#”还是“javascript:void(0)”?

技术背景

在网页开发中,当需要创建一个执行 JavaScript 代码的链接时,经常会面临选择 href 属性值的问题,常见的选择是 #javascript:void(0)。然而,这两种选择都有各自的优缺点,并且随着网页开发技术的发展,还有更好的实践方式。

实现步骤

使用“#”的问题及解决方案

  • 问题
    • 团队开发中,使用 # 可能导致开发者忘记在 onclick 中使用 return doSomething(),而仅使用 doSomething()
    • 如果被调用的函数抛出错误,return false; 将不会执行,开发者需要在被调用的函数中适当处理错误。
    • # 会将用户带回页面顶部。
  • 解决方案:确保 onclick 总是包含 return false; ,并且被调用的函数不会抛出错误。例如:
1
<a href="#" onclick="myJsFunc(); return false;">Link</a>

使用“javascript:void(0)”的优势

  • 避免了使用 # 带来的上述问题。
  • onclick 事件失败时,总是会拦截操作,不会因哈希变化而触发错误的加载调用或其他事件。
    示例代码:
1
<a href="javascript:void(0)" onclick="myJsFunc();">Link</a>

无干扰 JavaScript 方式

  • 不使用 href 属性,通过 CSS 处理缺失的默认光标样式,使用无干扰的最佳实践来附加 JavaScript 功能。
    示例代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<! -- language: lang-html -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a class="cancel-action">Cancel this action</a>

<! -- language: lang-js -->
// Cancel click event
$('.cancel-action').click(function(){
alert('Cancel action occurs!');
});

// Hover shim for Internet Explorer 6 and Internet Explorer 7.
$(document.body).on('hover','a',function(){
$(this).toggleClass('hover');
});

<! -- language: lang-css -->
a { cursor: pointer; color: blue; }
a:hover,a.hover { text-decoration: underline; }

使用 <button> 元素

  • 对于需要产生数据变化的操作,推荐使用 <button> 元素,并通过脚本绑定事件。
    示例代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<! -- language: lang-css -->
button.link {
display: inline-block;
position: relative;
background-color: transparent;
cursor: pointer;
border: 0;
padding: 0;
color: #00f;
text-decoration: underline;
font: inherit;
}

<! -- language: lang-html -->
<p>A button that looks like a <button type="button" class="link">link</button>.</p>

核心代码

函数返回值控制链接行为

1
2
3
4
function doSomething() {
alert( 'you clicked on the link' );
return true;
}
1
<a href="path/to/some/url" onclick="return !doSomething();">link text</a>

无干扰 JavaScript 绑定事件

1
2
3
$(function() {
$(".some-selector").click(myJsFunc);
});
1
<a href="/gracefully/degrading/url/with/same/functionality.ext" class="some-selector">For great justice</a>

最佳实践

  • 优先使用有实际意义的 URL:如果有合适的 URL,应将其作为 href 值,同时在 onclick 中调用 JavaScript 函数,并在函数正常执行时阻止默认行为。
  • 无干扰 JavaScript:避免在 HTML 标记中直接使用 onclick 属性,将 JavaScript 逻辑与 HTML 标记分离,提高代码的可维护性和可扩展性。
  • 使用 <button> 元素:对于非导航目的的操作,特别是需要产生数据变化的操作,使用 <button> 元素代替 <a> 标签。

常见问题

省略 href 属性的问题

  • tab 键导航不可用:省略 a 元素的 href 属性会导致元素无法使用 tab 键导航。可以设置 tabindex 属性或使用 <button> 元素。
  • IE6 和 IE7 不支持 a:hover 样式:可以添加 JavaScript 垫片来解决这个问题。

函数执行失败的问题

  • 如果使用 # 并在 onclick 中调用函数,当函数执行失败时,页面可能会跳转到顶部。可以通过让函数返回布尔值,并在 onclick 中根据返回值决定是否阻止默认行为来解决。

JavaScript链接中“href”值的选择:“#”还是“javascript:void(0)”?
https://119291.xyz/posts/2025-05-09.choice-of-href-value-in-javascript-links/
作者
ww
发布于
2025年5月9日
许可协议