H5开发中常遇到的坑锦集

933 阅读3分钟
原文链接: mp.weixin.qq.com
微信H5开发中常见的坑

微信H5开发坑点

坑点1:android、ios做分享时,若是hash路由模式下,无法加载正常url,发现分享的链接变成(https://xxx.com/?from=grounmessage&installed=0#/register?code=1111&locale=zh_cn之类的)。

解决方法:在/#/里加query值

例如:

坑点2:ios分享朋友圈方法(onMenuShareTimeline)时不会执行成功回调。

解决方法:成功回调加上延 迟(500ms即可)

例如:

坑点3:ios键盘唤起后页面input不能再次输入(input输入错位)。

出现原因:固定定位的元素 在元素内 input 框聚焦的时候 弹出的软键盘占位 失去焦点的时候软键盘消失 但是还是占位的 导致input框不能再次输入。

解决方法:  在失去焦点的时候给一个事件,使页面滚动条高度和当前一致。

例如:

//js部分getTop() {  setTimeout(() => {    var scrollHeight =     document.documentElement.scrollTop     || document.body.scrollTop || 0;    window.scrollTo(0, Math.max(scrollHeight, 0));  }, 100); }

坑点4:安卓微信H5弹出软键盘后挡住input输入框。

解决办法: 给input和textarea标签添加focus事件,如下,先判断是不是安卓手机下的操作,当然,可以不用判断机型,Document 对象属性和方法,setTimeout延时0.5秒,因为调用安卓键盘有一点迟钝,导致如果不延时处理的话,滚动就失效了。

changefocus(){  let u = navigator.userAgent,   app = navigator.appVersion;  let isAndroid = u.indexOf('Android') > -1   || u.indexOf('Linux') > -1;  if(isAndroid){    setTimeout(function() {      document.activeElement.      scrollIntoViewIfNeeded();      document.activeElement.scrollIntoView();    }, 500);         }},

坑点5:微信jssdk中微信支付wx.chooseWXPay的支付签名时间戳。     微信jssdk中的所有使用timestamp字段均为小写。 但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符。

坑点6:IOS不支持new Date("2019-01-01 00:00:00") 这种格式。

var date =new Date("2020-02-10 00:00:00");
这种写法在pc和android都能正常使用,但是ios只支持var date =new Date("2020/02/10")这种写法。调试发现 2020/02/10 等同 2010-02-10 00:00:00 ,也就是说ios默认就是从0开始计算的,我们不需要设置后面的时分秒为 00:00:00。

坑点7:vue单页应用 微信分享一直提示签名错误invalid signature 。根据官方文档说是需要当前页面出去‘#hash’部分的链接,并且需要encodeURIComponent,可是安卓正常了, ios还是报错。

出现原因: history模式下视图是通过pushState来切换的,但是IOS微信客户端(安卓客户端已经修复了)不支持pushState的H5新特性,所以路由变化了但是微信浏览器获取到的url没有变化,右上角复制链接发现,微信记录的url还是第一次进入时的url,除非你手动刷新,或者使用window.location等页面跳转方法刷新,才能获取到最新的url。

解决方法: 页 面进入的时候记录url,如果是iOS设备那么使用这个url获取微信签名。

router.afterEach(to => {  sessionStorage.setItem('currentUrl',  window.location.href)})let url = encodeURIComponent(location.href.split('#')[0])if(system == "iOS" && sessionStorage.getItem('currentUrl')) {  url = encodeURIComponent(  sessionStorage.getItem('currentUrl').split('#')[0])}

更多前端技能请关注公众号”极致简文“ ▼ 往期精彩回顾 ▼ React组件与生命周期 React函数组件和Class组件以及Hooks

2020年最火爆的Vue.js面试题

Redux使用之我要买个女朋友(入门篇)