今天解决了一个画板独立的 bug,具体表现为当切换了画板的 tab 时,触发 wheel 事件会导致所有画布一起缩放。

后来查看 console 中的 eventListener 发现切换一个 tab 就会在 window 上添加一个事件,原因归结于我在 window.addEventListener 的事件上添加了属性:

1
2
3
4
window.addEventListener("wheel", handleSize, {
  passive: false,
  capture: true,
});

但是 removeEventListener 上并没有添加相应的属性:

1
window.removeEventListener("wheel", handleSize);

所以就根本没有 remove 掉…

那为什么没有在 remove 的时候加上相应的属性呢,因为起初是这么加的:

1
2
3
4
5
6
7
8
window.removeEventListener("wheel", handleSize, {
  passive: false,
  capture: true,
});

// error: 类型“{ passive: boolean; capture: true; }”的参数不能赋给类型“boolean | EventListenerOptions | undefined”的参数。
// 对象文字可以只指定已知属性,并且“passive”不在类型“EventListenerOptions”中。
// 类型“{ passive: boolean; capture: true; }”的参数不能赋给类型“boolean | EventListenerOptions | undefined”的参数。

对,没看完报错信息就以为 { capture: true } 加上也没用了… 实际上应该这么写:

1
2
3
window.removeEventListener("wheel", handleSize, {
  capture: true,
});

这件事情告诉我们什么呢,不要想当然。官网文档在这里:EventTarget.removeEventListener()