這樣寫為什麼不好?修正一個說法上的bug吧。對IE6來說,點擊後gif暫停bug僅發生在「javascript:偽協議未加分號」的情形下"/> 這樣寫為什麼不好?修正一個說法上的bug吧。對IE6來說,點擊後gif暫停bug僅發生在「javascript:偽協議未加分號」的情形下">

首頁  >  文章  >  web前端  >  謹慎使用javascript:void(0),為什麼這樣寫不好

謹慎使用javascript:void(0),為什麼這樣寫不好

零下一度
零下一度原創
2017-05-17 16:03:455137瀏覽

修正一個說法上的bug吧。對於IE6來說,點擊後gif暫停bug僅僅發生在「javascript:偽協議未加分號」的情形下

<a href="javascript:void(0)">

這樣寫為什麼不好?

我再來提供一個視角吧。

為3499910bf9dac5ae3c52d5ede7383485標籤增加href屬性,就意味著以下事情:

:link選擇器可以選擇到它

這個a標籤可以獲得焦點(可以透過tab按鍵存取)

在瀏覽器的預設樣式表中,有href屬性的3499910bf9dac5ae3c52d5ede7383485標籤才有cursor:pointer的效果(尤其是在低版本的IE上)。

綁定了onclick事件的3499910bf9dac5ae3c52d5ede7383485標籤,尤其是它的作用是ajax請求時,基本上我們就用不上這個標籤的預設行為,也連接不到的實際頁面,一般而言也會在CSS裡給予了這個元素的cursor等樣式。這時候還要加上href屬性,是為了:

讓3499910bf9dac5ae3c52d5ede7383485夠響應鍵盤事件並獲得焦點(從而屏幕閱讀器能夠讀出背後的內容,增強可訪問性)

優雅降級,在網路連線很差,還沒載入到CSS的時候,3499910bf9dac5ae3c52d5ede7383485依然有手型與正常的link樣式。

給3499910bf9dac5ae3c52d5ede7383485標籤以href屬性,並不連接到實際的頁面的方案有:

1.
2.
3.
4.
5.
6.<a href="javascript:void(0)">
7.
8.

他們的體驗有細微的差別。

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之後所有的請求(參考這裡)。所以假如你在此之後取代了一個a1f02c36ba31691bcfe87b2722de723b的src,IE6完全不會完成這個新的請求。

我比較傾向於使用方案4。

至於語意上LZ這種0408054196e655f677973fb4d7c99865使用方式,這裡已經有了足夠詳細的答案。我再補充一點,這種情形依然可以做到支援無障礙應用,方法請參考《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中,點選所有的3499910bf9dac5ae3c52d5ede7383485都會造成網址列的修改,並觸發hashchange事件。

所以之前說的「不會造成網址列的改變」是錯誤的。 沒有大規模測試其他的瀏覽器,這裡做初步猜想:的意義在於,這是字元數最少的,在所有的瀏覽器中不會導致跳到頁面頭部的錨點。

這麼寫沒什麼不好的,表明該部分的外觀像鏈接,滑鼠需要手型,需要響應點擊,但沒有實際動作。用來替代href="#"。這種寫法實質上並不算做html混雜js。

慎用void(0)

      無論是用#還是void(0),有一個共同的缺點是:這樣做就讓這個行為,必須啟用js才能實作。別笑,雖然說大多數人是載入js的,但也不能排除連線故障等意外,或真的有少數狂人不用js。另外,js也不能被搜尋引擎所跟踪,這是一個需要考慮的問題。 從這個意義上講,#甚至更差一些,因為單獨的#在語義上,其實隱含著指向了網頁自己,如果使用「在新標籤頁中開啟」時就會產生迷惑。而這個問題void(0)沒有。 【相關推薦】

1. 特別推薦

「php程式設計師工具箱」V0.1版本下載2.

解決ie6下javascript:void(0) 無效的方法###############3. ###Javascript中的運算子void(0)的定義與詳解######

4. 總結href=javascript:void(0)與href=#之間的差異

以上是謹慎使用javascript:void(0),為什麼這樣寫不好的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn