a href="" 和 href="#" 以及 href="javascript:void(0)"時 以及其中的 onclick 的區別

今天遇到一個問題,代碼如下:

<div class="moblie right" id="moblie" style="position:absolute; bottom:0;">
        <a href="" id="closeMoblie" οnclick="closeMoblie();" ><img alt="" src="image/index/closeMoblie.png" /></a>
 </div>

function closeMoblie(){
document.getElementById("moblie").style.display = "none";
}

當點擊的時候會閃一下,但是不會消失,爲什麼呢?

首先,注意到的是href="",其實平時都會寫成href=“#”的,那麼有什麼不同呢,百度了一下,現在順便也介紹 href="javascript:void(0)"

href="" :默認刷新一下,然後重新鏈接到 本頁

href=“#”:鏈接到本頁頭部,但是不會重新刷新

href="javascript:void(0)":他是一個死鏈接,也就是不會鏈接到任何頁面,以及做任何JavaScript動作

然後,吧href=“”改爲href=“#”真的成功了,同時,頁面滾動到了頭部;

那麼久引出來了一個新問題,是不是再a上發生href和onclick的時候onclick先發生,href後發生呢?

經過幾次實驗,可以肯定了。於是又引出來了一個新問題,是否可以讓href不作爲?當然是可以的啦,方法有很多:

其一:就是用href="javascript:void(0)",他本來就是個死鏈接,看起來就是不作爲的樣子,那麼如何讓他真的不做爲呢?

其二:如果你像上面一樣,再html中使用onclick,那麼就需要在函數調用的後面再調用一個return false,如下:

<a href="" id="closeMoblie" οnclick="closeMoblie(); return false;" ><img alt="" src="image/index/closeMoblie.png" /></a>

此時你可能會想,就算要加return false 爲什麼一定要在html 的a中加呢,反正都要調用closeMoblie(),直接在closeMobile()裏面加就好啦!

可是如果你只是這樣

<div class="moblie right" id="moblie" style="position:absolute; bottom:0;">
         <a href="" id="closeMoblie" οnclick="closeMoblie();" ><img alt="" src="image/index/closeMoblie.png" /></a>
 </div>

function closeMoblie(){
document.getElementById("moblie").style.display = "none";

       return false;
}

這是行不通的,因爲,οnclick=“”的冒號裏面相當於是一個匿名函數的內容,在一個匿名函數裏面調用closeMoblie(),裏面返回的false只是匿名函數中得到的一個值而已,他對a並沒有什麼作用,甚至說,這個值根本就沒被用上,就像這樣

function(){closeMoblie();} 因爲沒有任何變量接收返回的false值,所以false值根本就是個沒用的東西。

除非,你這樣

<a href="" id="closeMoblie" οnclick="return closeMoblie();" ><img alt="" src="image/index/closeMoblie.png" /></a>

function closeMoblie(){
document.getElementById("moblie").style.display = "none";

       return false;
}

此時你可能會想,爲什麼要用return false ,不是還有一個更好的阻止默認行爲的方法嗎,如果你想說的是e.preventDefault(),那麼我告訴你這裏行不通,因爲,e不見了,此時只能用方法三

其三,不在html上加onclick,而只用JavaScript加,如下:

<div class="moblie right" id="moblie" style="position:absolute; bottom:0;">
         <a href="" id="closeMoblie" ><img alt="" src="image/index/closeMoblie.png" /></a>
 </div>

document.getElementById("closeMoblie").οnclick=closeMoblie;

function closeMoblie(){
document.getElementById("moblie").style.display = "none";

}

這樣就行了?這樣就能阻止默認行爲?當然不是,這裏只是告訴你可以這樣加句柄而已,實際上對於句柄,因爲會把 會默認傳輸一個參數e

function closeMoblie(e){
document.getElementById("moblie").style.display = "none";

}

e可以換成任何的其他名字,它就代表着a被點擊這件事,也就是event

此時可以這樣:

function closeMoblie(e){
document.getElementById("moblie").style.display = "none";
if(typeof e.preventDefault === 'function'){ //w3c
e.preventDefault();
e.stopPropagation();
}else{                                                              //ie
e.returnValue=false;
e.cancelBubble=true;

}
}

e.preventDefault() 和 e.returnValue=false 分別是w3c和ie 對阻止默認行爲的定義,而e.stopPropagation和e.cancelBubble=true是阻止冒泡的定義,

在這裏有用的是e.preventDefault() 和 e.returnValue=false 

注:這篇文章裏提到的return false 和 e。stopPropagation的函數都可以具體去了解一下







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章