mousedown mouseenter mouseup firefox,还是通一用webkit吧,细节的坑刚刚填,毕竟现在是webkit一家大拿!
mouse,mouseup,mouseenter,mouseover,click坑呀,浏览器表现居然不一致;
firefox呀
直接上代码吧,自定义个el-table的select,chrome表现正常;
firefox就诡异了,mousedown->mouseup,中间不触发mouseover,mouseenter,并且鼠标移出到其它td上up后,居然只能还是在起始td上;并且必然出发click事件;
真是醉了,这个设计也太扯了!
另外扯个firefox开发者工具的鸡肋堆栈跟踪,只显示几个,根本对分析无意义,为什么不显示完整的呢?chrome的堆栈跟踪就很到位,另外html的事件跟踪也完整的。
事实证明呀,还是要走webkit的,firefox再见吧。

1 const tableSelect: DirectiveOptions = {
2
3
4 componentUpdated: (el, binding, vnode) => {
5 let option = binding.value;
6 vnode.context?.$nextTick(() => {
7
8 var rowSelector = `.el-table__body-wrapper table.el-table__body tr.el-table__row`;
9 let clearSelected = function (option) {
10 el.querySelectorAll(`${rowSelector} td`).forEach(function (td) {
11 td.style.backgroundColor = '';
12 option.td_selected = [];
13 });
14 };
15 option.td_selected = [];
16 let td_mousedown;
17 let td_list = el.querySelectorAll(`${rowSelector} td`);
18
19 td_list.forEach(function (td) {
20 if (!td.querySelector('input')) {
21 td.onmousedown = (function (ev) {
22 document.body.onselectstart = () => true;
23 clearSelected(option);
24 });
25 td.onmouseup = (function (ev) {
26 td_mousedown = undefined;
27 });
28 return;
29 }
30 td.onmousedown = function(ev){
31
32 if (ev.button != 0) return;
33 td_mousedown = this;
34 document.body.onselectstart = () => false;
35 clearSelected(option);
36 };
37 td.onmouseover = (function (ev) {
38 console.log('onmouseover',this);
39 if (td_mousedown == undefined) return;
40 clearSelected(option);
41 //选区
42 let range = {
43 p1: {row: td_mousedown.parentNode.rowIndex, col: td_mousedown.cellIndex},
44 p2: {row: this.parentNode.rowIndex, col: this.cellIndex},
45 };
46 if (range.p1.row > range.p2.row || range.p1.col > range.p2.col) {
47 range = {p1: range.p2, p2: range.p1};
48 }
49 option.td_selected = [];
50 let rows = el.querySelectorAll(`${rowSelector}`);
51
52 for (let i = range.p1.row; i <= range.p2.row; i++) {
53 let row = rows[i];
54 let cols = row.querySelectorAll('td');
55 for (let j = range.p1.col; j <= range.p2.col; j++) {
56 let td = cols[j];
57 td.style.backgroundColor = '#3390ff';
58 option.td_selected.push({td: td, tr: row, row: i, col: j});
59 }
60 }
61 })
62 td.onmouseup = (function (ev) {
63 //console.log(this,td_mousedown)
64 if (ev.button != 0) return;
65 if (td_mousedown && td_mousedown != this) {
66 if (option.fn) {
67 option.fn(option);
68 }
69 }
70 td_mousedown = undefined;
71 });
72 });
73
74
75 });
76
77
78 }
79 }
80 ;
81 export default tableSelect;
mousedown mouseenter mouseup firefox,还是通一用webkit吧,细节的坑刚刚填,毕竟现在是webkit一家大拿!的更多相关文章
- click事件和mousedown、mouseup事件
点击select标签元素的时候,会弹出下拉.然而当option中没有元素时,就不希望弹出下拉(比如在某些浏览器中,点击select会默认出一个罩层效果,而此时没有数据选择的话,弹出比较不友好). 首先 ...
- JavaScript区分click事件和mousedown(mouseup、mousemove)方法
在前端开发工作中,会遇到这样问题:针对同一个dom元素,即希望为它绑定click事件,又想该元素可以允许拖拽的效果.而使用拖拽的效果,我们一般就会用到mousedown,mousemove和mouse ...
- JQuery使用mousedown和mouseup简单判断鼠标按下与释放位置是否相同
在JQuery中,我们可以利用mousedown.mouseup来跟踪页面的鼠标按下与释放事件. 如何获取鼠标的位置信息呢?事件event的pageX和pageY属性可以让我们获得鼠标在页面中的具体位 ...
- mousedown、mouseup、click事件之间的关系及执行顺序
三个事件的触发时机 mousedown 当鼠标指针移动到元素上方,并按下鼠标按键(左.右键均可)时,会发生 mousedown 事件.与 click 事件不同,mousedown 事件仅需要按键被 ...
- javascript简单拖拽(鼠标事件 mousedown mousemove mouseup)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...
- jquery事件 【mousedown与mouseup ----keydown与keypress与keyup】focus--blur--orrer--pageX-pageY
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> ...
- 【终极答案】搭建selenium3.11 +Firefox+python3.6自动化UI测试环境踩的坑
1 运行之后,出现如下报错 Selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executable needs ...
- 使用WatiN进行UI自动化测试
Watin是一个UI自动化测试工具,支持ie/firefox,官方网站:http://watin.org/. 主要有以下特点: 支持主要的html元素,见:http://watin.org/docum ...
- 内存分配器 (Memory Allocator)
对于大多数开发人员而言,系统的内存分配就是一个黑盒子,就是几个API的调用.有你就给我,没有我就想别的办法. 来UC前,我就是这样觉得的.实际深入进去时,才发现这个领域里也是百家争鸣.非常热闹.有操作 ...
- 最终解决 mouseenter, mouseleave , mouseout mousehover mousemove等事件的区别?
在jquery中, html页面的div的显示和隐藏, 修改等的功能, 最终都要由 事件 触发来引用, 不管是键盘事件, 还是鼠标事件... mouseenter和mouseleave是成对对应的, ...
随机推荐
- pycharm上传github问题:rejected
我从pycharm上传项目时,遇到的问题: 以下是一些解决思路: 这个错误提示表明,你在尝试将本地代码推送到远程仓库时,远程仓库中已经包含了你本地尚未获取的更改.换句话说,远程仓库的代码比你的本地代码 ...
- [MQ] Kafka
概述: Kafka 安装指南 安装 on Windows Step1 安装 JDK JDK 安装后: 在"系统变量"中,找到 JAVA_HOME,如果没有则新建,将其值设置为 JD ...
- 在使用HOperatorSet.Draw忘记点击右键结束方法无法关闭窗体问题如何规避
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/17270056.html 可以在离开窗体或者关闭窗体事件中调用HOperatorSet.HIOC ...
- 阿里巴巴开源ETL(数据的抽取、转换、加载)工具-----DataX
一个比Sqoop好用的数据传输工具 下载maven的时候,加一个 -P让下载的压缩包到指定目录 而要让档案自动储存到指令的目录下,则需要借用-P这个参数wget -p 目录 网址wget -P /ro ...
- DeepSeek满血版测试
技术背景 很多厂商以次充好,用蒸馏版DeepSeek冒充满血版.本文提供一些收集的问题集,可以用于测试是否满血DeepSeek.经过实际测试,国内厂商中只有满血版DeepSeek可以全对.但是各厂商后 ...
- Spring Boot 3.0深度实战:从核心特性到生产级调优
一.Spring Boot 3.0核心特性解读 1.1 JDK 17 LTS支持(实测性能提升) 记录类(Record)与Spring Data JPA完美适配 模式匹配简化类型判断 密封类(Seal ...
- Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
引言:AI技术新纪元的破局者 2025年3月6日凌晨,武汉Monica团队正式发布全球首款通用AI代理系统Manus,该工具在GitHub开源社区引发热议,单日Star数突破5万.与传统对话式AI不同 ...
- js回忆录(3) -- 循环语句,前后缀运算符
计算机对于大批量数据的处理速度比起人类不知道快了多少,因此对于重复的操作,使用循环语句处理是很方便的,对于我们前端来说,给同一标签的元素绑定事件啦,tab切换啦,左右联动效果啦,等等都可以使用循环语句 ...
- Window10永久暂停(禁用)自动更新
终于彻底设置window10不自动更新了(禁用自动更新) 设置成功后的标识 设置成功后,重启电脑再打开就会显示这样的,这个才是禁用成功的标识: 之前安装了window 10 ,但是window 10 ...
- SecureCRT配置跳板机
跳板机(Jump Server),也称堡垒机,是一类可作为跳板批量操作远程设备的网络设备,是运系统管理员或运维人员常用的操作平台之一. 大家知道,在日常的开发中,有可能我们的本机不能够直接连线上的服务 ...