记一次多事件绑定中自己给自己设置的坑——click,dblclick,mousedown,mousemove,mouseup
项目综述
- 在页面中模拟某操作系统的操作界面,提供应用窗口的最大化、最小化、还原等功能
需求
- 对一个应用窗口标题栏双击使其铺满整个视口,再次双击还原到原来大小,和位置
- 部分代码片段如下:
win.addEventListener('dblclick', (event) => {
if (cache && cache.status === 'normal') {
Win.maximize(id);
} else if (cache && cache.status === 'maximize') {
Win.restore(id);
}
});
- 在Win.restore()和Win.maximize()方法中通过id读取该应用的缓存信息
{
top: app.cache.pos.top,
left: app.cache.pos.left,
width: app.size.width,
height: app.size.height,
}
问题
Chrome浏览器(87)
- 使用电脑自带触摸板进行双击测试,正常
- 使用鼠标进行双击测试,双击事件触发后cache.pos内的内容丢失,top和left属性不存在,cache中其余属性正常
Edge浏览器(87)
- 表现与Chrome浏览器一致
Firefox浏览器(84)
- 在使用电脑自带触摸板和鼠标测试时,双击事件触发后均出现cache.pos内的内容丢失的情况,其余属性正常
猜想
- 对象嵌套深度问题???毕竟嵌套最深的丢了,其他的都没事
// 将left和top直接定义在cache,表现与之前测试结果一致,修改无效
{
top: app.cache.top,
left: app.cache.left,
width: app.size.width,
height: app.size.height,
}
- 命名冲突问题???
// 将属性名加上前缀,表现与之前测试结果一致,修改无效
{
top: app.cache.winTop,
left: app.cache.winLeft,
width: app.size.width,
height: app.size.height,
}
事件冲突问题,该元素同时定义了单击事件,但注释掉单击事件后问题依旧存在
双击事件的BUG????????
// 使用单击事件模拟双击事件,在谷歌和Edge中使用触摸板最大化和还原也会造成数据丢失了
function doubleclick(elem, onsingle, ondouble) {
if (dblFlag) {
dblFlag = true;
setTimeout(function () {
if (dblFlag) {
onsingle(elem);
}
dblFlag = false;
}, 300);
} else {
dblFlag = false;
ondouble(elem);
}
}
解决
就在我已经快要放弃这个功能的时候,发现这个元素还绑定了另外一个事件
为了让窗口可以在页面中自由拖动,加入了mousedown,mousemove,mouseup事件模拟拖拽事件,提前声明变量currentLeft和currentTop,在mousemove时修改两个属性的值,在mouseup时保存当前位置,如下代码:
window.onmouseup = function () {
window.onmousemove = null;
app.cache.pos.left = currentLeft;
app.cache.pos.top = currentTop;
return false;
}
- 在双击事件中连续触发了mouseup和mousedown,所以给top和left写入了新值
但是,双击事件并没有触发到mousemove事件,导致currentLeft和currentTop没有值写入,还是初始的未赋值状态,并将undefined写入了缓存,也就是cache.pos内属性丢失的问题
- 知道了问题就好解决了,加一个判空就行了
window.onmouseup = function () {
window.onmousemove = null;
app.cache.pos.left = currentLeft || app.cache.pos.left;
app.cache.pos.top = currentTop || app.cache.pos.top;
return false;
}
- 至于使用触摸板和使用鼠标导致差异,大概是用鼠标手比较稳,双击不会出现位置移动,而触摸板两次点击很难都点中同一位置,或多或少有差异,触发mousemove写入了新值
- 不同浏览器的不同表现,大概是对双击事件中两次点击的误差范围规定不同,改用了单击事件模拟双击事件后,浏览器的表现就一致了
反思
- 能给初始值就给初始值,不能给初始值在使用的时候一定要给默认值!
- 别瞎想,看看自己的猜想,连边都没有摸到,在用单击事件模拟双击时就应该联想到其余的事件,然后检查是否相互影响
- 就自己目前的水平,所有的问题都一定是自己的问题!
- 自己坑起自己来果然是不遗余力啊!
记一次多事件绑定中自己给自己设置的坑——click,dblclick,mousedown,mousemove,mouseup的更多相关文章
- javascript简单拖拽(鼠标事件 mousedown mousemove mouseup)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...
- 关于.net core 在docker中监听地址设置踩坑记
1.今天在做docker容器的时候发现如果将.net core 内部监听地址设置为localhost:8888. 2.在docker build -p 6444:8888 运行容器后,外部通过6444 ...
- jQuery 中的事件绑定
一.事件概念 和数据库中的触发器一样,当操作了数据的时候会引发对应的触发器程序执行 一样,JS 中的事件就是对用户特定的行为作出相应的响应的过程,其实上就是浏览器 监听到用户的某些行为的时候会执行对应 ...
- js实例分析JavaScript中的事件委托和事件绑定
我们在学习JavaScript中,难免都会去网上查一些资料.也许偶尔就会遇到“事件委托”(也有的称我“事件代理”,这里不评论谁是谁非.以下全部称为“事件委托”),尤其是在查JavaScript的事件处 ...
- 深入学习jQuery事件绑定
× 目录 [1]bind [2]trigger [3]delegate[4]on[5]one 前面的话 javascript有HTML.DOM0级.DOM2级和IE这四种事件处理程序,而jQuery对 ...
- jQuery-1.9.1源码分析系列(十) 事件系统——事件绑定
事件绑定的方式有很多种.使用了jQuery那么原来那种绑定方式(elem.click = function(){...})就不推荐了,原因? 最主要的一个原因是elem.click = fn这种方式只 ...
- js事件绑定及深入
学习要点: 1.传统事件绑定的问题2.W3C事件处理函数3.IE事件处理函数4.事件对象的其他补充 事件绑定分为两种:一种是传统事件绑定(内联模型,脚本模型),一种是现代事件绑定(DOM2级模型).现 ...
- JQuery实现click事件绑定与触发方法分析
原生JS通过什么方法绑定click事件? 原生js有一下三种方法为DOM对象绑定click事件, 第一种,在html中添加 onclick属性,在此属性中添加要绑定的事件函数,如下, 这种方法为htm ...
- jQuery三种事件绑定方式.bind(),.live(),.delegate()
.bind(), .live(), 和 .delegate()之间的区别并不明显.但是理解它们的不同之处有助于写出更简洁的代码,并防止我们的交互程序中出现没有预料到的bug. 基础 DOM树 首先,图 ...
随机推荐
- Python Flask后端异步处理(二)
在实际的应用场景中,如用户注册,用户输入了注册信息后,后端保存信息到数据库中,然后跳转至登录界面,这些操作用户需要等待的时间非常短,但是如果是有耗时任务,比如对输入的网址进行漏洞扫描,在后端处理就会花 ...
- Day3 【Scrum 冲刺博客】
每日会议总结 昨天已完成的工作 方晓莹(PIPIYing) 开始人员管理页 搭建与后台对接的相关配置 方子茵(Laa-L) 完成车辆查询接口 黄芯悦(Sheaxx) 完善社区通知页面 完善社区活动页面 ...
- Tensorflow学习笔记No.11
图像定位 图像定位是指在图像中将我们需要识别的部分使用定位框进行定位标记,本次主要讲述如何使用tensorflow2.0实现简单的图像定位任务. 我所使用的定位方法是训练神经网络使它输出定位框的四个顶 ...
- sqli-labs less-24(二次注入)
less-24 原理: 在网站处理用户提交的数据的时候,只是将某些敏感字符进行了转义.因而使得用户第一次提交的时候不会被当做代码执行.但是这些数据存入数据库的时候却没有转义,而网站程序默认数据库中的数 ...
- MySQL 5.7.29主从安装配置
一.环境准备(关闭防火墙) 1.清除已安装数据库 [root@mysql01 ~]# rpm -qa | grep mariadb mariadb-libs-5.5.35-3.el7.x86_64 [ ...
- Hbase备份以及清表脚本
脚本主要是方便自己工作使用,服务器环境中配置了hbase相关环境变量 1.hbase备份脚本 #!/bin/bash tableList=("table1" "table ...
- django配置-mysql数据库相关配置
Django3版本之前的配置 1. Django默认配置的数据库是sqlite 2. 使用mysql数据库需要下载的包 pip3 install PyMySQL 3. Django配置PyMySQL ...
- SysCtlDelay 实现延时
SysCtlDelay 实际上由 3 条汇编指令实现,一次可以延时 3 个 clock. 例如,初始化系统时钟: SysCtlClockFreqSet((SYSCTL_XTAL_16MHZ | SYS ...
- css 02-CSS属性:背景属性
02-CSS属性:背景属性 #background 的常见背景属性 css2.1 中,常见的背景属性有以下几种:(经常用到,要记住) background-color:#ff99ff; 设置元素的背景 ...
- SpringBoot从入门到精通教程(五)
上节,我们讲了 SpringBoot 如何使用MyBatis 今天我们讲讲 Springboot Logo自定义的问题, 我们在启动 SpringBoot 时,控制台会打印 SpringBoot Lo ...