1. 程式人生 > 其它 >微信小程式獲取膠囊的位置API wx.getMenuButtonBoundingClientRect()獲取失敗的處理

微信小程式獲取膠囊的位置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);
    },
  },