1. 程式人生 > >js中的return false 、event.preventDefault()和event.stopPropagation()

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;}
}