JS拖拽时禁止点击事件的三种方法

做项目的时候碰到一个问题,表格列头点击排序,但是拖动列排序的时候也会触发表头的单击事件,找了一圈,大致都是两种思路,但是原理都一样。

就是js点击事件和拖拽事件都会执行mousedown(鼠标按下)和mouseup(鼠标释放)两个事件,拖拽多了个mousemove

那么就衍生了两种方法

  1. mousedown记住鼠标按下的时间戳,然后在mouseup用鼠标释放的时间戳与之比较,少于150毫秒就触发单击事件
  let doClick(){
	//doSomething
  }


  let startTime = 0

  const onSortMouseDown = (e) => {
    startTime = e.timeStamp
  }

  const onSortMouseUp = (e) => {
    if (startTime) {
      let diffTime = e.timeStamp - startTime
      diffTime < 150 && doClick() //小于150就执行单击操作
      startTime = 0
    }
  }
  1. 第二种则是比较mousedown和mouseup的鼠标位置的偏移量
  let startDot = {}
  
  const onSortMouseDown = (e) => {
    startDot.x = e.screenX
    startDot.y = e.screenY
  }

  const onSortMouseUp = (e) => {
    if (startDot.x && startDot.y) {
      let difX = e.screenX - startDot.x
      let difY = e.screenY - startDot.y
      let difD = Math.sqrt(difX * difX + difY * difY)
      if (difD >= 0 && difD < 5) { //偏移量在0~5之间就执行单击操作
        doClick()
      }
    }
  }
  1. 第三种是从mousemove下文章,因为单击不会触发mousemove,在里面设置个标识表示拖拽,在mouseup里面做判断,这种可能需要动态监听移除事件,不然在鼠标放在目标元素上mousemove事件会一直触发

   let isClick = true

  const onSortMouseMove = (e) => {
    isClick = false
    console.log('onSortMouseMove')
  }

  const onSortMouseDown = (e) => {
    document.getElementById('jianting').addEventListener('mousemove',onSortMouseMove) //按下时监听
  }

  const onSortMouseUp = (e) => {
    if (isClick === true) {
      doClick()
    } else {
      isClick = true
    }
    document.getElementById('jianting').removeEventListener('mousemove',onSortMouseMove) //释放时取消监听
  }
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值