官网文档:https://uniapp.dcloud.net.cn/component/web-view.html#getenv
web-view
是一个 web 浏览器组件,可以用来承载网页的容器,会自动铺满整个页面(nvue 使用需要手动指定宽高)。
各小程序平台,web-view 加载的 url 需要在后台配置域名白名单,包括内部再次 iframe 内嵌的其他 url 。
属性说明
属性名 | 类型 | 说明 | 平台差异说明 |
---|---|---|---|
src | String | webview 指向网页的链接 | |
allow | String | 用于为 iframe 指定其特征策略 | H5 |
sandbox | String | 该属性对呈现在 iframe 框架中的内容启用一些额外的限制条件。 | H5 |
fullscreen | Boolean | 是否铺满整个页面,默认值:true 。 | H5 (HBuilder X 3.5.4+) |
webview-styles | Object | webview 的样式 | App-vue |
update-title | Boolean | 是否自动更新当前页面标题。默认值:true | App-vue (HBuilder X 3.3.8+) |
@message | EventHandler | 网页向应用 postMessage 时,会在特定时机(后退、组件销毁、分享)触发并收到消息。 | H5 暂不支持(可以直接使用 window.postMessage) |
@onPostMessage | EventHandler | 网页向应用实时 postMessage | App-nvue |
APP --- vue页面与h5页面通讯
// 引入需要嵌入的h5 链接 //在methods中接收h5发送的消息/*** @information message中 接收到的是由h5项目通过uni.postMessage中传递出来的数据,以数组的形式接收每次的消息*/message(event){console.log('接收到消息',event.detail.data)}
//引入uni-app的api之后 ,只需绑定事件,向APP传递消息
这个就是vue与h5 的整个通讯流程,BUT!!!,关键来了,注意点来了,就是他不能实时通讯。他只有在页面 后退,组件销毁,分享的时候会触发message事件并接收到消息,说白了就是他并不能实时通讯
解决办法
APP --- nvue页面与h5页面通讯
nuve页面对于web-view来说与vue有点点的不同
样式来说,nuve中的web-view必须指定宽高,它不像vue一样会自动铺满,需要自己自己规定,但是这个宽高不能‘写死’,咱们做的是APP端,屏幕不能是‘死’的,所以先获取手机屏幕信息之后再规定屏幕宽高吧
调试来说,nvue他现在不支持h5 哈,所以通讯这一块吧,你不能在浏览器上面调试,必须真机运行哒
方法来说,为了实时通讯,页面更换为nvue,相对应的方法也要从@message换成@onPostMessage
APP 跳转页面
在h5页面中引入web-view的方法的基础上,不但可以像上面一样进行通讯,还可以在跳转页面,达到从嵌入h5跳回到本地应用的页面上的效果,跳转页面的方式与uni-app一致,在h5页面写入方法就好
注意
这里有一个冲突点,当web-view嵌入的h5 是uni-app生成的h5资源的话,这样跳转要怎么跳转呢
使用uni.webView.navigateTo //其中的webView指的是你嵌入的h5的跳转想要跳转回应用
小程序 --- vue页面与h5页面通讯
// javascriptwx.miniProgram.postMessage({ data: 'hhh' })//此时接收不到,因为没有触发时机,所以可以进行人为操作
APP端web-view扩展
App端的webview是非常强大的,可以更灵活的控制和拥有更丰富的API。
每个vue页面,其实都是一个webview,而vue页面里的web-view组件,其实是webview里的一个子webview。这个子webview被append到父webview上。
通过以下方法,可以获得这个web-view组件对应的js对象,然后参考https://www.html5plus.org/doc/zh_cn/webview.html#plus.webview.WebviewObject,可以进一步重设这个web-view组件的样式,比如调整大小
获取当前环境
document.addEventListener('UniAppJSBridgeReady', function() { uni.getEnv(function(res) { if (res.plus) { console.log('当前环境为【5+App】'); } else if (res.miniprogram) { console.log('当前环境为【微信小程序】'); } }); })
下一篇:论文代码测试