小程序使用webview內(nèi)嵌h5頁面 wx.miniProgram.getEnv失效問題
背景
最近接到一個h5需求,和普通的h5不一樣,這個h5頁面是嵌入到小程序中使用的,需求簡單來說就是展示一個跳轉(zhuǎn)按鈕,判斷如果是小程序環(huán)境下就進行跳轉(zhuǎn)到其他小程序頁面。
實現(xiàn)思路
核心邏輯其實就是判斷小程序環(huán)境這一塊,我們可以直接使用wxsdk來進行判斷小程序環(huán)境,由于公司內(nèi)部已經(jīng)有這些api的封裝,所以實現(xiàn)起來比較簡單。
windows.wx實際上就是wxsdk的對象
//判斷是否在微信環(huán)境 const isWeixin = /MicroMessenger/i.test(navigator.userAgent); // 獲取微信運行環(huán)境 const getWxEnv = () => { return new Promise((resolve) => { let windows: any = window if (!windows.wx) resolve("wechat"); windows.wx.miniProgram.getEnv((res) => { if (res.miniprogram) { resolve("miniprogram"); } else { resolve("wechat"); } }); }); } // 判斷是否在微信小程序環(huán)境 const isMiniprogram = async () => isWeixin && (await getWxEnv()) === "miniprogram";
之后使用isMinnipragram變量即可直接判斷是否是小程序環(huán)境
問題
wx.miniProgram.getEnv失效,無法正確判斷是否為小程序環(huán)境。
盤查后發(fā)現(xiàn),無法正確拿到windows對象,原因是小程序中使用webview這個標簽去嵌套h5頁面,原理其實是使用了原生的iframe標簽,導(dǎo)致在子頁面中真機無法準確獲取頁面運行環(huán)境
解決
竟然我們在該子頁面沒法精確拿到windows對象,那我們可以去拿父頁面的windows對象,代碼實現(xiàn)如下
//判斷是否在微信環(huán)境 const isWeixin = /MicroMessenger/i.test(navigator.userAgent); // 獲取微信運行環(huán)境 const getWxEnv = () => { return new Promise((resolve) => { let windows: any = window windows = windows.wx ? windows : parent.window if (!windows.wx) resolve("wechat"); windows.wx.miniProgram.getEnv((res) => { if (res.miniprogram) { resolve("miniprogram"); } else { resolve("wechat"); } }); }); } // 判斷是否在微信小程序環(huán)境 const isMiniprogram = async () => isWeixin && (await getWxEnv()) === "miniprogram";
在windows前面加上個parent去拿到父頁面的windows對象即可,不過我們還是最好要做一下判斷,如果當前子頁面的windows對象中有wx對象,那我們還是直接用該頁面的windows對象即可。
微信sdk經(jīng)常能遇到這種奇奇怪怪的問題,難怪微信開發(fā)社區(qū)一片謾罵了,又一次黑魔法記錄,淺淺記錄一下,希望能對遇到這個問題的朋友有所幫助。
到此這篇關(guān)于小程序使用webview內(nèi)嵌h5頁面 wx.miniProgram.getEnv失效問題的文章就介紹到這了,更多相關(guān)小程序 wx.miniProgram.getEnv失效內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript代碼壓縮工具UglifyJS和Google Closure Compiler的基本用法
網(wǎng)上搜索了,目前主流的Js代碼壓縮工具主要有Uglify、YUI Compressor、Google Closure Compiler,簡單試用了UglifyJS 和Google Closure Compiler 兩種工具的基本用法,需要的朋友可以參考下2020-04-04深入理解JavaScript系列(16) 閉包(Closures)
本章我們將介紹在JavaScript里大家經(jīng)常來討論的話題 —— 閉包(closure)。閉包其實大家都已經(jīng)談爛了。盡管如此,這里還是要試著從理論角度來討論下閉包,看看ECMAScript中的閉包內(nèi)部究竟是如何工作的2012-04-04IE6下javasc#ipt:void(0) 無效的解決方法
本篇文章主要是對IE6下javasc#ipt:void(0) 無效的解決方法進行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助2013-12-12學習JSON.stringify的9大特性和轉(zhuǎn)換規(guī)則
本文介紹JSON.stringify9大特性和轉(zhuǎn)換規(guī)則,JSON.stringify()方法將一個JavaScript對象或值轉(zhuǎn)換為?JSON?字符串,如果指定了一個replacer?函數(shù),則可以選擇性地替換值,或者指定的replacer是數(shù)組,則可選擇性地僅包含數(shù)組指定的屬性,更多內(nèi)容需要的小火煸可以參考下面溫行內(nèi)容2022-02-02javascript 兼容FF的onmouseenter和onmouseleave的代碼
經(jīng)過測試發(fā)現(xiàn),例子1 在 ff下抖動的厲害,ie下稍微有點。 具體原因 其實就是 mouseout 的冒泡機制 引起的。2008-07-07微信小程序?qū)W習總結(jié)(三)條件、模板、文件引用實例分析
這篇文章主要介紹了微信小程序條件、模板、文件引用,結(jié)合實例形式分析了微信小程序if條件判斷、模板調(diào)用、wxss文件引用等相關(guān)操作技巧,需要的朋友可以參考下2020-06-06