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是成对对应的, ... 
随机推荐
- python渗透脚本小子速成教程
			python代码即脚本,脚本小子即是python.python只有几个类:常量.字符串,API不可知的数,变量定义.常量是不变固定的,变量是可变的,字符串一般都是单引号''和双引号"&quo ... 
- Spring单元测试(一)入门与实践
			问题:如何快速测试,而不是每次测试都要重启应用? 目标:尽量只测试局部代码 不同的测试 软件工程中分为:单元测试.集成测试.功能测试.系统测试.其中功能测试和系统测试一般是测试人员的责任,但单元测试和 ... 
- C#实现文件的压缩和解压缩
			原文链接:https://www.cnblogs.com/sunyaling/archive/2009/04/13/1434602.html 在C#中实现文件的压缩和解压缩,需要使用第三方的组建完成. ... 
- 新塘M051 关于 System Tick设置,3种方法操作
			关于 System Tick设置,给出3种方法,学习并确认OK: 使用 M051BSPv3.01.001版本 一.使用函数CLK_EnableSysTick() 1 //Enable System T ... 
- elementUI中如何在Tabs标签页的标题文字后面添加文字或图标
			1.效果如下: 实现代码如下:<el-tab-pane name="first"> <span slot="label"> <sp ... 
- 【效能提升】上线前漏了SQL脚本,漏加上某个配置项了?
			背景 一个版本从开始开发到上线,可能经历10多天,甚至更久. 由于这个过程的时间较长,难免出现某些需要执行的SQL脚本.需要配置的配置项,到了上线前,却被遗漏了,最后导致出现线上问题才发现. 我们团队 ... 
- Bean的原始版本与最终版本不一致?记一次Spring IOC探索之旅
			前言 在这个信息技术发展迅速的时代,万万没想到,Spring自2003年发展至今,仍是技术选型中的首选,某些项目甚至有Spring全家桶的情况. 在Java开发者面试当中,Spring的原理也常被面试 ... 
- 【技术美术】GPU渲染管线笔记
			[技术美术]GPU 渲染管线笔记 基本术语 基元.图面: 网格中所使用的顶点数据布局,常见的如点.线.三角面等,特殊的甚至包括一些带邻近基元的基元类型. 参数语义 语义是附加到着色器输入或输出参数的字 ... 
- MD5 - windows也可以查询某个文件的MD5码
			命令格式 certutil -hashfile 文件名称 md5 示例 Microsoft Windows [版本 10.0.22621.1702] (c) Microsoft Corporation ... 
- HDP集群部署
			一.环境准备 centos7 安装和系统环境处理 1)运行初始化脚本 !/bin/bash ------------------------------------- 系统环境初始化脚本 本脚本仅支持 ... 
