刚开始搞网页那会儿,经常点一些按钮或者链接,页面没反应,地址栏也不变,但就是弹个框或者页面某个地方变。当时就挺纳闷,这链接点个寂寞?
后来自己写代码,或者用浏览器那个开发者工具(就是按F12出来的那个)看别人网页源码,就老看到链接的 `href` 属性里写着 `javascript:void(0)`。第一反应就是,这是啥玩意儿?看着像 JavaScript 代码,但又带个 `void`,还有个 `0`,感觉怪怪的。
我就试着捣鼓。把 `javascript:void(0)` 删,有时候链接就真跳转,或者点没效果,因为它可能绑定 `onclick` 事件。换成 `#` ?欸,点页面有时候会跳到顶上,或者地址栏后面多个 `#`,虽然也能阻止跳转,但体验不太特别是页面长的时候,一闪就上去,挺烦人。
查点资料,又自己写几个小例子试几次,才慢慢搞明白。这个 `javascript:` 是告诉浏览器,后面跟着的不是普通网址,而是要执行的一段 JavaScript 代码。那个 `void` 是个 JavaScript 里面的操作符,意思就是执行它后面的表达式,但啥也不返回,或者说,就返回个 `undefined`,表示空、无效。所以 `void(0)` 就是执行 `0` 这个表达式(虽然执行 `0` 本身没啥意义),然后返回 `undefined`。
合起来 `javascript:void(0)` 就是执行一段 JS,但因为它最终返回的是 `undefined`,浏览器就不会把这个 `undefined` 当成一个有效的地址去跳转。这样一来,链接它原本的跳转功能就被“废掉”。
那为啥要这么用?
主要就是想让一个看起来像链接的东西(比如用 `` 标签做的按钮或者图标),点击的时候不跳转页面,而是去执行咱们另外绑定好的 JavaScript 代码。比如:
- 点击弹出一个登录框让你输入用户名密码。
- 点击发送一个后台请求,不刷新整个页面的情况下,更新页面某个部分的数据。
- 点击触发一些网页上的动画效果。
用 `javascript:void(0)` 就正既能保留 `` 标签默认的一些样式(比如鼠标放上去变小手),又能阻止它乱跳,让咱们写在 `onclick` 事件里的 JavaScript 代码能顺利执行。比起用 `#`,它不会引起页面滚动或者地址栏变化,用户体验好一些。
这 `javascript:void(0)` 就是个小技巧,或者说是个过去比较流行的做法。主要目的就是占个位,告诉浏览器“这链接点别跳转,听我 JavaScript 的安排”。 刚开始觉得挺绕的,后来用多,见多,也就习惯,知道它是干啥的就行。虽然现在前端开发有更多选择,比如直接用 `