JS中mouseup事件丢失的原因与解决办法


Posted in Javascript onJune 14, 2017

前言

当实现类似Excel选中区域的功能时,经常出现 mouseup 事件丢失的情况,由于缺少了 mouseup 事件,导致一个完整的操作无法进行。

如果你是想进行拖拽移动操作,也可以参考本文。

原因

目前发现两个原因:

  • 触发了浏览器的 drag 操作,导致mouseup丢失。
  • 由于鼠标离开了操作的区域,触发了mouseleave导致mouseup丢失。

解决办法

第一种情况

通过执行下面的代码阻止系统默认的操作来防止触发 drag 操作:

//在事件中
e=e || window.event;
pauseEvent(e);

//阻止事件冒泡
//不仅仅要stopPropagation,还要preventDefault
function pauseEvent(e){
 if(e.stopPropagation) e.stopPropagation();
 if(e.preventDefault) e.preventDefault();
 e.cancelBubble=true;
 e.returnValue=false;
 return false;
}

通过对事件调用pauseEvent方法可以防止出现drag操作,因此在区域内可以避免mouseup丢失。即使你想实现的本来就是 drag 操作,也可以通过创建跟随鼠标移动的dom元素实现效果。

第二种情况

由于鼠标移到了区域外,触发了 mouseleave 操作,因此在这种情况下要监听 mouseleave 操作,当触发该操作时可以停止或者还原状态。

特别注意的地方

当处理鼠标事件时,可以还要考虑是否要控制按下那个键时才允许操作。

Mouse事件中有一个 buttons 属性,该值标示鼠标按下了一个或者多个按键,如果按下的键为多个,值则为多个:

      0 : 没有按键或者是没有初始化

      1 : 鼠标左键

      2 : 鼠标右键

      4 : 鼠标滚轮或者是中键

      8 : 第四按键 (通常是“浏览器后退”按键)

      16 : 第五按键 (通常是“浏览器前进”)

多个值的时候,相当于进行|操作,即鼠标左右键同时按下时1|2=3。判断是否按下左键可以用value&1!=0进行,例如左右键同时按下时3&1!=0是true,说明按下了左键。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
javascript 语法基础 想学习js的朋友可以看看
Dec 16 Javascript
Js 回车换行处理的办法及replace方法应用
Jan 24 Javascript
JS动态修改iframe高度和宽度的方法
Apr 01 Javascript
JS延时提示框实现方法详解
Nov 26 Javascript
jQuery实现指定区域外单击关闭指定层的方法【经典】
Jun 22 Javascript
jQuery实现最简单的切换图效果【可兼容IE6、火狐、谷歌、opera等】
Sep 04 Javascript
关于微信jssdk实现多图片上传的一点心得分享
Dec 13 Javascript
详解Vue.js之视图和数据的双向绑定(v-model)
Jun 23 Javascript
详解VUE2.X过滤器的使用方法
Jan 11 Javascript
vue移动UI框架滑动加载数据的方法
Mar 12 Javascript
vue-cli2与vue-cli3在一台电脑共存的实现方法
Sep 25 Javascript
vuecli项目构建SSR服务端渲染的实现
Oct 30 Javascript
Vue2.0 从零开始_环境搭建操作步骤
Jun 14 #Javascript
jQuery.form.js的使用详解
Jun 14 #jQuery
ExtJs异步无法向外传值和赋值的完美解决办法
Jun 14 #Javascript
详解Vue爬坑之vuex初识
Jun 14 #Javascript
详解vue2.0的Element UI的表格table列时间戳格式化
Jun 13 #Javascript
微信小程序调用PHP后台接口 解析纯html文本
Jun 13 #Javascript
vue时间格式化实例代码
Jun 13 #Javascript
You might like
深入php-fpm的两种进程管理模式详解
2013/06/03 PHP
php利用事务处理转账问题
2015/04/22 PHP
Zend Framework分页类用法详解
2016/03/22 PHP
php+mysql实现的二级联动菜单效果详解
2016/05/10 PHP
IE6 fixed的完美解决方案
2011/03/31 Javascript
jQuery:delegate中select()不起作用的解决方法(实例讲解)
2014/01/26 Javascript
JS点击链接后慢慢展开隐藏着图片的方法
2015/02/17 Javascript
javascript 常见功能汇总
2015/06/11 Javascript
Jquery为DIV添加click事件的简单实例
2016/06/02 Javascript
node.js学习之交互式解释器REPL详解
2016/12/08 Javascript
jQuery插件zTree实现单独选中根节点中第一个节点示例
2017/03/08 Javascript
解决Vue不能检测数组或对象变动的问题
2018/02/24 Javascript
vue中v-for加载本地静态图片方法
2018/03/03 Javascript
vue-cli3使用 DllPlugin 实现预编译提升构建速度
2019/04/24 Javascript
vue动态注册组件实例代码详解
2019/05/30 Javascript
vue实现标签云效果的方法详解
2019/08/28 Javascript
vue v-for直接循环数字实例
2019/11/07 Javascript
highcharts.js数据绑定方式代码实例
2019/11/13 Javascript
原生JavaScript实现的无缝滚动功能详解
2020/01/17 Javascript
vue swipeCell滑动单元格(仿微信)的实现示例
2020/09/14 Javascript
Nuxt 嵌套路由nuxt-child组件用法(父子页面组件的传值)
2020/11/05 Javascript
[20:46]Ti4循环赛第三日VG vs DK
2014/07/12 DOTA
python生成随机图形验证码详解
2017/11/08 Python
Django Rest framework频率原理与限制
2019/07/26 Python
python+django+rest框架配置创建方法
2019/08/31 Python
python爬取音频下载的示例代码
2020/10/19 Python
如何用python写个模板引擎
2021/01/14 Python
HTC VIVE美国官网:VR虚拟现实眼镜
2018/02/13 全球购物
Burt’s Bees英国官网:世界领先的天然个人护理品牌
2020/08/17 全球购物
网络编辑岗位职责
2014/03/18 职场文书
党在我心中演讲稿
2014/09/02 职场文书
2015年酒店工作总结
2015/04/28 职场文书
保护地球的宣传语
2015/07/13 职场文书
会计继续教育培训心得体会
2016/01/19 职场文书
生鲜超市—未来中国最具有潜力零售业态
2019/08/02 职场文书
Java如何实现树的同构?
2021/06/22 Java/Android