微信小程序获取胶囊的位置API wx.getMenuButtonBoundingClientRect()获取失败的处理

wx.getMenuButtonBoundingClientRect() ios手机偶尔复现是0

这个问题很早就有但是微信官方也一直没有解决,下面给大家介绍一个兼容做法(wx.getMenuButtonBoundingClientRect()["top"]举个例子)

1,步骤一 在app.js onLaunch生命周期中首次获取(这段代码在ios微信端有时候会返回0)

onLaunch: function (page) {
    // 获取用户信息
    let getMenuTop = wx.getMenuButtonBoundingClientRect()["top"];
    wx.setStorageSync('statusBarHeight', getMenuTop);
    if (getMenuTop == 0) {
      setTimeout(() => {
        getMenuTop = wx.getMenuButtonBoundingClientRect()["top"];
        wx.setStorageSync('statusBarHeight', getMenuTop);
      }, 400)
    }
  },
...

globalData: {
    statusBarHeight: wx.getMenuButtonBoundingClientRect()["top"]
  }

我们在用户首次进入我们小程序时候,用wx.getMenuButtonBoundingClientRect()["top"]获取一次手机胶囊top信息,这时候如果返回0

我们延迟400毫秒再获取一次,这时候将获取的值缓存起来。

*这里你问我为什么不是已经在globalData中,不用globalData,干嘛要写进缓存?

  答:实际项目上发现 如果在index.js(首页)修改globalData了里面的statusBarHeight,在其他页面拿globalData里的值还是原来的值。

  所以缓存是最好的办法

2,步骤二 在index.js onReady 里面再获取一次(有了这一次保险,获取就一点问题没有)

onReady() {
    const _this = this;
    let getMenuTop = wx.getMenuButtonBoundingClientRect()["top"];
    if (wx.getStorageSync('statusBarHeight') == 0) {
      setTimeout(() => {
        wx.setStorageSync('statusBarHeight', getMenuTop);
        _this.setData({
          statusBarHeight: getMenuTop,
        });
      }, 400);
    }
  },

但是,这个方法是在首次进入就打开index(首页)的是适用,如果你的需求是进入商品详情,那么就在商品详情(相对应的)页面添加

3,特别注意,如果你是在组件 Component 中获取高度,在 attached 组件生命周期中是最好的

lifetimes: {
    attached: function () {
      this.setData({
        statusBarHeight: wx.getStorageSync('statusBarHeight')
      })
      console.log(this);
    },
  },
原文地址:https://www.cnblogs.com/Webzhoushifa/p/15024238.html