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 相关文章推荐
腾讯的ip接口 方便获取当前用户的ip地理位置
Nov 25 Javascript
Node.js中使用Buffer编码、解码二进制数据详解
Aug 16 Javascript
js计算任意值之间随机数的方法
Jan 16 Javascript
JavaScript在Android的WebView中parseInt函数转换不正确问题解决方法
Apr 25 Javascript
XML文件转化成NSData对象的方法
Aug 12 Javascript
基于jquery编写的放大镜插件
Mar 23 Javascript
使用node打造自己的命令行工具方法教程
Mar 26 Javascript
小程序开发基础之view视图容器
Aug 21 Javascript
Vue中使用clipboard实现复制功能
Sep 05 Javascript
深入学习JavaScript 高阶函数
Jun 11 Javascript
深入理解 ES6中的 Reflect用法
Jul 18 Javascript
js面试题之异步问题的深入理解
Sep 20 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桌面中心(四) 数据显示
2007/03/11 PHP
php discuz 主题表和回帖表的设计
2009/03/13 PHP
php中Smarty模板初体验
2011/08/08 PHP
php中filter函数验证、过滤用户输入的数据
2014/01/13 PHP
PHP类的封装与继承详解
2015/09/29 PHP
PHP基于单例模式实现的mysql类
2016/01/09 PHP
微信自定义菜单的创建/查询/取消php示例代码
2016/08/05 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
2020/01/22 PHP
如何在PHP环境中使用ProtoBuf数据格式
2020/06/19 PHP
js变换显示图片的实例
2013/04/16 Javascript
javascript通过navigator.userAgent识别各种浏览器
2013/10/25 Javascript
浅析jquery ajax异步调用方法中不能给全局变量赋值的原因及解决方法
2014/01/10 Javascript
Angularjs基础知识及示例汇总
2015/01/22 Javascript
jQuery实现dialog设置focus焦点的方法
2015/06/10 Javascript
Bootstrap3制作搜索框样式的方法
2016/07/11 Javascript
浅谈JS之tagNaem和nodeName
2016/09/13 Javascript
jQuery实现移动端手机商城购物车功能
2016/09/24 Javascript
常用原生js自定义函数总结
2016/11/20 Javascript
thinkjs之页面跳转同步异步操作
2017/02/05 Javascript
Node.js pipe实现源码解析
2017/08/12 Javascript
JavaScript实现离开页面前提示功能【附jQuery实现方法】
2017/09/26 jQuery
详解简单易懂的 ES6 Iterators 指南和示例
2019/09/24 Javascript
微信小程序添加插屏广告并设置显示频率(一天一次)
2019/12/06 Javascript
[02:52]2014DOTA2西雅图国际邀请赛 CIS战队巡礼
2014/07/07 DOTA
python模拟登录百度贴吧(百度贴吧登录)实例
2013/12/18 Python
老生常谈python之鸭子类和多态
2017/06/13 Python
tensorflow实现对图片的读取的示例代码
2018/02/12 Python
10款最佳Python开发工具推荐,每一款都是神器
2020/10/15 Python
英国在线房屋中介网站:Yopa
2018/01/09 全球购物
Bonprix法国:时尚、鞋子、家居
2020/12/29 全球购物
网吧收银员岗位职责
2013/12/14 职场文书
创业计划书的主要内容有哪些
2014/01/29 职场文书
食品采购员岗位职责
2014/04/14 职场文书
实习协议书范本
2014/04/22 职场文书
大学生自我推荐信范文
2015/03/24 职场文书
教师节简报
2015/07/20 职场文书