href="#" 和href="javascript:void(0);" 这哪个好些 ?
在说这个问题之前,我想应该思考一下,我们为什么要在页面不需要跳转的情况下选择<a>标签?
其实很大程度是是因为IE6,IE6只支持<a>的:hover伪类,所以要为了节约javascript来模拟hover的编码,<a>就是一个很好的选择。
但是使用<a>会导致一个问题:如果不添加href属性,那么css里的hover效果将会失效,如果添加了href,那么href应该何去何从呢.大部分情况下我们都不希望它跳转(阻止跳转).
而阻止跳转常见的有下面四种方式:
1. <a href="javascript:;" onclick="action();">link</a>
2. <a href="javascript:void(0);" onclick="action();">link</a>
3. <a href="###" onclick="action();">link</a>
4. <a href="#" onclick="action();return false;">link</a>
事实上这四种方式都可以很正常的工作。
第1和第2中可以归为一类,使用javascript 伪协议,只要什么都不返回,那么浏览器将不会跳转
第3种比较有意思,它使用了一个锚点(跳转到id或name为##的位置),在浏览器中, 如果一个锚点不存在,那么也不会跳转
第4种是在执行onclick的最后处加上return false, 这样就阻止了浏览器执行默认行为,同样就阻止了跳转
我以往的经验都证明第4种是最稳妥的方式,因为第2种和第2种都会在ie6下出现bug:
当A被点击, action() 函数里如果有设置location,设置img.src,设置iframe.src 行为,从而导致一个新的资源下载时,ie6会中断掉该行为。
比如这位朋友的记录:http://www.cnblogs.com/kaima/archive/2008/08/22/1273808.html 作者文中最后推荐使用空链接"###"。
二、jquery阻止默认事件
1 <a href="http://jquery.com">default click action is prevented</a> 2 <div id="log"></div> 3 <script> 4 $("a").click(function(event) { 5 event.preventDefault(); 6 $('<div/>').append('default ' + event.type + ' prevented').appendTo('#log'); 7 }); 8 </script>
第三种真的稳妥么,或许我们可以猜测一下锚点的工作方式,
当<a>元素被点击,浏览器发现href="###" ,首先要判断这个href是否需要跳转到别的页面,如果不需要,那么浏览器会将href后面两个##取出来,然后遍历DOM树,找到第一个id(或者name)的值为##的,调用内部方法,使浏览器滚动到相应的位置 ,如果一个匹配的也没有找到,那么浏览器什么也不做。
而这个过程中, 浏览器需要做的事情可能还有
- 启动载入中提示
- 发出跳转提示音(ie6,ie7)
总之,###会导致浏览器执行一系列的默认行为(是否有性能问题?), 包括ie6 7非常讨厌的提示音,而只要我们阻止了默认行为,这一切都不会发生。
所以结论是,尽量不要使用href="javascript:;" href="###" ,而统一使用 onclick="return false;" ,这是安全的,也是体验最好的。