vue中解决拖动和点击事件的冲突

BUG说明:

鼠标上下方向拖拽,如果松开时鼠标位于悬浮按钮上会默认执行click事件,经验证,click事件与mouse事件的执行顺序为onmousedown =》onmouseup =》onclick,意味着在click事件执行时会与与其相关的mouse事件冲突。

解决方案:
因为click事件执行时间短,所以利用鼠标拖动的时间差作为标志,在拖拽事件中计算鼠标从onmousedown 到onmouseup 所用的时间差,与200ms作比较,作为全局变量。由于vue的directives自定义指令中无法使用this,所以个人采用给元素设置属性的方式来解决全局变量的存储问题。

1、自定义拖拽指令
说明:指令中没有this关键字,指令中通过el可以直接拿到指令绑定的元素;

directives: {
drag: {
// 指令的定义
bind: function (el) {
let odiv = el; //获取当前元素
let firstTime=‘‘,lastTime=‘‘;
odiv.onmousedown = (e) => {
document.getElementById(‘dragbtn‘).setAttribute(‘data-flag‘,false)
firstTime = new Date().getTime();
// 算出鼠标相对元素的位置
let disY = e.clientY - odiv.offsetTop;
document.onmousemove = (e) => {
// 用鼠标的位置减去鼠标相对元素的位置,得到元素的位置
let top = e.clientY - disY;
// 页面范围内移动元素
if (top > 0 && top < document.body.clientHeight - 48) {
odiv.style.top = top + ‘px‘;
}
};
document.onmouseup = (e) => {
document.onmousemove = null;
document.onmouseup = null;
// onmouseup 时的时间,并计算差值
lastTime = new Date().getTime();
if( (lastTime - firstTime) < 200){
document.getElementById(‘dragbtn‘).setAttribute(‘data-flag‘,true)
}
};
};
}
}
},
2、悬浮菜单点击事件中进行验证。

click(e) {
// 验证是否为点击事件,是则继续执行click事件,否则不执行
let isClick = document.getElementById(‘dragbtn‘).getAttribute(‘data-flag‘);
if(isClick !== ‘true‘) {
return false
}            //之后都是被阻止的代码
if (!localStorage.settings) {
return this.$message.error(‘请选择必填项并保存‘);
}
if (this.right === -300) {
this.right = 0;
this.isMask = true;
} else {
this.right = -300;
this.isMask = false;
}
}

原文地址:https://www.cnblogs.com/xiaoleilei123/p/10669835.html

时间: 2024-10-24 00:41:22

vue中解决拖动和点击事件的冲突的相关文章

vue 支持IE,回车点击事件

上几篇文章说过了,最近在做vue 项目,由于项目前端人员紧张,所以身为后台人员的我也做了一下前端工作,而在使用vue 过程中遇得了一些小问题,下面针对这些问题做一些记录 一.vue 支持IE问题, 由于Chrome 浏览器的强大简洁,所以大部分开发人员都在使用Chrome 浏览器做开发和调试,但是在上线后要兼容许多其他浏览器 最普遍的就是IE浏览器兼容问题,那么如何使用vue兼容IE呢 1.安装 babel-polyfill npm install --save babel-polyfill 2

Vue中解决路由切换,页面不更新的实用方法

前言:vue-router的切换不同于传统的页面的切换.路由之间的切换,其实就是组件之间的切换,不是真正的页面切换.这也会导致一个问题,就是引用相同组件的时候,会导致该组件无法更新,也就是我们口中的页面无法更新的问题了. 一.问题呈现 在路由中进行切换结果 这时候会发现input标签的value值并没有随着路由的改变而改变.并没有更新 二.解决方案① 给<router-view :key="key"></router-view>增加一个不同:key值,这样vue

Android中Button四种点击事件实现方式

1.Xml添加监听属性,这里添加的doClick. 1 <Button 2 android:id="@+id/bt1" 3 android:layout_width="wrap_content" 4 android:layout_height="wrap_content" 5 android:onClick="doClick" 6 android:text="XML添加doClick" 7 andro

使用ClickableSpan轻松实现一段文本中的多个点击事件

项目需求需要实现如上布局:红圈内都有点击事件且颜色不一样. 1. 初始考虑用多个textview拼接,但是用普通线性和相对布局,无法实现换行,谷歌发现有现成的轮子自动换行布局android-flowlayout,使用发现此类布局空间都是通过计算当行剩余空间是否能够容下一个子view,如不能容下,另起一行去显示子view, 即,后面的空间如果不能容下发表内容,发表内容就会另起一行,这样布局很难看,可以有一个变通的方法就是内容分为两个textview,对于内容截取几个让第一个textview显示,剩

vue中解决时间在ios上显示NAN的问题

最近在用vue,遇到倒计时在ios上显示为NAN的问题. 因为做的是倒计时支付,思路是获取服务器时间和下单时间,再转成秒级时间戳做差值. 在网上找到说是ios 不支持例如2018-09-01 10:00:59这种"-"连接符. 网上的解决是: var data = '2018-09-01 12:00:00' var time= Date.parse(new Date(data )) 然后用正则匹配改一下,将-替换为/ var date = '2018-09-01 12:00:00' v

关于jQuery中动态生成的点击事件触发两次的讨论

由于是动态生成的  点击事件运用了jQuery里面的on()方法,绑定在body上面,结果在程序里面运行了两次.参考了博客 利用on和off方法编写高效的js代码知道了很多在dom对象删除以后,其声明的绑定在window上的事件还一直存在,导致相同的功能代码执行了几次.故使用之前要清理掉body上绑定的click事件,利用了jQuery里面off()方法. $('body').off('click').on('click','selector',function(){});

Android 中listview的item点击事件失效了的解决办法

原因多半是由于在自己定义的Item中存在诸如ImageButton,Button,CheckBox等子控件(也可以说是Button或者Checkable的子类控件),此时这些子控件会将焦点获取到,所以常常当点击item时变化的是子控件,item本身的点击没有响应. 即在Item布局的根布局加上android:descendantFocusability=”blocksDescendants”的属性就好了

在Vue组件中获取全局的点击事件

// 定义全局点击函数 Vue.prototype.globalClick = function (callback) { document.getElementById('main').onclick = function () { callback(); }; }; mounted: function () { this.globalClick(this.moreSetupMenuRemove); } // 移除操作 moreSetupMenuRemove () { this.$refs.m

vue中,svg图标添加click事件,部分浏览器不生效

vue项目中,使用svg图标,但是发现,为svg图标绑定click事件时,部分浏览器会出现,点击没有反应的情况,代码如下: <icon name="icon_add" @click="addSubject(scope.$index)"> </icon> 后来发现,在edge内核中只有点击svg边缘部分才会触发click事件 所以解决办法如下:为svg图标外面包裹一层元素,click事件绑定在外侧元素上 <a href='javascri