解决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 相关文章推荐
JavaScript 快捷键设置实现代码
Mar 13 Javascript
javascript高级学习笔记整理
Aug 14 Javascript
CheckBoxList多选样式jquery、C#获取选择项
Sep 06 Javascript
jquery实现动态画圆
Dec 04 Javascript
ECMAScript 5中的属性描述符详解
Mar 02 Javascript
javascript中innerText和innerHTML属性用法实例分析
May 13 Javascript
JS实现的鼠标跟随代码(卡通手型点击效果)
Oct 26 Javascript
微信小程序 开发之顶部导航栏实例代码
Feb 23 Javascript
vue调用高德地图实例代码
Apr 28 Javascript
Angular.js指令学习中一些重要属性的用法教程
May 24 Javascript
JS之if语句对接事件动作逻辑(详解)
Jun 28 Javascript
通过js随机函数Math.random实现乱序
May 19 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
一段php加密解密的代码
2007/07/16 PHP
深入eAccelerator与memcached的区别详解
2013/06/06 PHP
php实现的替换敏感字符串类实例
2014/09/22 PHP
Zend Framework实现多文件上传功能实例
2016/03/21 PHP
php封装的表单验证类完整实例
2016/10/19 PHP
使用YII2框架实现微信公众号中表单提交功能
2017/09/04 PHP
另类调用flash无须激活的方法
2006/12/27 Javascript
50个比较实用jQuery代码段
2011/09/18 Javascript
JQuery事件e参数的方法preventDefault()取消默认行为
2013/09/26 Javascript
判断javascript的数据类型(示例代码)
2013/12/11 Javascript
JS去掉第一个字符和最后一个字符的实现代码
2014/02/20 Javascript
jquery form表单序列化为对象的示例代码
2014/03/05 Javascript
使用Plupload实现直接上传附件至七牛云存储
2014/12/26 Javascript
Js实现无刷新删除内容
2015/04/29 Javascript
使用HTML5+Boostrap打造简单的音乐播放器
2016/08/05 Javascript
微信小程序中hidden不生效原因的解决办法
2017/04/26 Javascript
vue初始化动画加载的实例
2018/09/01 Javascript
js的各种数据类型判断的介绍
2019/01/19 Javascript
纯异步nodejs文件夹(目录)复制功能
2019/09/03 NodeJs
JavaScript将数组转换为链表的方法
2020/02/16 Javascript
python实现k均值算法示例(k均值聚类算法)
2014/03/16 Python
从零学python系列之从文件读取和保存数据
2014/05/23 Python
python中enumerate函数用法实例分析
2015/05/20 Python
Pythont特殊语法filter,map,reduce,apply使用方法
2016/02/27 Python
使用Python实现博客上进行自动翻页
2017/08/23 Python
Tensorflow 查看变量的值方法
2018/06/14 Python
python单线程文件传输的实例(C/S)
2019/02/13 Python
python 执行终端/控制台命令的例子
2019/07/12 Python
pymysql模块的操作实例
2019/12/17 Python
python:HDF和CSV存储优劣对比分析
2020/06/08 Python
波兰最大的儿童服装连锁店之一:5.10.15.
2018/02/11 全球购物
天逸系统(武汉)有限公司Java笔试题
2015/12/29 面试题
造价工程师个人求职信
2013/09/21 职场文书
人事部专员岗位职责
2014/03/04 职场文书
Java Optional<Foo>转换成List<Bar>的实例方法
2021/06/20 Java/Android
python绘制云雨图raincloud plot
2022/08/05 Python