1. 程式人生 > >關於js中return false、event.preventDefault()和event.stopPropagation()區別,以及阻止事件冒泡和阻止預設事件

關於js中return false、event.preventDefault()和event.stopPropagation()區別,以及阻止事件冒泡和阻止預設事件

在平時專案中,如果遇到需要阻止瀏覽器預設行為,大家經常會用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;的方式來取消事件的預設行為。 

總結:

  1. event.stopPropagation(); // 這是阻止事件的冒泡方法,不讓事件向documen上蔓延,但是預設事件仍然會執行,當你掉用這個方法的時候,如果點選一個連線,這個連線仍然會被開啟
  2. event.preventDefault(); // 這是阻止預設事件的方法,呼叫此方法是,連線不會被開啟,但是會發生冒泡,冒泡會傳遞到上一層的父元素;
  3.  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
   } 
}