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 相关文章推荐
使用jQuery.Validate进行客户端验证(初级篇) 不使用微软验证控件的理由
Jun 28 Javascript
巧用js提交表单轻松解决一个页面有多个提交按钮
Nov 17 Javascript
js正则表达exec与match的区别说明
Jan 29 Javascript
iframe实用操作锦集
Apr 22 Javascript
原生JS和jQuery版实现文件上传功能
Apr 18 Javascript
实例讲解JavaScript中instanceof运算符的用法
Jun 08 Javascript
Vuejs第十三篇之组件——杂项
Sep 09 Javascript
基于Bootstrap仿淘宝分页控件实现代码
Nov 07 Javascript
浅谈node.js 命令行工具(cli)
May 10 Javascript
使用vue-router beforEach实现判断用户登录跳转路由筛选功能
Jun 25 Javascript
细说webpack6 Babel的使用详解
Sep 26 Javascript
vue.js的简单自动求和计算实例
Nov 08 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 session和cookie使用说明
2010/04/07 PHP
CI(CodeIgniter)框架视图中加载视图的方法
2017/03/24 PHP
利用PHP实现一个简单的用户登记表示例
2017/04/25 PHP
浅谈Laravel核心解读之Console内核
2018/12/02 PHP
php常用日期时间函数实例小结
2019/07/04 PHP
Javascript 陷阱 window全局对象
2008/11/26 Javascript
JavaScript中实现块作用域的方法
2010/04/01 Javascript
实现变速回到顶部的JavaScript代码
2011/05/09 Javascript
Jquery+CSS3实现一款简洁大气带滑动效果的弹出层
2013/05/15 Javascript
jquery iframe操作详细解析
2013/11/20 Javascript
浅谈JS原型对象和原型链
2016/03/02 Javascript
KnockoutJS 3.X API 第四章之表单value绑定
2016/10/10 Javascript
Angular实现的table表格排序功能完整示例
2017/12/22 Javascript
vue富文本框(插入文本、图片、视频)的使用及问题小结
2018/08/17 Javascript
Bootstrap 实现表格样式、表单布局的实例代码
2018/12/09 Javascript
微信小程序分享海报生成的实现方法
2018/12/10 Javascript
浅谈vue中$bus的使用和涉及到的问题
2020/07/28 Javascript
matplotlib中legend位置调整解析
2017/12/19 Python
Python单元测试实例详解
2018/05/25 Python
python调用百度语音REST API
2018/08/30 Python
Python函数定义及传参方式详解(4种)
2019/03/18 Python
深入浅析Python科学计算库Scipy及安装步骤
2019/10/12 Python
django 外键创建注意事项说明
2020/05/20 Python
Python3如何使用tabulate打印数据
2020/09/25 Python
萨克斯第五大道英国:Saks Fifth Avenue英国
2019/04/01 全球购物
意大利巧克力店:Chocolate Shop
2019/07/24 全球购物
技校生自我鉴定范文
2013/09/26 职场文书
学前教育毕业生自荐信
2013/10/29 职场文书
公安局副政委班子个人对照检查材料
2014/10/04 职场文书
劳资员岗位职责
2015/02/13 职场文书
2015年清明节演讲稿范文
2015/03/17 职场文书
发票退票证明
2015/06/24 职场文书
2015年办税服务厅工作总结
2015/07/23 职场文书
学生会干部任命书
2015/09/21 职场文书
导游词之江西赣州
2019/10/15 职场文书
Java Redisson多策略注解限流
2022/09/23 Java/Android