代码改变世界

href="#" 和href="javascript:void(0);" 这哪个好些

2013-12-28 19:54  臭小子1983  阅读(620)  评论(0编辑  收藏  举报

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;" ,这是安全的,也是体验最好的。