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一家大拿!的更多相关文章

  1. click事件和mousedown、mouseup事件

    点击select标签元素的时候,会弹出下拉.然而当option中没有元素时,就不希望弹出下拉(比如在某些浏览器中,点击select会默认出一个罩层效果,而此时没有数据选择的话,弹出比较不友好). 首先 ...

  2. JavaScript区分click事件和mousedown(mouseup、mousemove)方法

    在前端开发工作中,会遇到这样问题:针对同一个dom元素,即希望为它绑定click事件,又想该元素可以允许拖拽的效果.而使用拖拽的效果,我们一般就会用到mousedown,mousemove和mouse ...

  3. JQuery使用mousedown和mouseup简单判断鼠标按下与释放位置是否相同

    在JQuery中,我们可以利用mousedown.mouseup来跟踪页面的鼠标按下与释放事件. 如何获取鼠标的位置信息呢?事件event的pageX和pageY属性可以让我们获得鼠标在页面中的具体位 ...

  4. mousedown、mouseup、click事件之间的关系及执行顺序

      三个事件的触发时机 mousedown 当鼠标指针移动到元素上方,并按下鼠标按键(左.右键均可)时,会发生 mousedown 事件.与 click 事件不同,mousedown 事件仅需要按键被 ...

  5. javascript简单拖拽(鼠标事件 mousedown mousemove mouseup)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...

  6. jquery事件 【mousedown与mouseup ----keydown与keypress与keyup】focus--blur--orrer--pageX-pageY

    <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> ...

  7. 【终极答案】搭建selenium3.11 +Firefox+python3.6自动化UI测试环境踩的坑

    1 运行之后,出现如下报错 Selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executable needs ...

  8. 使用WatiN进行UI自动化测试

    Watin是一个UI自动化测试工具,支持ie/firefox,官方网站:http://watin.org/. 主要有以下特点: 支持主要的html元素,见:http://watin.org/docum ...

  9. 内存分配器 (Memory Allocator)

    对于大多数开发人员而言,系统的内存分配就是一个黑盒子,就是几个API的调用.有你就给我,没有我就想别的办法. 来UC前,我就是这样觉得的.实际深入进去时,才发现这个领域里也是百家争鸣.非常热闹.有操作 ...

  10. 最终解决 mouseenter, mouseleave , mouseout mousehover mousemove等事件的区别?

    在jquery中, html页面的div的显示和隐藏, 修改等的功能, 最终都要由 事件 触发来引用, 不管是键盘事件, 还是鼠标事件... mouseenter和mouseleave是成对对应的, ...

随机推荐

  1. python渗透脚本小子速成教程

    python代码即脚本,脚本小子即是python.python只有几个类:常量.字符串,API不可知的数,变量定义.常量是不变固定的,变量是可变的,字符串一般都是单引号''和双引号"&quo ...

  2. Spring单元测试(一)入门与实践

    问题:如何快速测试,而不是每次测试都要重启应用? 目标:尽量只测试局部代码 不同的测试 软件工程中分为:单元测试.集成测试.功能测试.系统测试.其中功能测试和系统测试一般是测试人员的责任,但单元测试和 ...

  3. C#实现文件的压缩和解压缩

    原文链接:https://www.cnblogs.com/sunyaling/archive/2009/04/13/1434602.html 在C#中实现文件的压缩和解压缩,需要使用第三方的组建完成. ...

  4. 新塘M051 关于 System Tick设置,3种方法操作

    关于 System Tick设置,给出3种方法,学习并确认OK: 使用 M051BSPv3.01.001版本 一.使用函数CLK_EnableSysTick() 1 //Enable System T ...

  5. elementUI中如何在Tabs标签页的标题文字后面添加文字或图标

    1.效果如下: 实现代码如下:<el-tab-pane name="first"> <span slot="label"> <sp ...

  6. 【效能提升】上线前漏了SQL脚本,漏加上某个配置项了?

    背景 一个版本从开始开发到上线,可能经历10多天,甚至更久. 由于这个过程的时间较长,难免出现某些需要执行的SQL脚本.需要配置的配置项,到了上线前,却被遗漏了,最后导致出现线上问题才发现. 我们团队 ...

  7. Bean的原始版本与最终版本不一致?记一次Spring IOC探索之旅

    前言 在这个信息技术发展迅速的时代,万万没想到,Spring自2003年发展至今,仍是技术选型中的首选,某些项目甚至有Spring全家桶的情况. 在Java开发者面试当中,Spring的原理也常被面试 ...

  8. 【技术美术】GPU渲染管线笔记

    [技术美术]GPU 渲染管线笔记 基本术语 基元.图面: 网格中所使用的顶点数据布局,常见的如点.线.三角面等,特殊的甚至包括一些带邻近基元的基元类型. 参数语义 语义是附加到着色器输入或输出参数的字 ...

  9. MD5 - windows也可以查询某个文件的MD5码

    命令格式 certutil -hashfile 文件名称 md5 示例 Microsoft Windows [版本 10.0.22621.1702] (c) Microsoft Corporation ...

  10. HDP集群部署

    一.环境准备 centos7 安装和系统环境处理 1)运行初始化脚本 !/bin/bash ------------------------------------- 系统环境初始化脚本 本脚本仅支持 ...