一、建立APP頁面和webview的通訊
? ? ? ? 1.引入webview.js
? ? ? ? ? ? ? ? App 端使用 uni.web-view.js 的最低版為?uni.webview.1.5.4.js
? ? ? ? ? ? ? ? APP端可以支持網絡網頁和本地網頁,但如果使用本地網頁和相關資源(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.發送消息
? ? ? ? ? ? ? ? ?首先<web-view>中需要添加message的監聽,當網頁向應用?postMessage
?時,會在特定時機(后退、組件銷毀、分享)觸發并收到消息。
<web-view ref="webview" :src="webViewUrl" @message="onPostMessage"></web-view>
? ? ? ? ? ? ? ? ?其次網頁向應用 postMessage 需要通過 wv.evalJS(``)方法,在此方法中利用uniapp的postMessage()方法向應用發送消息
wv.evalJS(`uni.postMessage({data: {base64: canvas.toDataURL("image/png"),}}); `)
? ? ? ? ? ? ? ? 最后在uniapp通過?onPostMessage 函數中獲取網頁信息
onPostMessage: function (e) {console.log(e.detail.data[0])},
?二、webview初始化遇坑
? ? ? ? ?1.setJsFile() 和 appendJsFile() 方法的區別
????????????????在初始化webview時,需要引入webview.js文件和添加的搭橋 js (post.js)文件?
? ? ? ? ????????此時需注意 setJsFile() 和 appendJsFile() 方法的區別:
????????????????setJsFile:設置新的JS文件后將清空之前設置的值。也就是后臺如果一直?setJsFile,那么只有最后一個js文件生效。
????????????????appendJsFile:添加多個js文件將按照添加的先后順序執行。
? ? ? ? 2. 文件路徑
?????????????????setJsFile() 和 appendJsFile()方法中所寫的文件路徑一定要正確
????????????????如果文件路徑從static目錄開始寫,比如這樣:
wv.setJsFile("static/uni.webview.1.5.5.js")
wv.appendJsFile("static/post.js")
? ? ? ? ? ? ? ? 這樣寫在安卓端沒有問題,運行很順利,但是在?IOS?端就會發現這兩個方法所加文件并未生效,所以文件路徑一定要寫正確,默認帶上'_www',
wv.setJsFile("_www/static/uni.webview.1.5.5.js")
wv.appendJsFile("_www/static/post.js")
? ? ? ? ?3. setJsFile() 和 appendJsFile()方法所寫時機
? ? ? ? ? ? ? ? 在渲染時寫?setJsFile() 和 appendJsFile()方法,在安卓端不會有任何問題,但在IOS端會發現這兩個方法并未生效
? ? ? ? ? ? ? ? 因此建議在 IOS 端??setJsFile() 和?appendJsFile() 操作應放在監聽 loaded 事件之后
var currentWebview = this.$scope.$getAppWebview() //此對象相當于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()設置樣式只能在APP端生效
????????????????只有app可以設置webview的寬高,其他的端是無解的
????????????????利用節點信息減去其他內容的高度,得到webview的高度,this.scope.scope.scope.getAppWebview()獲取webview實例(只能app使用),再修改實例setStyle設置。
? ? ? ? 5.層級問題(事件不觸發)
? ? ? ? ? ? ? ? 在uniapp使用webview時,需要注意樣式層級問題,如下代碼,若在當前頁面使用了webview,則點擊時不會觸發點擊事件,原因就是webview顯示層級高于當前頁面
? ? ? ? ? ? ? ? 解決:添加樣式層級:z-index: 999;
<view class="privacy"><view @click="toPrivacy('user')"><u--text text="機電用戶協議" size="12"></u--text></view>、<view @click="toPrivacy('privacy')"><u--text text="隱私協議" size="12"></u--text></view></view>