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是成对对应的, ...
随机推荐
- Luogu P4933 大师 题解 [ 绿 ] [ 线性 dp ] [ dp 细节处理 ] [ 限制转移条件优化 ]
依据值域的 \(O(n^2)\) 做法 这种做法只适用于这种值域小的题,下一种做法才是求等差数列的通解. 我们定义 \(f[i][j]\) 表示以 \(h_i\) 为最后一个数,公差为 \(j\) 的 ...
- TensorFlow 的基本概念和使用场景
TensorFlow是一个开源的机器学习框架,由Google开发并维护.它提供了一个灵活的编程环境,用于构建和训练各种机器学习模型.TensorFlow是基于图计算的模型,其中节点表示数学操作,而边表 ...
- 非局域网远程访问MySQL
使用内网穿透解决,市面上说道最多的是"花生壳" 主要操作见这篇官方说明 但其中提到的什么花生棒(第二.三点)完全不用管,应该算是产品推销. 登录后选"新增内网映射&quo ...
- 基于React的虚拟滚动方案
基于React的虚拟滚动方案 在渲染列表时我们通常会一次性将所有列表项渲染到DOM中,在数据量大的时候这种操作会造成页面响应缓慢,因为浏览器需要处理大量的DOM元素.而此时我们通常就需要虚拟滚动来实现 ...
- Git Pull Failed:You have not concluded your merge.Exiting because of unfinished merge
前言 在拉取远程代码时,出现 Git Pull Failed:You have not concluded your merge.Exiting because of unfinished merge ...
- Go new函数 例子解析答疑
package main import "fmt" func main() { p1 :=new(int) *p1 =1 fmt.Println("p1",p1 ...
- Windows下PostgreSQL设置远程连接以及备份和恢复数据库
一.设置远程连接 修改安装路径下的postgresql.conf,定位到listen_address = '*',确保其值为'*'(Windows下默认是这样的,可不用修改) 修改安装路径下的pg_ ...
- nginx下增加https端口的方法
一.进入根目录我是使用xshell进行远程连接服务器的,连接到服务器首先输入cd /进入到根目录在这里插入图片描述二.配置nginx.conf文件首先输入cd etc/nginx进入到nginx目录在 ...
- 一文速通Python并行计算:03 Python多线程编程-多线程同步(上)—基于互斥锁、递归锁和信号量
一文速通 Python 并行计算:03 Python 多线程编程-多线程同步(上)-基于互斥锁.递归锁和信号量 摘要: 在 Python 多线程编程中,线程同步是确保多个线程安全访问共享资源的关键技术 ...
- 【Linux】3.11 包管理工具(RPM和YUM)
包管理工具 1. RPM包 RPM:RedHat Package Manager,红帽软件包管理工具. Linuxd分发版本都有采用(suse,redhat,centos等) 1.1 rpm指令 1. ...