小程序使用webview內(nèi)嵌h5頁面 wx.miniProgram.getEnv失效問題
背景
最近接到一個(gè)h5需求,和普通的h5不一樣,這個(gè)h5頁面是嵌入到小程序中使用的,需求簡單來說就是展示一個(gè)跳轉(zhuǎn)按鈕,判斷如果是小程序環(huán)境下就進(jìn)行跳轉(zhuǎn)到其他小程序頁面。
實(shí)現(xiàn)思路
核心邏輯其實(shí)就是判斷小程序環(huán)境這一塊,我們可以直接使用wxsdk來進(jìn)行判斷小程序環(huán)境,由于公司內(nèi)部已經(jīng)有這些api的封裝,所以實(shí)現(xiàn)起來比較簡單。
windows.wx實(shí)際上就是wxsdk的對(duì)象
//判斷是否在微信環(huán)境 const isWeixin = /MicroMessenger/i.test(navigator.userAgent); // 獲取微信運(yùn)行環(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對(duì)象,原因是小程序中使用webview這個(gè)標(biāo)簽去嵌套h5頁面,原理其實(shí)是使用了原生的iframe標(biāo)簽,導(dǎo)致在子頁面中真機(jī)無法準(zhǔn)確獲取頁面運(yùn)行環(huán)境
解決
竟然我們?cè)谠撟禹撁鏇]法精確拿到windows對(duì)象,那我們可以去拿父頁面的windows對(duì)象,代碼實(shí)現(xiàn)如下
//判斷是否在微信環(huán)境 const isWeixin = /MicroMessenger/i.test(navigator.userAgent); // 獲取微信運(yùn)行環(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前面加上個(gè)parent去拿到父頁面的windows對(duì)象即可,不過我們還是最好要做一下判斷,如果當(dāng)前子頁面的windows對(duì)象中有wx對(duì)象,那我們還是直接用該頁面的windows對(duì)象即可。
微信sdk經(jīng)常能遇到這種奇奇怪怪的問題,難怪微信開發(fā)社區(qū)一片謾罵了,又一次黑魔法記錄,淺淺記錄一下,希望能對(duì)遇到這個(gè)問題的朋友有所幫助。
到此這篇關(guān)于小程序使用webview內(nèi)嵌h5頁面 wx.miniProgram.getEnv失效問題的文章就介紹到這了,更多相關(guān)小程序 wx.miniProgram.getEnv失效內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(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)。閉包其實(shí)大家都已經(jīng)談爛了。盡管如此,這里還是要試著從理論角度來討論下閉包,看看ECMAScript中的閉包內(nèi)部究竟是如何工作的2012-04-04IE6下javasc#ipt:void(0) 無效的解決方法
本篇文章主要是對(duì)IE6下javasc#ipt:void(0) 無效的解決方法進(jìn)行了介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助2013-12-12學(xué)習(xí)JSON.stringify的9大特性和轉(zhuǎn)換規(guī)則
本文介紹JSON.stringify9大特性和轉(zhuǎn)換規(guī)則,JSON.stringify()方法將一個(gè)JavaScript對(duì)象或值轉(zhuǎn)換為?JSON?字符串,如果指定了一個(gè)replacer?函數(shù),則可以選擇性地替換值,或者指定的replacer是數(shù)組,則可選擇性地僅包含數(shù)組指定的屬性,更多內(nèi)容需要的小火煸可以參考下面溫行內(nèi)容2022-02-02使用Web?Component實(shí)現(xiàn)防篡改水印
Web?Component內(nèi)部有鉤子天然支持被篡改時(shí)被觸發(fā),用來防篡改非常方便,所以本文就將使用Web?Component實(shí)現(xiàn)防篡改水印,感興趣的小伙伴可以了解下2023-12-12javascript 兼容FF的onmouseenter和onmouseleave的代碼
經(jīng)過測(cè)試發(fā)現(xiàn),例子1 在 ff下抖動(dòng)的厲害,ie下稍微有點(diǎn)。 具體原因 其實(shí)就是 mouseout 的冒泡機(jī)制 引起的。2008-07-07微信小程序?qū)W習(xí)總結(jié)(三)條件、模板、文件引用實(shí)例分析
這篇文章主要介紹了微信小程序條件、模板、文件引用,結(jié)合實(shí)例形式分析了微信小程序if條件判斷、模板調(diào)用、wxss文件引用等相關(guān)操作技巧,需要的朋友可以參考下2020-06-06全面解析Bootstrap彈窗的實(shí)現(xiàn)方法
這篇文章全面解析Bootstrap彈窗的實(shí)現(xiàn)方法,對(duì)其結(jié)構(gòu)進(jìn)行詳細(xì)分析,感興趣的小伙伴們可以參考一下2015-12-12