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.Ajax()方法调用Asp.Net后台的方法解析
Feb 13 Javascript
开发中可能会用到的jQuery小技巧
Mar 07 Javascript
JQuery通过AJAX从后台获取信息显示在表格上并支持行选中
Sep 15 Javascript
jQuery四种选择器使用及示例
Jun 05 Javascript
jQuery Masonry瀑布流布局神器使用详解
May 25 jQuery
本地搭建微信小程序服务器的实现方法
Oct 27 Javascript
详解webpack多页面配置记录
Jan 22 Javascript
vue-lazyload图片延迟加载插件的实例讲解
Feb 09 Javascript
安装vue-cli的简易过程
May 22 Javascript
vue中keep-alive组件的入门使用教程
Jun 06 Javascript
使用Vue 自定义文件选择器组件的实例代码
Mar 04 Javascript
Vue动态加载图片在跨域时无法显示的问题及解决方法
Mar 10 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
德生PL330测评
2021/03/02 无线电
php SQL之where语句生成器
2009/03/24 PHP
PHP 超链接 抓取实现代码
2009/06/29 PHP
php读取xml实例代码
2010/01/28 PHP
将时间以距今多久的形式表示,PHP,js双版本
2012/09/25 PHP
解析coreseek for sphinx的使用
2013/06/21 PHP
简单的Jquery全选功能
2013/11/07 Javascript
javascript中实现兼容JAVA的hashCode算法代码分享
2020/08/11 Javascript
json实现前后台的相互传值详解
2015/01/05 Javascript
js实现鼠标悬浮给图片加边框的方法
2015/01/30 Javascript
nodejs实现获取当前url地址及url各种参数值
2015/06/25 NodeJs
jquery+html5时钟特效代码分享(可设置闹钟并且语音提醒)
2020/03/30 Javascript
轻松学习jQuery插件EasyUI EasyUI实现拖动基本操作
2015/11/30 Javascript
学习使用grunt来打包JavaScript和CSS程序的教程
2016/01/04 Javascript
JavaScript中原型链存在的问题解析
2016/09/25 Javascript
Vue递归实现树形菜单方法实例
2018/11/06 Javascript
JavaScript监听键盘事件代码实现
2020/06/03 Javascript
树莓派中python获取GY-85九轴模块信息示例
2013/12/05 Python
python实现中文分词FMM算法实例
2015/07/10 Python
python中的break、continue、exit()、pass全面解析
2017/08/05 Python
对Python 数组的切片操作详解
2018/07/02 Python
如何优雅地处理Django中的favicon.ico图标详解
2018/07/05 Python
python 字典操作提取key,value的方法
2019/06/26 Python
python写程序统计词频的方法
2019/07/29 Python
Python协程操作之gevent(yield阻塞,greenlet),协程实现多任务(有规律的交替协作执行)用法详解
2019/10/14 Python
如何在python开发工具PyCharm中搭建QtPy环境(教程详解)
2020/02/04 Python
Python实现JS解密并爬取某音漫客网站
2020/10/23 Python
Waterford加拿大官方网站:世界著名的水晶杯品牌
2016/11/01 全球购物
市委常委班子党的群众路线教育实践活动整改措施
2014/10/02 职场文书
开国大典观后感
2015/06/04 职场文书
外出考察学习心得体会
2016/01/18 职场文书
高中数学教学反思范文
2016/02/18 职场文书
高中数学课堂教学反思
2016/02/18 职场文书
vue点击弹窗自动触发点击事件的解决办法(模拟场景)
2021/05/25 Vue.js
PHP RabbitMQ消息列队
2022/05/11 PHP
如何用H5实现好玩的2048小游戏
2022/07/23 HTML / CSS