局部 target 过滤通过聚焦上下文、就近裁决替代全局判定,包括绑定到稳定容器、用 closest 优化遍历、位掩码预编码类型、aabb 空间剔除、状态驱动预筛选等,实现零成本跳过与低开销分类。

用局部 target 过滤替代全局判定,核心是把“全量扫描+统一决策”变成“聚焦上下文+就近裁决”,减少无效计算与状态扩散。这在高频交互、低延迟敏感的场景(如 UI 响应、游戏帧逻辑、实时控制指令分发)中效果显著。
明确 target 的边界与生命周期
全局判定常因 target 泛化而引入冗余判断——比如监听整个 document 的 click 事件再逐层比对 target.className。应提前收束作用域:
- 绑定事件到最接近的稳定容器(如
#chat-panel而非document),让浏览器原生事件冒泡路径变短 - 用
Element.closest(selector)替代手动遍历父节点,它在底层做了优化,且语义清晰 - 对动态插入的元素,优先使用事件委托 + 局部 selector 匹配,而非为每个新元素重复绑定
用位掩码或枚举值预编码 target 类型
避免字符串匹配或多次 instanceof 判断。将常见 target 类别映射为整数位标志:
- 例如:
const TYPE_BUTTON = 1 - 为每个 DOM 元素通过
dataset.typeCode或 WeakMap 缓存其类型码 - 处理时直接
if (targetCode & TYPE_BUTTON),单次位运算完成分类,无分支预测开销
基于视觉区域做空间过滤
在拖拽、手势、画布操作等场景中,“是否在 target 内”不一定要走完整 hit-test 流程:
- 对矩形 target,先用 boundingClientRect 做 AABB 快速剔除(仅需 4 次浮点比较)
- 对圆形或简单多边形,预计算包围盒 + 中心距平方阈值,跳过 Math.sqrt
- 对高频更新的 target(如游戏中的可交互 NPC),维护一个空间哈希网格,只检查邻近格子内的候选者
状态驱动的 target 预筛选
很多判定失败是因为 target 当前不可交互(禁用、隐藏、权限不足)。与其每次触发都检查所有条件,不如把状态变化转为局部信号:
- 当按钮
disabled=true时,同步置位其data-state-flag="0x04" - 交互函数开头加
if ((flag & 0x04) !== 0) return;,零成本跳过 - 结合 MutationObserver 监听关键属性变更,只在真正需要时刷新 flag,避免轮询
不复杂但容易忽略:局部过滤不是简单“缩小范围”,而是把判定逻辑下沉到数据产生或状态变更的最近点,让执行时只需查表或位算,不查文档、不遍历、不解析。










