zoukankan      html  css  js  c++  java
  • 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;
  • 相关阅读:
    旁注攻击介
    简单讲解什么是黑帽SEO
    ADO.NET基础必背知识
    Burp Suite Pro1.7.36破解版
    Screen命令让Linux shell在后台运行
    网站seo优化教你如何引蜘蛛爬行网站
    hibernate导入大量数据时,为了避免内存中产生大量对象,在编码时注意什么,如何去除?
    递归返回值
    利用cglib生成动态java bean
    java线程安全和线程同步
  • 原文地址:https://www.cnblogs.com/Running_Zhang/p/13299838.html
Copyright © 2011-2022 走看看