这个 BUG 需要特定的动态卡片 + 特定的设备才能复现
这个 BUG 是如何产生的?
wxml2canvas 在绘制的时候,会根据一个叫做 sorted 的对象对它的 keys 进行遍历,该对象的 key 为节点的 top 值,value 为节点元素;问题就是出在这里,该库作者误以为 Object.keys() 总是会按照实际创建属性的顺序返回,然而当 key 为正整数的时候,返回顺序就不符合原本的预期了,会出现了绘制顺序错乱,从而导致这个 BUG 的产生。
const sorted = {}sorted[300] = {}
sorted[100] = {}
sorted[200] = {}
sorted[50.5] = {}console.log(Object.keys(sorted))
会不会有同学以为答案是:[‘50.5’, ‘100’, ‘200’, '300’] 呢?
但正确的答案应该是:[‘100’, ‘200’, '300’,’50.5’]。
下面是生成小程序码的代码:
再次经过对比,发现原来大部分情况下,top 值都会是浮点数,而本次出 BUG 的卡片小程序码只是非常凑巧地为整数,导致绘制顺序不对。
我才发现 wxml2canvas 原本的逻辑是想根据 sorted 创建的顺序来绘制,但是没有考虑 key 为整数的情况。
所以,最后通过这样修改解决问题:
_sortListByTop (list = []) {let sorted = {};list.forEach((item, index) => {
- let top = item.top;
+ let top = item.top.toFixed(6); if (!sorted[top]) {if (sorted[top - 2]) {top = top - 2;}else if (sorted[top - 1]) {top = top - 1;} else if (sorted[top + 1]) {top = top + 1;} else if (sorted[top + 2]) {top = top + 2;} else {sorted[top] = [];}}sorted[top].push(item);});return sorted;
}