關於js中return false、event.preventDefault()和event.stopPropagation()區別,以及阻止事件冒泡和阻止預設事件
阿新 • • 發佈:2018-12-04
在平時專案中,如果遇到需要阻止瀏覽器預設行為,大家經常會用return false;和event.preventDefault()來阻止,但對它倆的區別還是模糊,這裡順便帶上event.stopPropagation()一起區分下。
事件處理程式的返回值只對通過屬性註冊的處理程式才有意義,如果我們未通過addEventListener()函式來繫結事件的話,若要禁止預設事件,用的就是return false; 但如果要用addEventListener()或者attachEvent()來繫結,就要用preventDefault()方法或者設定事件物件的returnValue屬性。
HTML5 Section 6.1.5.1 of the HTML Spec規範定義如下:
Otherwise If return value is a WebIDL boolean false value, then cancel the event.翻譯:
否則
如果返回值是一個WebIDL布林值假值,則取消該事件。
而H5規範中為什麼要OtherWise來強調return false,因為規範中有指出在mouseover等幾種特殊事件情況下,return false;並不一定能終止事件。所以,在實際使用中,我們需要儘量避免通過return false;的方式來取消事件的預設行為。
總結:
- event.stopPropagation(); // 這是阻止事件的冒泡方法,不讓事件向documen上蔓延,但是預設事件仍然會執行,當你掉用這個方法的時候,如果點選一個連線,這個連線仍然會被開啟
- event.preventDefault(); // 這是阻止預設事件的方法,呼叫此方法是,連線不會被開啟,但是會發生冒泡,冒泡會傳遞到上一層的父元素;
- return false; 事這個方法比較暴力,他會同時阻止事件冒泡也會阻止預設事件;寫上此程式碼,連線不會被開啟,事件也不會傳遞到上一層的父元素;可以理解為return false就等於同時呼叫了event.stopPropagation()和event.preventDefault()
例如:
想要禁止右鍵,是有自己的一個事件,叫做oncontextmenu。(oncontextmenu 事件在元素中使用者右擊滑鼠時觸發並開啟上下文選單。)
document.addEventListener('contextmenu', function(event) {
event.preventDefault();
}, false);
document.oncontextmenu = function(event) {
return false;
}
附:
event.preventDefault()方法並不被ie支援,在ie下需要用window.event.returnValue = false; 來實現。一般都是這樣寫,程式碼如下:
function stopDefault( e ) {
if ( e && e.preventDefault ){
e.preventDefault(); //支援DOM標準的瀏覽器
} else {
window.event.returnValue = false; //IE
}
}