解决VUE自定义拖拽指令时 onmouseup 与 click事件冲突问题


Posted in Javascript onJuly 24, 2020

功能描述:

解决VUE自定义拖拽指令时 onmouseup 与 click事件冲突问题

解决VUE自定义拖拽指令时 onmouseup 与 click事件冲突问题

如图,右侧悬浮菜单按钮,只支持上下方向拖动,点击时展开或关闭菜单。

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;
    }
   },

补充知识:vue 子组件 created 方法不执行问题

近期做了一个项目 里面有一个树形菜单,将数据写在 js (死数据)中,所有的东西都能够正常执行(i 标签,子节点,父节点),但是当在请求接口文件或者请求后台数据的时候,发现引入的子组件的created方法不执行,但是点击父级菜单展开时还是能够触发,后来发现 是生命周期的问题,仔细查看一下,后来解决!

解决方法如下:

用watch 检测一下data的数据变化,created方法既然在点击的时候执行,所以也必须保留,好啦,就这样!

以上这篇解决VUE自定义拖拽指令时 onmouseup 与 click事件冲突问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
传智播客学习之java 反射
Nov 22 Javascript
artdialog的图片/标题以及关闭按钮不显示的解决方法
Jun 27 Javascript
jquery+php实现搜索框自动提示
Nov 28 Javascript
JavaScript中的对象序列化介绍
Dec 30 Javascript
详细解读JavaScript编程中的Promise使用
Jul 27 Javascript
javascript常用函数(1)
Nov 04 Javascript
JS模拟简易滚动条效果代码(附demo源码)
Apr 05 Javascript
jQuery实现的placeholder效果完整实例
Aug 02 Javascript
JavaScript订单操作小程序完整版
Jun 23 Javascript
详解微信小程序中的页面代码中的模板的封装
Oct 12 Javascript
JavaScript中为事件指定处理程序的五种方式分析
Jul 27 Javascript
layui form.render('select', 'test2') 更新渲染的方法
Sep 27 Javascript
深入了解Vue.js 混入(mixins)
Jul 23 #Javascript
JS实现简单移动端鼠标拖拽
Jul 23 #Javascript
JS使用Chrome浏览器实现调试线上代码
Jul 23 #Javascript
JS实现鼠标按下拖拽效果
Jul 23 #Javascript
javascript利用canvas实现鼠标拖拽功能
Jul 23 #Javascript
JS如何实现封装列表右滑动删除收藏按钮
Jul 23 #Javascript
vue+iview框架实现左侧动态菜单功能的示例代码
Jul 23 #Javascript
You might like
PHP4中实现动态代理
2006/10/09 PHP
PHP CURL获取cookies模拟登录的方法
2013/11/04 PHP
JavaScript 利用StringBuffer类提升+=拼接字符串效率
2009/11/24 Javascript
jquery选择符快速提取web表单数据示例
2014/03/27 Javascript
javascript记录文本框内文字个数检测文字个数变化
2014/10/14 Javascript
对比分析AngularJS中的$http.post与jQuery.post的区别
2015/02/27 Javascript
javasript实现密码的隐藏与显示
2015/05/08 Javascript
详解JavaScript中setSeconds()方法的使用
2015/06/11 Javascript
优化RequireJS项目的相关技巧总结
2015/07/01 Javascript
JS实现的竖向折叠菜单代码
2015/10/21 Javascript
Bootstrap精简教程
2015/11/27 Javascript
bootstrap table使用入门基本用法
2017/05/24 Javascript
vue2.0 computed 计算list循环后累加值的实例
2018/03/07 Javascript
如何使用vuex实现兄弟组件通信
2018/11/02 Javascript
用vscode开发vue应用的方法步骤
2019/05/06 Javascript
JavaScript键盘事件响应顺序详解
2019/09/30 Javascript
vue-i18n实现中英文切换的方法
2020/07/06 Javascript
解决vue bus.$emit触发第一次$on监听不到问题
2020/07/28 Javascript
[02:34]2016完美“圣”典风云人物:BurNIng专访
2016/12/10 DOTA
Python实现获取域名所用服务器的真实IP
2015/10/25 Python
Python max内置函数详细介绍
2016/11/17 Python
Python实现图片滑动式验证识别方法
2017/11/09 Python
使用django-crontab实现定时任务的示例
2018/02/26 Python
python GUI库图形界面开发之PyQt5信号与槽事件处理机制详细介绍与实例解析
2020/03/08 Python
python实现从ftp上下载文件的实例方法
2020/07/19 Python
pip 20.3 新版本发布!即将抛弃 Python 2.x(推荐)
2020/12/16 Python
python drf各类组件的用法和作用
2021/01/12 Python
浅析rem和em和px vh vw和% 移动端长度单位
2016/04/28 HTML / CSS
工业设计专业推荐信
2013/10/29 职场文书
人力资源作业细则
2014/03/03 职场文书
党务公开方案
2014/05/06 职场文书
药剂专业毕业生求职信
2014/06/24 职场文书
婚前协议书范本两则
2014/10/16 职场文书
2016年员工年度考核评语
2015/12/02 职场文书
2019年描写人生经典诗句大全
2019/07/08 职场文书
java协程框架quasar和kotlin中的协程对比分析
2022/02/24 Java/Android