解决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 30 Javascript
判断数组的最佳方法(推荐)
Oct 11 Javascript
JS正则匹配中文的方法示例
Jan 06 Javascript
jQuery基本选择器和层次选择器学习使用
Feb 27 Javascript
基于JavaScript中标识符的命名规则介绍
Jan 06 Javascript
JavaScript事件委托原理与用法实例分析
Jun 07 Javascript
vue中el-upload上传图片到七牛的示例代码
Oct 19 Javascript
JavaScript偏函数与柯里化实例详解
Mar 27 Javascript
微信小程序-API接口安全详解
Jul 16 Javascript
p5.js临摹旋转爱心
Oct 23 Javascript
JS前端面试必备——基本排序算法原理与实现方法详解【插入/选择/归并/冒泡/快速排序】
Feb 24 Javascript
深入了解Vue.js 混入(mixins)
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写的采集程序
2007/03/16 PHP
PHP通用分页类page.php[仿google分页]
2008/08/31 PHP
PHP中快速生成随机密码的几种方式
2017/04/17 PHP
用jscript实现新建和保存一个word文档
2007/06/15 Javascript
精心挑选的15个jQuery下拉菜单制作教程
2012/06/15 Javascript
表单类各种类型(文本框)失去焦点效果jquery代码
2013/04/26 Javascript
javascript操作Cookie(设置、读取、删除)方法详解
2015/03/18 Javascript
实例代码详解jquery.slides.js
2015/11/16 Javascript
基于jQuery 实现bootstrapValidator下的全局验证
2015/12/07 Javascript
JavaScript中的事件委托及好处
2016/07/12 Javascript
vue2.0嵌套路由实现豆瓣电影分页功能(附demo)
2017/03/13 Javascript
浅谈Express异步进化史
2017/09/09 Javascript
mui框架移动开发初体验详解
2017/10/11 Javascript
vue使用vue-i18n实现国际化的实现代码
2018/04/08 Javascript
详解javascript中的babel到底是什么
2018/06/21 Javascript
使用layer弹窗和layui表单实现新增功能
2018/08/09 Javascript
简单学习5种处理Vue.js异常的方法
2019/06/17 Javascript
JS实现的tab切换并显示相应内容模块功能示例
2019/08/03 Javascript
python中的对象拷贝示例 python引用传递
2014/01/23 Python
Python实现的检测web服务器健康状况的小程序
2014/09/17 Python
Python标准库内置函数complex介绍
2014/11/25 Python
python编写简单端口扫描器
2019/09/04 Python
python:动态路由的Flask程序代码
2019/11/22 Python
python实现数学模型(插值、拟合和微分方程)
2020/11/13 Python
HTML5是否真的可以取代Flash
2010/02/10 HTML / CSS
详解如何使用rem或viewport进行移动端适配
2020/08/14 HTML / CSS
DJI大疆德国官方商城:大疆无人机
2018/09/01 全球购物
美国宠物美容和宠物用品购物网站:Cherrybrook
2018/12/07 全球购物
马来西亚在线购物:POPLOOK.com
2019/12/09 全球购物
绘画设计学生的个人自我评价
2013/09/20 职场文书
主治医师岗位职责
2013/12/10 职场文书
民间借贷纠纷案件代理词
2015/05/26 职场文书
麦田里的守望者读书笔记
2015/06/30 职场文书
话题作文之自信作文
2019/11/15 职场文书
为什么不建议在go项目中使用init()
2021/04/12 Golang
叶县这家生产军用电台的兵工厂,人称“四机部”,走出一上将
2022/02/18 无线电