浏览器的捕获过程和冒泡过程
捕获过程跟冒泡过程总是先后发生
以下代码展示了事件传播顺序:
<body>
<input id="i"/>
</body>
document.body.addEventListener("mousedown", () => {
console.log("key1")
}, true)
document.getElementById("i").addEventListener("mousedown", () => {
console.log("key2")
}, true)
document.body.addEventListener("mousedown", () => {
console.log("key11")
}, false)
document.getElementById("i").addEventListener("mousedown", () => {
console.log("key22")
}, false)
我们监听了body和一个body的子元素上的鼠标按下事件,捕获和冒泡分别监听,可以看到,最终产生的顺序是:
“key1”
“key2”
“key22”
“key11”
addEventListener 添加事件
事件名称;
事件处理函数;
捕获还是冒泡。
事件处理函数不一定是函数,也可以是个JavaScript具有handleEvent方法的对象,看下例子:
var o = {
handleEvent: event => console.log(event)
}
document.body.addEventListener("keydown", o, false);
第三个参数不一定是bool值,也可以是个对象,它提供了更多选项。
once:只执行一次。
passive:承诺此事件监听不会调用preventDefault,这有助于性能。
useCapture:是否捕获(否则冒泡)。
实际使用,在现代浏览器中,还可以不传第三个参数,我建议默认不传第三个参数,因为我认为冒泡是符合正常的人类心智模型的,大部分业务开发者不需要关心捕获过程。除非你是组件或者库的使用者,那就总是需要关心冒泡和捕获了。