链接中的 <a href='javascript:void(0);'> 是什么(转)

常常能看到 <a href=”javascript:void(0);”> 这种写法,我自己从没这么写过,但大概也能猜到是为了取消跳转,为什么要这么写却从来没了解过,今天被人问起,于是了解了一下原因。

1、写 javascript:void(0) 是什么意思?

为了阻止 <a> 的默认跳转行为。

以下写法效果都一样:

<a href="javascript:void(0);"> 
<a href="javascript:void()"> 
<a href="javascript:;"> 
<a href="javascript:"> 

2、原理是什么,以上几种有何区别?

拆开来看

javascript:

属于浏览器伪协议,伪协议不会发生URL重定向(俗称:页面跳转),常见的伪协议:
tencent:(调用QQ)
data: (用base64编码在浏览器输出二进制文件)
javascript:(让浏览器执行一段 js 脚本)

void(0)

void 是 JS 运算符,用途是对给定的表达式进行求值,然后返回 undefined。所以后面写 0 还是其他什么,都无所谓,最终都返回 undefined。

;

JS 中,每一行结尾要用 ; 号,但最后一行的 ; 可以省略不写。所以这里只有一行,写不写 ; 也无所谓。

结论

原理,就是让浏览器执行一个JS脚本从而放弃重定向,但这个JS脚本是个幌子“什么都没干”。

区别,除了字数,没区别(参见)。

3、还有其他方法吗?

有,还可以用 DOM 事件阻止的方式:

// 标准写法
<a href="xxx.html" onclick="event.preventDefault()">

// IE9以下写法
<a href="xxx.html" onclick="event.returnValue = false">

// 不推荐写法
<a href="xxx.html" onclick="return false">

4、为什么不推荐 return false 写法?

1、mouseover 等几种特殊事件情况下,并不一定能终止事件。

2、在 JQ 里调用 return false 会触发 stopPropagation() 阻止事件冒泡。

3、其他一些意外的兼容问题(参见)。

5、为什么不用 <a href=”#”> 代替?

1、# 本质上是锚点连接,会导致页面滚动到顶部

2、还会产生浏览器历史记录,导致用 js 调用浏览器后退 windows.history.go(-1) 时失效

3、还会让地址栏 URL 后面多出无用的 # 字符

4、类似的还有(不会滚动顶部了,但另两个问题还存在):

<a href="#!">
<a href="##">
<a href="###">

6、既然不想重定向,为什么非要用 <a> ?

主要原因:历史问题遗留的习惯

1、当年想做一个支持 :hover 的 button,在 ie6 下只有带 href 属性的 <a> 支持。

2、当年没有 <button> 标签,只有 <input type="button" /> 无法在里面嵌套其他标签。

其他原因:懒人想少些点css

1、浏览器强制给表单类标签默认了一些样式,还要清除。

2、<a> 自带手型鼠标指针,<button> 还要自己写 cursor:pointer;

7、那么最佳实践到底是什么?

没啥特殊情况

需要重定向的按钮用: <a>

不需要重定向的按钮用: <button>

必须用a标签,但不想重定向

想兼容古董浏览器的用: <a href="javascript:">

不考虑兼容古董浏览器用: event.preventDefault()

参考

1 在阻止a标签的默认操作时,使用javascript:void(0)
https://www.zhihu.com/question/20736889

2 A标签使用javascript:伪协议
http://www.cnblogs.com/song-song/p/5277838.html

3 Javascript手册:Void 运算符
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/void

4 不要用return false阻止event的默认行为
http://www.jianshu.com/p/56b64b523f10

5 为什么要使用href=”javascript:void(0);”?
http://www.zhangxinxu.com/wordpress/2013/01/why-use-href-javascript-void0/

(完)

posted @ 2017-06-07 21:35  Garven  阅读(605)  评论(0编辑  收藏  举报