微信小程式獲取膠囊的位置API wx.getMenuButtonBoundingClientRect()獲取失敗的處理
阿新 • • 發佈:2021-07-17
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); }, },