js中的return false 、event.preventDefault()和event.stopPropagation()
原文地址:https://www.cnblogs.com/momo798/p/6025777.html
作用:阻止瀏覽器預設行為。
事件處理程式的返回值只對通過屬性註冊的處理程式才有意義,如果我們未通過addEventListener()函式來繫結事件的話,若要禁止預設事件,用的就是return false; 但如果要用addEventListener()或者attachEvent()來繫結,就要用preventDefault()方法或者設定事件物件的returnValue屬性。
例項:
滑鼠被按下後,mousedown事件被觸發。
事件先從document->ancestor element->...->parent->event.target(在此元素上按下的滑鼠)->parent->...->ancestor element->document.
事件走了一個迴圈,從documet到event.target再回到document,從event.target到document的過程叫做冒泡。
event.stopPropagation(); // 事件停止冒泡到,即不讓事件再向上傳遞到document,但是此事件的預設行為仍然被執行,如點選一個連結,呼叫了event.stopPropagation(),連結仍然會被開啟。
event.preventDefault(); // 取消了事件的預設行為,如點選一個連結,連結不會被開啟,但是此事件仍然會傳遞給更上一層的先輩元素。
在事件處理函式中使用 return false; 相當於同時呼叫了event.stopPropagation()和event.preventDefault(),事件的預設行為不會被執行,事件也不會冒泡向上傳遞。
此時在jQuery中,return false;就不是簡單的覆蓋面和規範的問題了。在jQuery事件處理函式中呼叫return false;相當於同時呼叫了preventDefault和stopPropagation方法,這會導致當前元素的事件無法向上冒泡,在事件代理模式下,會導致問題。
比如,我有一個div容器,裡面是 幾個a標籤,它們的href裡分別儲存了url地址,這個url被用來動態的載入到下面的div#content中,這裡為了簡單演示,就只把url字串寫入到div#content中:
<div id="container"> <a href="/content1.html">content1</a> <a href="/content2.html">content2</a> <div id="content">我會根據點選連結的url不同而改變的</div> </div>
// 為container下的所有a標籤繫結click事件處理函式
$("#container").click(function (e) {
if (e.target.nodeName == "A") {
$("#content").html(e.target.href);
}
});
// 再為a標籤繫結click事件處理函式,阻止預設事件
$("#container a").click(function () {
return false;
});
上面的程式碼執行後,雖然阻止了a標籤的點選預設行為,但同時停止了冒泡事件,導致其外層的父元素無法檢測到click事件,所以jQuery中需要明白return false;和event.preventDefault()二者的區別。
即儘量不要用return false;來阻止event的預設行為。
附:
event.preventDefault()方法並不被ie支援,在ie下需要用window.event.returnValue = false; 來實現。一般都是這樣寫,程式碼如下:
function stopDefault( e ) {
if ( e && e.preventDefault ){
e.preventDefault(); //支援DOM標準的瀏覽器
} else {
window.event.returnValue = false; //IE
}
}
也可以處理ie || firefox下圖片拖動的問題。
document.onmousemove=function(ev){ var oEvent=ev||event; if(oEvent.preventDefault){oEvent.preventDefault();} else{oEvent.returnValue=false;} }