先捕获的必然是父节点, 然后一层层向下捕获, 然后一层层向上冒泡
这里是一个 td 被点击的效果图
通过三个阶段:
onXXX(event)
addEventListener(event, handler)
elem.on(event, selector, handler)
这里有几点需要注意的:
event.target
: 发起 event 的 elemthis
: 当前 elem
onXXX()
或者addEventListener(event, handler)
绑定的事件无法接触到捕捉阶段
, 他们只会响应第二和第三阶段addEventListener(event, handler)
的最后一个函数: false
: handler 放置在冒泡阶段true
: handler 放置在捕捉阶段elem.on(event, selector, handler)
, 只需要return false
可以既阻止默认事件, 又防止冒泡一般不需要阻止冒泡, 因为阻止冒泡之后,可能影响其他事件捕捉机制
组织冒泡的核心在于这个函数:event.stopPropagation()
阻止冒泡之后, 事件将不会继续传递
下面这一段就不会调用到body
的onclick
<body onclick="alert(`the bubbling doesn't reach here`)">
<button onclick="event.stopPropagation()">Click me</button>
<!-- 错误的例子,这个仅仅阻止了默认事件 -->
<!-- <button onclick="return false;">Click me</button> -->
</body>
另外几种阻止冒泡的用法:
// 既阻止冒泡, 又阻止默认事件, 仅仅对于`elem.on(event, selector, handler)`有效
// $("#div1").on('click',function(){
// return false;
// });
//以下两种情况阻止事件冒泡
//oEvent.cancelBubble = true;
//oEvent.stopPropagation();
//以下两种情况阻止默认行为, 没有停止冒泡
//没有停止冒泡
//oEvent.preventDefault();
//return false;