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 相关文章推荐
子窗口、父窗口和Silverlight之间的相互调用
Aug 16 Javascript
jquery果冻抖动效果实现方法
Jan 15 Javascript
jQuery实现锚点scoll效果实例分析
Mar 10 Javascript
jQuery验证插件validate使用方法详解
Sep 13 Javascript
jqGrid用法汇总(全经典)
Jun 28 Javascript
JavaScript鼠标特效大全
Sep 13 Javascript
vue.js动态数据绑定学习笔记
May 19 Javascript
详解webpack 多页面/入口支持&公共组件单独打包
Jun 29 Javascript
基于JavaScript实现数码时钟效果
Mar 30 Javascript
详解用webpack的CommonsChunkPlugin提取公共代码的3种方式
Nov 09 Javascript
bootstrap-Treeview实现级联勾选
Nov 23 Javascript
jquery树形插件zTree高级使用详解
Aug 16 jQuery
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
JAVA/JSP学习系列之七
2006/10/09 PHP
php数组函数序列之array_push() 数组尾部添加一个或多个元素(入栈),返回新长度。
2011/11/07 PHP
基于PHP选项与信息函数的使用详解
2013/05/10 PHP
微信JSSDK分享功能图文实例详解
2019/04/08 PHP
JS写的数字拼图小游戏代码[学习参考]
2008/10/29 Javascript
Javascript 实用小技巧
2010/04/07 Javascript
JavaScript定时器详解及实例
2013/08/01 Javascript
jquery获取子节点和父节点的示例代码
2013/09/10 Javascript
javascript处理表单示例(javascript提交表单)
2014/04/28 Javascript
js获取数组的最后一个元素
2015/04/14 Javascript
javascript中动态函数用法实例分析
2015/05/14 Javascript
jQuery悬停文字提示框插件jquery.tooltipster.js用法示例【附demo源码下载】
2016/07/19 Javascript
AngularJS extend用法详解及实例代码
2016/11/15 Javascript
easyUI combobox实现联动效果
2017/01/17 Javascript
AngularJS+bootstrap实现动态选择商品功能示例
2017/05/17 Javascript
jQuery插件select2利用ajax高效查询大数据列表(可搜索、可分页)
2017/05/19 jQuery
微信小程序 新建登录页并实现tabBar隐藏
2017/06/13 Javascript
详谈innerHTML innerText的使用和区别
2017/08/18 Javascript
AngularJs 最新验证手机号码的实例,成功测试通过
2017/11/26 Javascript
微信小程序如何像vue一样在动态绑定类名
2018/04/17 Javascript
Vue CLI项目 axios模块前后端交互的使用(类似ajax提交)
2019/09/01 Javascript
layui默认选中table的CheckBox复选框方法
2019/09/19 Javascript
[56:21]LGD vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python实现二叉搜索树
2016/02/03 Python
python实现逻辑回归的方法示例
2017/05/02 Python
使用python语言,比较两个字符串是否相同的实例
2018/06/29 Python
Django分页功能的实现代码详解
2019/07/29 Python
python opencv 简单阈值算法的实现
2019/08/04 Python
对django 2.x版本中models.ForeignKey()外键说明介绍
2020/03/30 Python
秘鲁购物网站:Linio秘鲁
2017/04/07 全球购物
诺思信科技(南京)有限公司.NET笔试题答案
2013/07/06 面试题
师范大学毕业自我鉴定
2013/11/21 职场文书
安全生产网格化管理实施方案
2014/03/01 职场文书
助学感谢信范文
2015/01/21 职场文书
敬老院志愿者活动总结
2015/05/06 职场文书
2016优秀班主任个人先进事迹材料
2016/02/26 职场文书