addEventListener但是不调removeEventListener引发的“惨案“

Bug症状
在B页面点击a标签下载文件,却在下载成功后调用了A页面的几个http请求。看得我直呼好家伙!

寻找病理:

  //点击下载按钮调用此方法下载文件
  static downloadFileByUrl(url: string) {
    const urlObject: any = window.URL || window;
    let saveLink: any = document.createElement("a");
    saveLink.href = url;
    saveLink.download = url.replace(/^.*\//g, "");
    saveLink.click(); // 发现注释掉它就不会再调A页面的请求了  
  }

可是注释了click方法,我的下载功能就歇了…

那么换种思路找原因——A页面中都是何时调用了这几个http请求:

 const events = ["beforeunload", "popstate", "unload"] 
 // window监听 + 处理
 handleListener(e) {
    e.preventDefault()
    this.exitEdit() // 就是这个方法里调用了那些http请求
  },
  // 浏览器前进、后退、刷新导致的退出详情编辑
  onWindowOpt() {
    events.forEach(item => {
      window.addEventListener(item, this.handleListener)
    })
  }

原来在A页面,是在浏览器前进、后退和刷新的时候触发了那些请求。
== ,我在离开A页面去到B页面的过程中还经过了别的页面,怎么就没触发浏览器的监听呢?
思索片刻:o!因为这些页面的跳转都只是路由的跳转,没有浏览器的前进、后退和刷新。
再等等,为什么我利用a标签的click下载文件就会触发浏览器的监听了呢?
Google片刻:噢!我给a标签设置了href属性,href属性是链接时,点击a标签,浏览器会执行跳转操作,只是默认在当前tab页展示 href 属性指定的 URL 所表示的文档。

快速治虫:
很简单,就是把监听过的浏览器事件全都removeEventListener

  const events = ["beforeunload", "popstate", "unload"]
  // 销毁页面之前,取消所有对window的监听
  beforeDestroy() {
    events.forEach(item => {
      window.removeEventListener(item, this.handleListener)
    })
  },

总结:有头没尾的事情干多了就会这样…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值