2022-10-17 11:05:32
提升window.addEventListener事件监听器执行优先级的核心方法是利用capture参数,将监听器设置为捕获阶段触发,从而优先于冒泡阶段的监听器执行。
具体实现方式使用布尔值设置capture参数
addEventListener的第三个参数默认为false,表示监听器在冒泡阶段触发。
若设置为true,监听器会在捕获阶段执行,优先级更高。
代码示例:window.addEventListener("click", () => console.log("默认优先级(冒泡阶段)"));window.addEventListener("click", () => console.log("最高优先级(捕获阶段)"), true);即使第二个监听器后添加,由于capture: true,它仍会在捕获阶段优先执行。
使用对象参数设置capture属性
可以通过对象作为第三个参数,显式指定capture: true,效果与布尔值相同。
代码示例:window.addEventListener("click", () => console.log("默认优先级(冒泡阶段)"));window.addEventListener("click", () => console.log("最高优先级(捕获阶段)"), { capture: true });
捕获阶段:从window向下传播到目标元素。
目标阶段:事件到达目标元素。
冒泡阶段:从目标元素向上冒泡到window。
捕获阶段的监听器(capture: true)优先于冒泡阶段的监听器(capture: false)执行。
同阶段内,先注册的监听器先执行(遵循注册顺序)。
capture: true仅将监听器提前到捕获阶段,但同一阶段内的执行顺序仍由注册时间决定。
需要优先处理某些逻辑(如阻止默认行为、拦截事件)时,捕获阶段更合适。
大多数常规逻辑(如UI交互)可放在冒泡阶段。
所有现代浏览器均支持此特性,无需额外兼容处理。
若需监听器仅执行一次,可添加{ capture: true, once: true },避免手动移除。
通过removeEventListener和重新注册,可动态修改监听器的capture属性以调整优先级。
通过合理利用capture参数,可以精准控制事件监听器的执行顺序,优化代码逻辑。