修正一個說法上的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>
的事情,可看下這篇文章《你不能創造一個按鈕》,講的有些道理