解决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 01 Javascript
把input初始值不写value的具体实现方法
Jul 04 Javascript
如何使用jquery控制CSS样式,并且取消Css样式(如背景色,有实例)
Jul 09 Javascript
jquery+html5制作超酷的圆盘时钟表
Apr 14 Javascript
使用JavaScript和CSS实现文本隔行换色的方法
Nov 04 Javascript
基于JavaScript实现鼠标向下滑动加载div的代码
Aug 31 Javascript
滚动条的监听与内容随着滚动条动态加载的实现
Feb 08 Javascript
使用Math.max,Math.min获取数组中的最值实例
Apr 25 Javascript
JavaScript ES6中const、let与var的对比详解
Jun 18 Javascript
React Native AsyncStorage本地存储工具类
Oct 24 Javascript
vue 清空input标签 中file的值操作
Jul 21 Javascript
JS指定音频audio在某个时间点进行播放
Nov 28 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生成静态页的实现方法
2013/05/10 PHP
php使用百度翻译api示例分享
2014/01/31 PHP
PHP 将数组打乱 shuffle函数的用法及简单实例
2016/06/17 PHP
PHP 的Opcache加速的使用方法
2017/12/29 PHP
PHP依赖注入原理与用法分析
2018/08/21 PHP
JavaScript 学习笔记(十四) 正则表达式
2010/01/22 Javascript
在Javascript里访问SharePoint列表数据的实现方法
2011/05/22 Javascript
用JSON做数据传输格式中的一些问题总结
2011/12/21 Javascript
javascript框架设计之浏览器的嗅探和特征侦测
2015/06/23 Javascript
JavaScript中利用Array和Object实现Map的方法
2015/07/27 Javascript
javascript实现3D变换的立体圆圈实例
2015/08/06 Javascript
Bootstrap入门书籍之(五)导航条、分页导航
2016/02/17 Javascript
用JavaScript获取页面文档内容的实现代码
2016/06/10 Javascript
BootStrap 弹出层代码
2017/02/09 Javascript
angularjs中回车键触发某一事件的方法
2017/04/24 Javascript
分享5个小技巧让你写出更好的 JavaScript 条件语句
2018/10/20 Javascript
详解vue中async-await的使用误区
2018/12/05 Javascript
js实现点赞效果
2020/03/16 Javascript
js中switch语句的学习笔记
2020/03/25 Javascript
如何在 Vue 表单中处理图片
2021/01/26 Vue.js
Python实现的批量下载RFC文档
2015/03/10 Python
Python中operator模块的操作符使用示例总结
2016/06/28 Python
pytorch 实现将自己的图片数据处理成可以训练的图片类型
2020/01/08 Python
Python如何存储数据到json文件
2020/03/09 Python
Python连接Hadoop数据中遇到的各种坑(汇总)
2020/04/14 Python
css3 clip实现圆环进度条的示例代码
2018/02/07 HTML / CSS
Willer台湾:日本高速巴士/夜行巴士预约
2017/07/09 全球购物
求网格中的黑点分布
2013/11/06 面试题
高中地理教学反思
2014/01/29 职场文书
美术毕业生求职信
2014/02/25 职场文书
婚礼主持结束词
2014/03/13 职场文书
教师读书活动总结
2014/05/07 职场文书
董事长开业致辞
2015/07/29 职场文书
运动会开幕式致辞
2015/07/29 职场文书
实例讲解Python中sys.argv[]的用法
2021/06/03 Python
SQL Server使用T-SQL语句批处理
2022/05/20 SQL Server