[踩坑]vue中mouseup选中文本和click点击事件冲突,阻止冒泡不生效

需求:
dom元素绑定了click事件,但是在选中文本的时候,不能触发click点击事件

例:

<div @click="openDetail">这里是可以选中复制的文字</div>

以上代码,选中dom中的文本时,会触发openDetail方法;

理想状态:
一开始以为很简单,选中文本松开鼠标后会触发mouseup事件,给mouseup加阻止冒泡是不是就行了

<div @click="openDetail" @mouseup.stop>这里是可以选中复制的文字</div>

测试表明,仅仅这样并不能解决问题;

解决思路:
1.绑定mousedown和mouseup,分别记录触发时的时间戳;
2.获取选中文本;
3.鼠标点击和抬起的时间差<200,或者选中文本为空时,可以触发点击事件,否则就是选中文本;

具体方法:

<div @click="openDetail" @mousedown="mouseDownFn" @mouseup="mouseUpFn">
	这里是可以选中复制的文字
</div>

data中定义变量:

data: function() {
	return {
		clickObj: {
			firstTime: '', // mousedown的时间戳
			lastTime: '', // mouseup的时间戳
			selectionTxt: '', // 选中的文本
			isClick: false, // false--禁止点击,true--可点击
		}
	}
}

methods方法定义:

methods: {
	mouseDownFn: function () {
	    this.clickObj.firstTime = new Date().getTime()
    },
    mouseUpFn: function () {
    	this.clickObj.lastTime = new Date().getTime()
    	// 获取选中文本
        this.clickObj.selectionTxt = window.getSelection().toString()
        // 鼠标点击和抬起的时间差<200,或者选中文本为空时,可以触发点击
        if((this.clickObj.lastTime - this.clickObj.firstTime) < 200 
        	|| $.trim(this.clickObj.selectionTxt) == ''){
            this.clickObj.isClick = true
        } else {
            this.clickObj.isClick = false
       	}
    },
    openDetail: function () {
    	if (!this.clickObj.isClick) return
        this.clickObj.firstTime = ''
        this.clickObj.lastTime = ''
        this.clickObj.isClick = false
        if($.trim(this.trClick.selectionTxt) != '') {
        	this.trClick.selectionTxt = ''
        	return
        }
        // .....
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值