解决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 相关文章推荐
不错的新闻标题颜色效果
Dec 10 Javascript
jquery随机展示头像代码
Dec 21 Javascript
JavaScript不刷新实现浏览器的前进后退功能
Nov 05 Javascript
jQuery实现的简单折叠菜单(折叠面板)效果代码
Sep 16 Javascript
AngularJS 过滤器的简单实例
Jul 27 Javascript
微信开发 js实现tabs选项卡效果
Oct 28 Javascript
Vue.js学习之过滤器详解
Jan 22 Javascript
JavaScript验证知识整理
Mar 24 Javascript
3种vue路由传参的基本模式
Feb 22 Javascript
如何用input标签和jquery实现多图片的上传和回显功能
May 16 jQuery
微信小程序中data-key属性之数据传输(经验总结)
Aug 22 Javascript
JavaScript实现点击出现子菜单效果
Feb 08 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将整个网站生成HTML纯静态网页的方法总结
2012/02/05 PHP
CI框架(CodeIgniter)实现的导入、导出数据操作示例
2018/05/24 PHP
改版了网上的一个js操作userdata
2007/04/27 Javascript
JavaScript Konami Code 实现代码
2009/07/29 Javascript
jquery tools 系列 scrollable(2)
2009/09/06 Javascript
jQuery学习笔记(4)--Jquery中获取table中某列值的具体思路
2013/04/10 Javascript
jquery入门必备的基本认识及实例(整理)
2013/06/24 Javascript
javascript中拼接HTML字符串的最快、最好的方法
2014/06/07 Javascript
JS实现文字放大效果的方法
2015/03/03 Javascript
JavaScript将XML转成JSON的方法
2015/03/12 Javascript
JavaScript获得当前网页来源页面(即上一页)的方法
2015/04/03 Javascript
javascript实现起伏的水波背景效果
2016/05/16 Javascript
原生js实现查询天气小应用
2016/12/09 Javascript
详解基于webpack搭建react运行环境
2017/06/01 Javascript
Thinkjs3新手入门之如何使用静态资源目录
2017/12/06 Javascript
vue 组件中slot插口的具体用法
2018/04/03 Javascript
Node.js 多线程完全指南总结
2019/03/27 Javascript
解决Layui 表格自适应高度的问题
2019/11/15 Javascript
javascript实现倒计时提示框
2021/03/02 Javascript
python 控制语句
2011/11/03 Python
python逆序打印各位数字的方法
2018/06/25 Python
python获取微信小程序手机号并绑定遇到的坑
2018/11/19 Python
scrapy爬虫:scrapy.FormRequest中formdata参数详解
2020/04/30 Python
HTML5 WebSocket实现点对点聊天的示例代码
2018/01/31 HTML / CSS
Spanx塑身衣官网:美国知名内衣品牌
2017/01/11 全球购物
Ibatis中如何提高SQL Map的性能
2013/05/11 面试题
财务部副经理岗位职责范本
2014/06/17 职场文书
机关作风整顿个人剖析材料
2014/10/06 职场文书
八达岭长城导游词
2015/01/30 职场文书
公司地址变更通知
2015/04/25 职场文书
绿里奇迹观后感
2015/06/15 职场文书
浏览器常用基本操作之python3+selenium4自动化测试(基础篇3)
2021/05/21 Python
浅析MySQL如何实现事务隔离
2021/06/26 MySQL
Python万能模板案例之matplotlib绘制甘特图
2022/04/13 Python
python 闭包函数详细介绍
2022/04/19 Python
VUE递归树形实现多级列表
2022/07/15 Vue.js