uniapp使用webView工作實踐記錄
一、建立APP頁面和webview的通訊
1.引入webview.js
App 端使用 uni.web-view.js 的最低版為 uni.webview.1.5.4.js
APP端可以支持網(wǎng)絡(luò)網(wǎng)頁和本地網(wǎng)頁,但如果使用本地網(wǎng)頁和相關(guān)資源(js、css等文件)必須放在 static
目錄下。
2.引入搭橋document.addEventListener('UniAppJSBridgeReady',function(){})
在app端是識別不到document元素的,所以為了適配app,需要將搭橋的方法單獨建立一個js文件放到 static
目錄下
document.addEventListener('UniAppJSBridgeReady', function () { console.log('我建立起了通訊'); uni.postMessage({ data: { successFlag: true, } }); })
3.發(fā)送消息
首先<web-view>中需要添加message的監(jiān)聽,當(dāng)網(wǎng)頁向應(yīng)用 postMessage
時,會在特定時機(后退、組件銷毀、分享)觸發(fā)并收到消息。
<web-view ref="webview" :src="webViewUrl" @message="onPostMessage"></web-view>
其次網(wǎng)頁向應(yīng)用 postMessage 需要通過 wv.evalJS(``)方法,在此方法中利用uniapp的postMessage()方法向應(yīng)用發(fā)送消息
wv.evalJS(`uni.postMessage({ data: { base64: canvas.toDataURL("image/png"), } }); `)
最后在uniapp通過 onPostMessage 函數(shù)中獲取網(wǎng)頁信息
onPostMessage: function (e) { console.log(e.detail.data[0]) },
二、webview初始化遇坑
1.setJsFile() 和 appendJsFile() 方法的區(qū)別
在初始化webview時,需要引入webview.js文件和添加的搭橋 js (post.js)文件
此時需注意 setJsFile() 和 appendJsFile() 方法的區(qū)別:
setJsFile:設(shè)置新的JS文件后將清空之前設(shè)置的值。也就是后臺如果一直 setJsFile,那么只有最后一個js文件生效。
appendJsFile:添加多個js文件將按照添加的先后順序執(zhí)行。
2. 文件路徑
setJsFile() 和 appendJsFile()方法中所寫的文件路徑一定要正確
如果文件路徑從static目錄開始寫,比如這樣:
wv.setJsFile("static/uni.webview.1.5.5.js") wv.appendJsFile("static/post.js")
這樣寫在安卓端沒有問題,運行很順利,但是在 IOS 端就會發(fā)現(xiàn)這兩個方法所加文件并未生效,所以文件路徑一定要寫正確,默認(rèn)帶上'_www',
wv.setJsFile("_www/static/uni.webview.1.5.5.js") wv.appendJsFile("_www/static/post.js")
3. setJsFile() 和 appendJsFile()方法所寫時機
在渲染時寫 setJsFile() 和 appendJsFile()方法,在安卓端不會有任何問題,但在IOS端會發(fā)現(xiàn)這兩個方法并未生效
因此建議在 IOS 端 setJsFile() 和 appendJsFile() 操作應(yīng)放在監(jiān)聽 loaded 事件之后
var currentWebview = this.$scope.$getAppWebview() //此對象相當(dāng)于html5plus里的plus.webview.currentWebview()。在uni-app里vue頁面直接使用plus.webview.currentWebview()無效 this.wv = currentWebview.children()[0] this.wv.addEventListener("loaded", () => { this.wv.setJsFile("_www/static/uni.webview.1.5.5.js") this.wv.appendJsFile("_www/static/post.js") console.log('加載完成'); this.getImg() // 加載完成后獲取一次驗證碼圖片,但可能獲取為空 }, false);
4.setStyle()設(shè)置樣式只能在APP端生效
只有app可以設(shè)置webview的寬高,其他的端是無解的
利用節(jié)點信息減去其他內(nèi)容的高度,得到webview的高度,this.scope.scope.scope.getAppWebview()獲取webview實例(只能app使用),再修改實例setStyle設(shè)置。
5.層級問題(事件不觸發(fā))
在uniapp使用webview時,需要注意樣式層級問題,如下代碼,若在當(dāng)前頁面使用了webview,則點擊時不會觸發(fā)點擊事件,原因就是webview顯示層級高于當(dāng)前頁面
解決:添加樣式層級:z-index: 999;
<view class="privacy"> <view @click="toPrivacy('user')"><u--text text="機電用戶協(xié)議" size="12"></u--text></view>、 <view @click="toPrivacy('privacy')"><u--text text="隱私協(xié)議" size="12"></u--text></view> </view>
附:uniapp使用webview不占全屏
在uniapp中使用webview時,如果不希望webview占據(jù)全屏,可以通過以下方式進行設(shè)置。
在uniapp的頁面中,可以使用flex布局來控制webview所占的比例。設(shè)置一個容器div,并給其設(shè)置寬度、高度及display屬性為flex。然后將webview放置在這個容器中,可以通過設(shè)置容器的flex屬性來控制webview的占比。
另一種方式是使用css樣式來控制webview的寬高以及位置。在uniapp頁面的style標(biāo)簽中,可以給webview設(shè)置具體的寬度、高度以及margin、padding屬性來調(diào)整其位置和大小。
通過以上兩種方式,可以調(diào)整webview的尺寸,使其不占滿整個屏幕??梢愿鶕?jù)實際需要,靈活運用這些方法,來適配不同的頁面布局需求。
需要注意的是,uniapp中的webview組件在不同平臺上的表現(xiàn)可能會有所不同,因此還需要根據(jù)目標(biāo)平臺進行適當(dāng)?shù)恼{(diào)整。
總結(jié)
到此這篇關(guān)于uniapp使用webView的文章就介紹到這了,更多相關(guān)uniapp使用webView內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue中的el-date-picker時間選擇器的使用實例詳解
el-date-picker是Element UI框架中提供的日期選擇器組件,它支持單個日期、日期范圍、時間、日期時間等多種選擇方式,本文給大家介紹Vue中的el-date-picker時間選擇器的使用,感興趣的朋友一起看看吧2023-10-10Vue結(jié)合后臺導(dǎo)入導(dǎo)出Excel問題詳解
這篇文章主要介紹了Vue結(jié)合后臺導(dǎo)入導(dǎo)出Excel問題詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-02-02Vue3的setup在el-tab中動態(tài)加載組件的方法
公司某項目需求在頁面顯示的組件是根據(jù)角色變化而變化的,怎么實現(xiàn)這個效果呢,下面小編給大家介紹下Vue3的setup在el-tab中動態(tài)加載組件的方法,需要的朋友可以參考下2022-11-11vue 解決addRoutes多次添加路由重復(fù)的操作
這篇文章主要介紹了vue 解決addRoutes多次添加路由重復(fù)的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08