JS 原生事件绑定,Vue路由变换,事件再次绑定,导致事件绑定两次,无法销毁给单个节点绑定的scroll事件。

本文介绍了JS的addEventListener和on两种事件绑定方式,addEventListener是累加式,on是替换式。在Vue中,使用addEventListener绑定scroll事件到dom节点,因css属性overflow问题,页面销毁时事件无法销毁。而采用on事件绑定可解决节点重复绑定事件的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、绑定事件的两种方式

addEventListener : js原生事件绑定,累加式绑定,可以给一个元素绑定多个相同事件。
on:js事件绑定,替换式绑定,使用 on 的方式绑定事件,一种事件只能绑定一次,绑定多个相同事件,后面的事件会覆盖前面的事件。

二、主要思考的问题如下:

vue当中,如果我们去在onMounted中去采用dom节点的方式去绑定了一个事件,那么我们需不需要在页面销毁时去将这个绑定的事件销毁呢?
从逻辑上来说的话,是需要的。不然就会导致很多问题!

诸如我在项目中碰到的一个问题,scoll滚动事件

其实常常我们scoll绑定主要是绑定在window上的,但是不免得,我们也会绑定在其他的节点上。

如果说我们当前将scoll事件绑定到了一个小滚动窗口上面,采用的方式是addEventListener这种原生的方式进行绑定的话,在路由单页面的情况下就会导致这样一个问题,因为事件是累加的,我们多个页面绑定的节点或许只可能是他们父组件中的同一个节点,但是我们绑定了多次,就会导致一个事件触发多次的问题,那么这个时候我们就应该在onbeforeUnmount页面销毁之前的生命周期钩子中将这个事件去进行销毁。

  onMounted(() => {
    document.querySelect('#xxx').addEventListener('scroll',function(){
    xxxxxxxx
    })
  })

  // 页面销毁之前
  onBeforeUnmount(() => {
		document.querySelect('#xxx').removeEventListener('scroll',function(){
	    xxxxxxxx
	    })
	})

注意上方,我此时并不是给window绑定的scroll事件,而是给单个dom节点绑定的scroll事件,首先代码是没有问题的,当我们去切换路由的时候,当前路由组件也就卸载了,那么onBeforeUnmount事件也就触发了,但是scroll事件却没有销毁,大体的原因如下:
是因为绑定的dom节点设置了css属性overflow:scroll/auto;
从而导致了事件无法销毁,但是我们如果去除了overflow这个属性的话,那么不就没有滚动条了嘛?

三、采用on事件绑定解决问题:

这个时候注意,我们可以用另外一种事件绑定解决当前问题,防止事件多次触发
文章开头,就讲述了两种绑定事件的区别,一种是累加方式的绑定,一种是替换类型的绑定

其实我们主要想要解决的问题是什么呢?就是阻止一个节点,重复绑定多次事件,那么on绑定方式就是可以解决这种问题,因为他是替换式的绑定方式,后绑定的话会替换掉原有的绑定事件,那么这个时候就不会触发上一次绑定的事件了,而是直接替换掉了,问题当然也就解决了。
绑定方式如下:

  onMounted(() => {
    document.querySelect('#xxx').onclick = function(){
    xxxxxxxx
    }
  })


  // 页面销毁之前
  onBeforeUnmount(() => {
		document.querySelect('#xxx').onclick = null
  })
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

归来巨星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值