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 相关文章推荐
ExtJS 简介 让你知道extjs是什么
Dec 29 Javascript
jquery等待效果示例
May 01 Javascript
分享一款基于jQuery的视频播放插件
Oct 09 Javascript
js Calender控件使用详解
Jan 05 Javascript
学习JavaScript设计模式(多态)
Nov 25 Javascript
SpringMVC框架下JQuery传递并解析Json格式的数据是如何实现的
Dec 10 Javascript
jQuery操作动态生成的内容的方法
May 28 Javascript
JS封装的自动创建表格的实现代码
Jun 15 Javascript
javascript过滤数组重复元素的实现方法
May 03 Javascript
JS时间控制实现动态效果的实例讲解
Jul 31 Javascript
vue中v-for加载本地静态图片方法
Mar 03 Javascript
vue轻量级框架无法获取到vue对象解决方法
May 12 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
JAVA/JSP学习系列之七
2006/10/09 PHP
zf框架的数据库追踪器使用示例
2014/03/13 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
2017/11/16 PHP
Laravel如何使用Redis共享Session
2018/02/23 PHP
PHP实现图片压缩
2020/09/09 PHP
PHP面向对象程序设计之接口的继承定义与用法详解
2018/12/20 PHP
用javascript获取地址栏参数
2006/12/22 Javascript
两个DIV等高的JS的实现代码
2007/12/23 Javascript
javascript 获取网页参数系统
2008/07/19 Javascript
SyntaxHighlighter代码加色使用方法
2008/09/07 Javascript
jQuery中:selected选择器用法实例
2015/01/04 Javascript
JavaScript学习笔记之内置对象
2015/01/22 Javascript
jquery中radio checked问题
2015/03/16 Javascript
浅谈JS中逗号运算符的用法
2016/06/12 Javascript
JavaScript实现图片切换效果
2017/08/12 Javascript
vuex state中的数组变化监听实例
2019/11/06 Javascript
再也不怕 JavaScript 报错了,怎么看怎么处理都在这儿
2020/12/09 Javascript
[02:03]DOTA2亚洲邀请赛 HGT战队出场宣传片
2015/02/07 DOTA
[05:03]2018DOTA2亚洲邀请赛主赛事首日回顾
2018/04/04 DOTA
[46:47]完美世界DOTA2联赛PWL S2 FTD vs Magma 第二场 11.20
2020/11/23 DOTA
Python决策树和随机森林算法实例详解
2018/01/30 Python
Python numpy 提取矩阵的某一行或某一列的实例
2018/04/03 Python
Python散点图与折线图绘制过程解析
2019/11/30 Python
django的模型类管理器——数据库操作的封装详解
2020/04/01 Python
Python word文本自动化操作实现方法解析
2020/11/05 Python
HTML5 localStorage使用总结
2017/02/22 HTML / CSS
详解三种方式实现平滑滚动页面到顶部的功能
2019/04/23 HTML / CSS
GLAMGLOW格莱魅美国官网:美国知名的面膜品牌
2016/12/31 全球购物
手机业务员岗位职责
2013/12/13 职场文书
一年级学生评语
2014/04/23 职场文书
安全口号大全
2014/06/21 职场文书
奶茶店创业计划书
2014/08/14 职场文书
2014年流动人口工作总结
2014/11/26 职场文书
鲁迅故居导游词
2015/02/05 职场文书
家电创业计划书
2019/08/05 职场文书
python使用matplotlib绘制图片时x轴的刻度处理
2021/08/30 Python