// 过滤触摸事件,目的是为了覆盖小程序Canvas返回的事件对象中touches数组不正确的问题 // NOTE: 但是该方法面对超过两点触摸的场景,可能会出现抖动问题,考虑到当前需求只用到两点触摸,暂时多点触摸作为非法输入考虑. // TODO: 期待更好的修复方法 getCanvasEvent(e) { console.log('e: ', e); if (e.changedTouches.length >= 1) { const base = e.changedTouches[0].identifier; const index = (e.touches || []).findIndex(i => i.identifier == base); let newTouches = []; if (index > 0 && e.touches[index - 1].identifier === base - 1) { newTouches.push(e.touches[index - 1]); } newTouches = newTouches.concat(e.touches.filter(i => i.identifier >= base)); return { ...e, touches: newTouches }; } else { return e; } }
在canvas上进行双指缩放操作e.touches返回的数组有时候不准确1.在canvas上绘制一张图片 2.监听canvas的touchmove,touchstart等事件 3.先双指操作放大和缩小图片,多操作几次 4.然后再单指移动图片,此时发现仍然在缩放, 5.我区分是移动还是缩放是根据e.touches的数组长度来判断的,单指的时候也就是在第四步的时候发现e.touches数组长度仍然是2 单指的时候e.touches的长度应该是1才正确吧?
2020-06-28自己写了两个函数暂时解决一下该问题。代码如下,希望帮到后面碰到问题的人。 P.S. 这个方法无法兼容服务器端传回的cookie的值中包含有逗号的场景 [代码] /**[代码][代码] [代码][代码]* 解析多个cookie的字符串[代码][代码] [代码][代码]*/[代码][代码] [代码][代码]parse: [代码][代码]function[代码] [代码](string) {[代码][代码] [代码][代码]const list = (string || [代码][代码]''[代码][代码]).split([代码][代码]','[代码][代码]);[代码][代码] [代码][代码]const result = [];[代码][代码] [代码][代码]list.forEach(i => {[代码][代码] [代码][代码]// 合并非分隔符的数据[代码][代码] [代码][代码]if[代码] [代码](i.startsWith([代码][代码]' '[代码][代码])) {[代码][代码] [代码][代码]if[代码] [代码](result.length > 0) {[代码][代码] [代码][代码]result[result.length - 1] = result[result.length - 1] + i;[代码][代码] [代码][代码]} [代码][代码]else[代码] [代码]{[代码][代码] [代码][代码]result.push(i);[代码][代码] [代码][代码]}[代码][代码] [代码][代码]} [代码][代码]else[代码] [代码]{[代码][代码] [代码][代码]result.push(i);[代码][代码] [代码][代码]}[代码][代码] [代码][代码]});[代码][代码] [代码][代码]return[代码] [代码]result.map(i => [代码][代码]this[代码][代码].parseOne(i));[代码][代码] [代码][代码]},[代码][代码] [代码][代码]/**[代码][代码] [代码][代码]* 解析单个cookie的字符串[代码][代码] [代码][代码]*/[代码][代码] [代码][代码]parseOne: [代码][代码]function[代码] [代码](string, path, domain) {[代码][代码] [代码][代码]var[代码] [代码]s = string.replace(/;\s+/g, [代码][代码]';'[代码][代码]).split([代码][代码]';'[代码][代码])[代码][代码] [代码][代码].map([代码][代码]function[代码] [代码](s) { [代码][代码]return[代码] [代码]s.replace(/\s+\s+/g, [代码][代码]'='[代码][代码]).split([代码][代码]'='[代码][代码]); });[代码] [代码] [代码][代码]var[代码] [代码]n = s.shift();[代码] [代码] [代码][代码]var[代码] [代码]obj = {};[代码][代码] [代码][代码]obj.expires = [代码][代码]false[代码][代码];[代码][代码] [代码][代码]obj.httponly = [代码][代码]false[代码][代码];[代码][代码] [代码][代码]obj.secure = [代码][代码]false[代码][代码];[代码][代码] [代码][代码]obj.path = path || [代码][代码]'/'[代码][代码];[代码][代码] [代码][代码]obj.domain = domain || [代码][代码]''[代码][代码];[代码] [代码] [代码][代码]var[代码] [代码]I, f = {[代码][代码] [代码][代码]httponly: [代码][代码]function[代码] [代码]() { obj.httponly = [代码][代码]true[代码][代码]; },[代码][代码] [代码][代码]secure: [代码][代码]function[代码] [代码]() { obj.secure = [代码][代码]true[代码][代码]; },[代码][代码] [代码][代码]expires: [代码][代码]function[代码] [代码](v) { obj.expires = [代码][代码]new[代码] [代码]Date(v); },[代码][代码] [代码][代码]'max-age'[代码][代码]: [代码][代码]function[代码] [代码](v) { [代码][代码]if[代码] [代码](obj.expires) [代码][代码]return[代码][代码]; obj.expires = [代码][代码]new[代码] [代码]Date(([代码][代码]new[代码] [代码]Date()).valueOf() + (v * 1000)); },[代码][代码] [代码][代码]path: [代码][代码]function[代码] [代码](v) { obj.path = v; },[代码][代码] [代码][代码]domain: [代码][代码]function[代码] [代码](v) { obj.domain = v; }[代码][代码] [代码][代码]};[代码] [代码] [代码][代码]for[代码] [代码]([代码][代码]var[代码] [代码]i [代码][代码]in[代码] [代码]s) {[代码][代码] [代码][代码]I = s[i][0].toLowerCase();[代码][代码] [代码][代码]if[代码] [代码]([代码][代码]typeof[代码] [代码]f[I] != [代码][代码]'undefined'[代码][代码]) f[I](s[i].length == 2 ? s[i][1] : [代码][代码]''[代码][代码]);[代码][代码] [代码][代码]}[代码] [代码] [代码][代码]if[代码] [代码](!obj.expires) obj.expires = 0;[代码][代码] [代码][代码]obj.name = n.shift();[代码][代码] [代码][代码]n = n.map((s) => {[代码][代码] [代码][代码]var[代码] [代码]f;[代码][代码] [代码][代码]try[代码] [代码]{[代码][代码] [代码][代码]f = decodeURIComponent(s)[代码][代码] [代码][代码]} [代码][代码]catch[代码] [代码](e) { f = s }[代码][代码] [代码][代码]return[代码] [代码]s[代码][代码] [代码][代码]})[代码] [代码] [代码][代码]obj.value = n.join([代码][代码]'='[代码][代码]);[代码][代码] [代码][代码]return[代码] [代码]obj;[代码][代码] [代码][代码]}[代码]
wx.request返回的http头的格式问题在调用wx.request后,得到的 res.header['Set-Cookie'] 是类似如下的格式: ****=****:max-age=31536000; expires=Tue, 06-Aug-19 09:29:39 GMT; domain=****; path=/,****=****,****=****; path=/,****=****; path=/; domain=****; expires=Thu, 01 Jan 1970 00:00:00 GMT,****=****; max-age=3600; domain=****; path=/ 但原本应是以下格式: Set-Cookie: ****=****:max-age=31536000; expires=Tue, 06-Aug-19 09:29:39 GMT; domain=****; path=/ Set-Cookie: ****=**** Set-Cookie: ****=****; path=/ Set-Cookie: ****=****; path=/; domain=****; expires=Thu, 01 Jan 1970 00:00:00 GMT Set-Cookie: ****=****; max-age=3600; domain=****; path=/ 也就是说,在响应头中有多个Set-Cookie时,微信返回的Set-Cookie是把所有的值以逗号相连后返回的。 这样就带来了一个很棘手的问题,也就是说,当Set-Cookie中含有逗号时(在expires中就必然有一个逗号),再用逗号连接多个Set-Cookie值时就会产生分割困难的问题。对于这样的问题,是否有一个比较好的解决方法。官方是否可以改进下,不要再以逗号分隔,而是以数组形式返回,以防止出现类似的分割困难。
2019-11-08