2011-09-29 63 views

回答

48

cancelBubble是服務於相同的目的的其他瀏覽器stopPropagation()方法,這是爲了防止事件移動到其下一個目標(稱爲「鼓泡」的時候,事件的IE-只有布爾屬性(未法)是從內部到外部的元素,這是事件在IE < 9中傳播的唯一方式)。 IE 9現在支持stopPropagation(),所以cancelBubble最終會過時。與此同時,下面是一個跨瀏覽器的功能,以阻止事件傳播:

function stopPropagation(evt) { 
    if (typeof evt.stopPropagation == "function") { 
     evt.stopPropagation(); 
    } else { 
     evt.cancelBubble = true; 
    } 
} 

在事件處理函數,可以按如下方式使用它:

document.getElementById("foo").onclick = function(evt) { 
    evt = evt || window.event; // For IE 
    stopPropagation(evt); 
}; 
+0

也許是次要的,但是如果你打算把'stopPropagation'作爲一個函數來調用,那麼和'!= undefined''相比,它是否更好地用'==「函數來測試它呢? –

+0

@ ingredient_15939:問題是某些瀏覽器中的主機對象的某些方法(大多數舊版本的IE)不會從'typeof'返回''function「'。但是,對於事件對象的情況,你是對的,假設'stopPropagation'(如果存在)將返回'「function」'是安全的。 –

1

另一個不同之處在於,任何人都描述過,e.cancelBubble僅在冒泡階段(當事件到達第一個冒泡元素時)停止事件傳播,而.preventDefault()阻止捕獲和冒泡階段的傳播(緊接着爲下一個元素傳播)。

var a = document.getElementById('a'); 
 
var b = document.getElementById('b'); 
 
var c = document.getElementById('c'); 
 
var d = document.getElementById('d'); 
 

 
a.addEventListener('click',cancel,true); 
 
b.addEventListener('click',cancel,true); 
 
c.addEventListener('click',cancel,false); 
 
d.addEventListener('click',cancel,false); 
 

 

 
function cancel(event){ 
 
    var logElem = event.currentTarget.id; 
 
    console.log(logElem); 
 
    if(logElem==='a') event.cancelBubble = true; 
 
    
 
} 
 

 

 
var e = document.getElementById('e'); 
 
var f = document.getElementById('f'); 
 
var g = document.getElementById('g'); 
 
var h = document.getElementById('h'); 
 

 
e.addEventListener('click',stop,true); 
 
f.addEventListener('click',stop,true); 
 
g.addEventListener('click',stop,false); 
 
h.addEventListener('click',stop,false); 
 

 

 
function stop(event){ 
 
    var logElem = event.currentTarget.id; 
 
    console.log(logElem); 
 
    if(logElem==='e') event.stopPropagation(); 
 
    
 
}
#a,#b,#c,#d,#e,#f,#g,#h{ 
 
    box-sizing:border-box; 
 
    width:100%; 
 
    height:90%; 
 
    border:solid 1px #33aaff; 
 
    padding:10px; 
 
    padding-top:0px; 
 
    cursor:pointer; 
 
} 
 

 
#a,#e{ 
 
    width:200px; 
 
    height:200px; 
 

 
}
<h3>cancelBubble</h3> 
 
<div id='a'>a capturing 
 
    <div id='b'>b capturing 
 
    <div id='c'>c bubbling 
 
     <div id='d'>d bubbling 
 
     </div> 
 
    </div> 
 
    </div> 
 
</div> 
 

 
<h3>stopPropagation</h3> 
 
<div id='e'>e capturing 
 
    <div id='f'>f capturing 
 
    <div id='g'>g bubbling 
 
     <div id='h'>h bubbling 
 
     </div> 
 
    </div> 
 
    </div> 
 
</div>