Javascript 带esc键关闭弹出窗口的VanillaJS问题

Javascript 带esc键关闭弹出窗口的VanillaJS问题,javascript,Javascript,所以如果你去这里 然后单击第一个按钮,然后关闭弹出窗口即可 如果再次单击按钮,然后关闭弹出窗口,则控制台中会出现错误: 未捕获的TypeError:无法读取null的属性“removeChild” 源代码可以在浏览器中调试,有问题的行是SolarPopup.ts:122,或者可以在github中看到 仅当按下ESC键并按下x时,才会发生此情况无问题: 如果使用调试器暂停销毁方法,则无法复制问题。TL;RD 代码正在调用SolarPopup的当前和所有旧实例的destroyBoundWithThi

所以如果你去这里 然后单击第一个按钮,然后关闭弹出窗口即可 如果再次单击按钮,然后关闭弹出窗口,则控制台中会出现错误: 未捕获的TypeError:无法读取null的属性“removeChild”

源代码可以在浏览器中调试,有问题的行是SolarPopup.ts:122,或者可以在github中看到

仅当按下ESC键并按下x时,才会发生此情况无问题:

如果使用调试器暂停销毁方法,则无法复制问题。

TL;RD

代码正在调用
SolarPopup的当前和所有旧实例的
destroyBoundWithThis
方法

注意:第一次使用ESC工作正常,不会引发任何错误

发生此错误的原因是,注册用于处理
“keyup”
事件的函数(是的,每个
SolarPopup
实例都有一个新的函数)正在调用
destroyBoundWithThis
以获取对
solarpop
的已“销毁”实例的旧引用,这些实例并没有真正消失,只是从DOM中分离出来(因此他们不再有
父元素了)

document.addEventListener(

“加密”,//谢谢,我想可能是这样的,因为很多框架让我们忘记了香草。我确实认为旧实例应该被垃圾收集,因为它不是DOM的一部分,但很明显,当时它仍然没有被收集。这解释了为什么一次不会出现两个以上的错误,它没有发生在删除之前使用断点进行en调试。
document.addEventListener(
  "keyup", // <=== registers a new handler for every instance
  function(event) {
    if (event.keyCode === KeyCodes.ESC) {
      this.destroyBoundWithThis()
    }
  }.bind(this) // <=== this could point to "destroyed" instances
)