事件冒泡
从内往外冒泡
事件捕获
从最外层向内捕获
事件流
事件捕获->事件处理程序->事件冒泡
addEventListener()和 removeEventListener()方法
它们接收 3 个参数:事件名、事件处理函 数和一个布尔值,true 表示在捕获阶段调用事件处理程序,false(默认值)表示在冒泡阶段调用事 件处理程序
let btn = document.getElementById("myBtn");
btn.addEventListener("click", () => { console.log(this.id); }, false);
使用removeEventListener方法移除事件时第二个参数不能为匿名参数,正确使用如下:
let btn = document.getElementById("myBtn");
let handler = function() { console.log(this.id); };
btn.addEventListener("click", handler, false);
btn.removeEventListener("click", handler, false);
冒泡兼容性更好,多数浏览器都支持,为了最好的兼容性,一般在冒泡阶段处理程序
把事件处理程序注册到捕获阶段通常用于在事件到达其指定目标之前拦截事件。如果不需要拦截,则不要使用事件捕获。
常用的方法
event.preventDefault();取消默认行为
event.stopPropagation();取消后续的事件捕获或冒泡
event.eventPhase; 可用于获得事件是在事件流的那个阶段被触发的
事件委托
事件委托利用事件冒泡,可以只使用一个事件 处理程序来管理一种类型的事件。
因为所有列表项都是这个 元素的后代,所以它们的事件会向上冒泡,最终都会由这个函数来处理