解决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 相关文章推荐
基于jquery实现的移入页面上空文本框时,让它变为焦点,移出清除焦点
Jul 26 Javascript
javascript设计模式 封装和信息隐藏(上)
Jul 24 Javascript
JS获取浏览器语言动态加载JS文件示例代码
Oct 31 Javascript
JavaScript生成的动态下雨背景效果实现方法
Feb 25 Javascript
javascript实现获取服务器时间
May 19 Javascript
jQuery短信验证倒计时功能实现方法详解
May 25 Javascript
JavaScript中闭包的写法和作用详解
Jun 29 Javascript
jQuery多个版本和其他js库冲突的解决方法
Aug 11 Javascript
React为 Vue 引入容器组件和展示组件的教程详解
May 03 Javascript
Vue实现table上下移动功能示例
Feb 21 Javascript
node创建Vue项目步骤详解
Mar 06 Javascript
JavaScript实现一键复制内容剪贴板
Jul 23 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中数字检测is_numeric与ctype_digit的区别介绍
2012/10/04 PHP
PHP批量去除BOM头代码分享
2015/06/26 PHP
PHP中的命名空间详细介绍
2015/07/02 PHP
浅谈laravel aliases别名的原理
2019/10/24 PHP
使用js获取QueryString的方法小结
2010/02/28 Javascript
ajax请求get与post的区别总结
2013/11/04 Javascript
浅析offsetLeft,Left,clientLeft之间的区别
2013/11/30 Javascript
JavaScript对象属性检查、增加、删除、访问操作实例
2015/07/08 Javascript
基于jQuery+PHP+Mysql实现在线拍照和在线浏览照片
2015/09/06 Javascript
jQuery mobile类库使用时加载导航历史的方法简介
2015/12/04 Javascript
javascript中Date format(js日期格式化)方法小结
2015/12/17 Javascript
教你如何终止JQUERY的$.AJAX请求
2016/02/23 Javascript
AngularJS动态绑定ng-options的ng-model实例代码
2017/06/21 Javascript
JavaScript之创意时钟项目(实例讲解)
2017/10/23 Javascript
基于Vue2的独立构建与运行时构建的差别(详解)
2017/12/06 Javascript
微信小程序progress组件使用详解
2018/01/31 Javascript
vue-cli脚手架的安装教程图解
2018/09/02 Javascript
微信小程序实现列表页的点赞和取消点赞功能
2018/11/02 Javascript
jQuery HTML获取内容和属性操作实例分析
2020/05/20 jQuery
详解微信小程序(Taro)手动埋点和自动埋点的实现
2021/03/02 Javascript
[04:50]DOTA2亚洲邀请赛小组赛第四日 TOP10精彩集锦
2015/02/02 DOTA
python实现ftp客户端示例分享
2014/02/17 Python
简单了解python模块概念
2018/01/11 Python
tensorflow实现逻辑回归模型
2018/09/08 Python
python实现代码统计程序
2019/09/19 Python
python批量处理多DNS多域名的nslookup解析实现
2020/06/28 Python
HTML5 canvas 瀑布流文字效果的示例代码
2018/01/31 HTML / CSS
SmartBuyGlasses比利时:购买品牌太阳镜和眼镜
2019/08/09 全球购物
俄罗斯第一家篮球店:StreetBall
2020/07/30 全球购物
中学生班主任评语
2014/01/30 职场文书
校园安全广播稿范文
2014/09/25 职场文书
法律服务所工作总结
2015/08/10 职场文书
2021-4-3课程——SQL Server查询【2】
2021/04/05 SQL Server
python常见的占位符总结及用法
2021/07/02 Python
sql时间段切分实现每隔x分钟出一份高速门架车流量
2022/02/28 SQL Server
vue elementUI批量上传文件
2022/04/26 Vue.js