任何人都可以告诉我在JavaScript中使用cancelBubble
和stopPropagation
方法的区别。CancelBubble和stopPropagation有什么区别?
回答
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);
};
也许是次要的,但是如果你打算把'stopPropagation'作为一个函数来调用,那么和'!= undefined''相比,它是否更好地用'==“函数来测试它呢? –
@ ingredient_15939:问题是某些浏览器中的主机对象的某些方法(大多数旧版本的IE)不会从'typeof'返回''function“'。但是,对于事件对象的情况,你是对的,假设'stopPropagation'(如果存在)将返回'“function”'是安全的。 –
,以兼容IE8和旧的使用.cancelBubble
如果.stopPropogation()
未定义:
if(ev.stopPropagation)ev.stopPropagation();
else ev.cancelBubble=true; // where ev is an event object
阅读有关MSDN:http://msdn.microsoft.com/en-us/library/ff975961%28v=vs.85%29.aspx
另一个不同之处在于,任何人都描述过,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>
- 1. 有什么区别`和$(Bash中有什么区别?
- 2. ==和===有什么区别?
- 3. ==和===有什么区别?
- 4. 有什么区别? :和||
- 5. ==和===有什么区别?
- 6. '=='和'==='有什么区别?
- 7. `&`和`ref`有什么区别?
- 8. 有什么区别:。!和:r!?
- 9. | 0和~~有什么区别?
- 10. Appender和〜有什么区别?
- 11. xtype和别名有什么区别?
- 12. 有什么区别
- 13. 有什么区别
- 14. 有什么区别?
- 15. 有什么区别?
- 16. 有什么区别?
- 17. 有什么区别
- 18. 有什么区别?
- 19. 有什么区别?
- 20. 有什么区别
- 21. 有什么区别
- 22. Microsoft.AspNet.WebApi.OData和Microsoft.Data.OData和Microsoft.AspNet.OData有什么区别?
- 23. Viterbi CYK和Probabilistic CYK算法有什么区别,有什么区别吗?
- 24. Erlang的Ports和RPC有什么区别?
- 25. debug.write和Trace.write有什么区别?
- 26. LocalContainerEntityManagerFactoryBean和LocalEntityManagerFactoryBean有什么区别?
- 27. 数组和ArrayList有什么区别?
- 28. URI.escape和CGI.escape有什么区别?
- 29. rebar和rebar3有什么区别?或erlang.mk
- 30. 960.gs/Blueprint和LESS有什么区别?
他们是一样的,除了'cancelBubble'是IE只retardedness,和'stopPropagation'是标准配置。 – Zirak