链接中的 <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/
(完)