时隔数月,终于还是踩坑了。每次踩坑都是折磨,花费数小时甚至数天,毫无头绪,只要找到症结解决其实很快,就比如我这一次的经历。
还是这个通用表格的事情,在偶然之间发现出了点问题,有时拖拽数据到表格中会拖不进,甚至出现串行的问题。既然是拖拽数据的操作问题,立即就能定位到处理逻辑。
处理逻辑其实也简单,就是获取当前鼠标的x,y相对于文档的定位,以及全部单元格的上下左右四个坐标,然后做一个计算,在单元格内部的记录拖拽数据做后续处理。那么现在拖拽不显示,甚至串行,肯定就是坐标计算出了问题。在代码中加入console.log(thObject, x, y, x1, y1, x2, y2, x < x1, x > x2, y < y1, y > y2)。
拖拽到第二个单元格,打印内容如下。
显然第二项应该全部都为false。实际x<x1和y<y1都成立了,x,y是鼠标坐标,y1是单元格上边框距离文档顶部的距离,x1是单元格左边距离文档左边的距离。按照我理解,我想先确认一下宽度距离。
此时我就踩了第一个巨坑,主要是第一天晚上加班硬是没搞出来,直到第二天才发现这个点。期间都有点怀疑我所认知的东西了,其实那时候如果有人提点一下可能早就发现了,在一个怪圈中循环往复,就是不知道哪里有问题,差点崩溃。
那这个刻骨铭心的坑是啥呢?就是系统的缩放与布局影响截屏长度显示。
讲起来,这个是不会影响系统功能的,但是这玩意儿影响人的主观判断呀。当时我只想一心解决问题,根本不会想到这些东西。就像上面图中红线标出来的距离,我用这个距离长度对比console.log打印出来的长度进行对比,发现怎么也对应不上。从习惯上来讲,判断长度最直观的方式,就是用截图工具扩选一下距离,毕竟元素内容过多,又是在循环中,不太好用debugger显示宽度。当时我系统的缩放用的175%,系统默认出厂设置,用习惯了就没有修改。所以截图工具显示的长度跟打印出来的长度是不一样的。这还是我在无意间发现的,在F12的elements标签下选中元素,框选显示的宽度,和截屏显示的宽度是不一样的。同样会影响截屏长度显示的还有浏览器的缩放。
解决了这个问题后,再对比长度,是能够正常匹配的。那么代码写的本身应该是没有漏洞的,再次观察console.log的值
第一个单元格和后面的单元格的差异,这个y1不一样,前面的是一个是317后面的是382,对比dom的值
这里有一个比较重要的区别,高度,一个是143一个是172。通过检查元素,果然,显示的元素一个是143,一个172。但是实际高度都是一样的,用截图工具看都是143。
仔细查看后面的td,发现了这个zoom,瞬间意识到了不对劲,前面一个td是没有这个属性的。
172.29*0.83=143,刚好就是这个值。而这个zoom就是前段时间做的,谷歌浏览器兼容12px以下字号做的处理,原理就是缩放。
立刻尝试,将单元格修改字号大小,设置12px以上的字体,果然拖拽就正常了。既然找到了关键信息,处理起来就方便了。通过jquery获取zoom的值,默认为1,然后对获取到的偏移值进行缩放。
这就是第二个坑,使用了zoom缩放的元素,如果有offset定位处理,一定要记得也要按比例缩放。
还没有评论,来说两句吧...