记录下 typescript 中 使用 removeEventListener 时无法去除事件句柄,导致 removeEventListener 失效

之前在写utils的时候遇到个问题,在ts中定义一个类里面使用 addEventListener 添加事件句柄,但是 removeEventListener的时候失效了。无法移出事件句柄,所以记录下 解决办法

interface Position {x: number, y: number}
class Test {
	private position: Position = {x: 0, y: 0}
	constructor () {
		this._init()
	}
	// 初始化移动事件
	private _init () {
		// 鼠标按下的时候增加事件句柄
		document.addEventListener('mousedown', () => {
			document.addEventListener('mousemove', this._dragMoving.bind(this))
		})
		// 鼠标松开的时候移出事件句柄
		document.onmouseup = (ev: MouseEvent) => {
            document.removeEventListener('mousemove', this._dragMoving.bind(this))
        }
	}
	// 移动事件逻辑
	private _dragMoving (e: MouseEvent) {
		this.position.x = e.clientX
		this.position.y = e.clientY
	}
}

运行之后发现,鼠标按下之后,开始记录坐标,松开之后坐标还在继续记录。removeEventListener 失效了

解决办法~

// ...省略
	private _init () {
	
		// 将事件提取出来即可
		const _dragMoving = this._dragMoving.bind(this)
		
		// 鼠标按下的时候增加事件句柄
		document.addEventListener('mousedown', () => {
			document.addEventListener('mousemove', _dragMoving)
		})
		// 鼠标松开的时候移出事件句柄
		document.onmouseup = (ev: MouseEvent) => {
		          document.removeEventListener('mousemove', _dragMoving)
		      }
		}
// ...

我们需要在绑定事件之前将事件提取出来,如果需要使用 this,需要使用bind修改this指向

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值