修正一个说法上的bug吧。对于IE6来讲,点击后gif暂停bug仅仅发生在“
javascript:
伪协议未加分号”的情形下。chrome
给<a>
标签增长href属性,就意味着如下事情:segmentfault
- :link选择器能够选择到它
- 这个a标签能够得到焦点(能够经过
tab
按键访问到) - 在浏览器的默认样式表中,有href属性的
<a>
标签才有cursor:pointer
的效果(尤为是在低版本的IE上)。
绑定了onclick事件的<a>
标签,尤为是它的做用是ajax请求时,基本上咱们就用不上这个标签的默认行为,也链接不到的实际页面,通常而言也会在CSS里给予了这个元素的cursor等样式。这时候还要加上href属性,是为了:浏览器
- 让
<a>
够响应键盘事件并得到焦点(从而屏幕阅读器可以读出背后的内容,加强可访问性) - 优雅降级,在网络链接不好,尚未加载到CSS的时候,
<a>
依然有手型与正常的link样式。
给<a>
标签以href属性,并不链接到实际的页面的方案有:网络
<a href="#"></a>
<a href="#nogo"></a>
<a href="##"></a>
<a href="###"></a>
<a href="javascript:void(0);"></a>
<a href="javascript:void(0)"></a>
<a href="javascript:;"></a>
<a href="javascript:"></a>
他们的体验有细微的差异。wordpress
- 1,点击这个连接后,会让页面跳到头部,window.location.href末尾增长#(若window.location.href末尾没有#),除非在js里面捕获onclick事件并阻止默认事件。
- 2有了初步的语义。可是,若是页面里面有id为nogo的元素,点击这个连接后,锚点机制会做用,页面贴齐这个元素上缘。更详细的,详见张鑫旭的《URL锚点HTML定位技术机制、应用与问题》
- 3在chrome中再也不默认跳转到页面头部,4在IE11中再也不跳转到页面头部。见下方测试。
- 5~8做用相同,但使用了javascript伪协议。在IE6下面,未加分号的方案6和方案8被点击后,IE6会使得页面中的gif暂停,而且触发onbeforeunload事件(详情参考这里),IE6认做这个页面有了重定向,并abort以后全部的请求(参考这里)。因此假如你在此以后替换了一个
<img>
的src,IE6彻底不会完成这个新的请求。
我更倾向于使用方案4。函数
至于语义上LZ这种<a href="javascript:void(0)">
使用方式,这个贴里已经有了足够详细的回答。我再补充一点,这种情形依然能够作到支持无障碍应用,方法请参考《WAI-ARIA无障碍网页应用属性》。
更新,我作了以下的测试:
<p> <a href="#">#</a> </p> <p> <a href="##">##</a> </p> <p> <a href="###">###</a> </p> <p> <a href="####">####</a> </p> <p> <a href="#####">#####</a> </p> <script type="text/javascript"> var n = 0 ; window.onhashchange = function(){ alert(++n) ; } </script>
- 在IE11中,点击###、####和#####时,页面再也不跳转到头部
- 在chrome中,点击##、###、####和#####时,页面再也不跳转到头部。
- 可是在IE11和chrome中,点击全部的
<a>
都会形成地址栏的修改,并触发hashchange事件。
因此以前说的“###不会形成地址栏的改变”是错误的。
没有大规模测试其余的浏览器,这里作初步猜测:###的意义在于,这是字符数最少的,在全部的浏览器中不会致使跳转到页面头部的锚点。
坏处:
一、javascript:
是伪协议,是非标准化的协议
二、不能平稳退化,当用户的浏览器对JS失效或禁用时点击后什么意义都没有
三、大部分搜索引擎不会搜索到它,由于没有内容,从而影响排名 (#
是否是也算上空链?空链对搜索引擎也不友好)
解决方法:
一、将 javascript:
、 #
、 ###
替换成真实网址,并取消 <a>
的默认点击事件,return false
或event.preventDefault
,若是JS失效了该连接虽功能上打了些折扣,但并无完全失效,作到了“平稳退化”
如:本网站侧边栏的“邀请回答”的 http://segmentfault.com/q/1010000000339082#
能够替换成真实地址http://segmentfault.com/q/1010000000339082
,而后继续它以后的事件
二、将不应是按钮的改为按钮。好多人都在“烂”用 <a>
,每一个人都想让它去完成 <button>
的事情,可看下这篇文章《你不能创造一个按钮》,讲的有些道理