uniapp web-view組件雙向通信的問(wèn)題記錄
前言
本文主要介紹在uniapp中頁(yè)面與webview組件內(nèi)頁(yè)面的雙向通信問(wèn)題。
準(zhǔn)備
uniapp項(xiàng)目
調(diào)用webview組件
<web-view src="/hybrid/html/index.html"></web-view>
Web項(xiàng)目
項(xiàng)目目錄
在uniapp項(xiàng)目根目錄下新建hybrid/html目錄,web項(xiàng)目文件放在hybrid/html目錄下,否則web-view無(wú)法調(diào)用項(xiàng)目文件。
引入官方庫(kù)
在web項(xiàng)目中引入官方庫(kù)uni.webview.js,可以從uniapp官方示例庫(kù)中下載,下載后放入web項(xiàng)目目錄下即可,本文放在js文件夾中,然后在web項(xiàng)目頁(yè)面中引入。
<script type="text/javascript" src="js/uni.webview.1.5.2.js"></script>
通信
uniapp傳webview
接收消息(webview)
uniapp發(fā)送消息實(shí)際上就是調(diào)用webview組件內(nèi)頁(yè)面方法實(shí)現(xiàn)通信,所以我們需要現(xiàn)在webview組件內(nèi)頁(yè)面index.html中定義一個(gè)接收消息的方法:
function webReceiveData (data) { var parseData = JSON.parse(data) document.getElementById('msg').innerText = `接收到的消息:${parseData.msg}` }
發(fā)送消息(uniapp)
要向webview中傳遞消息,首先需要獲取到當(dāng)前頁(yè)面中的webview組件,然后調(diào)用webview頁(yè)面中定義的接收方法就好;如下代碼,獲取到當(dāng)前頁(yè)面中的webview保存在wv中,并在獲取成功后調(diào)用sendData方法向webview發(fā)送消息,在sendData方法中實(shí)現(xiàn)了webview組件內(nèi)方法的調(diào)用。
onLoad() { let that = this; // #ifdef APP-PLUS var currentWebview = that.$scope.$getAppWebview(); let num = 0; let wv_time = setInterval(function() { num++; that.wv = currentWebview.children()[0]; if (that.wv) { // 獲取到當(dāng)前頁(yè)面的webview子頁(yè)面然后下發(fā)消息 that.sendData({ type: 'init', msg: 'addd' }) clearInterval(wv_time) } }, 100); // #endif }, methods: { sendData (data) { let that = this that.wv.evalJS("webReceiveData('" + JSON.stringify(data) + "')"); }, }
webview傳uniapp
接收消息(uniapp)
在uniapp中為web-view組件添加上@message事件
<web-view src="/hybrid/html/index.html" @message="receiveData"></web-view>
處理@message事件的方法receiveData方法
receiveData (data) { console.log("收到來(lái)自webview的消息:", data.detail) }
發(fā)送消息(webview)
在webview頁(yè)面中調(diào)用uni.postMessage 方法實(shí)現(xiàn)消息發(fā)送。
function webSendData () { document.getElementById('send').innerText = `已發(fā)送的消息:啊對(duì)對(duì)對(duì)` uni.postMessage({ data: { msg: '啊對(duì)對(duì)對(duì)' } }); }
完整代碼
uniapp端
<template> <view class="content"> <web-view src="/hybrid/html/index.html" @message="receiveData"></web-view> </view> </template> <script> export default { data() { return { wv: null, } }, onLoad() { let that = this; // #ifdef APP-PLUS var currentWebview = that.$scope.$getAppWebview(); let num = 0; let wv_time = setInterval(function() { num++; that.wv = currentWebview.children()[0]; if (that.wv) { // 獲取到當(dāng)前頁(yè)面的webview子頁(yè)面然后下發(fā)消息 that.sendData({ type: 'init', msg: 'addd' }) clearInterval(wv_time) } }, 100); // #endif }, methods: { sendData (data) { let that = this that.wv.evalJS("webReceiveData('" + JSON.stringify(data) + "')"); }, receiveData (data) { console.log("收到來(lái)自webview的消息:", data) }, } } </script> <style> </style>
Web端
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>通信實(shí)例</title> <style type="text/css"> .container { display: flex; flex-direction: column; } .content { text-align: center; margin: 15px 0; } #msg { font-size: 1.2rem; font-weight: bold; color: #ff7d00; } .text { text-align: center; color: #c5c8ce; } .btn-box { text-align: center; margin: 15px 0; } .btn-box button { width: 125px; height: 45px; font-size: 18px; color: white; background-color: #1989fa; border-color: #2b85e4; border-radius: 5px; } .btn-box button:active { background-color: #88c1fa; border-color: #5cadff; } </style> </head> <body> <div class="container" id="lauwen"> <div class="content" id="msg"></div> <div class="content" id="send"></div> <div class="text">?https://blog.csdn.net/Douz_lungfish</div> <div class="btn-box"> <button type="button" onclick="webSendData()">發(fā)送消息</button> </div> </div> <script type="text/javascript" src="js/uni.webview.1.5.2.js"></script> <script type="text/javascript"> function webReceiveData (data) { var parseData = JSON.parse(data) document.getElementById('msg').innerText = `接收到的消息:${parseData.msg}` } function webSendData () { document.getElementById('send').innerText = `已發(fā)送的消息:啊對(duì)對(duì)對(duì)` uni.postMessage({ data: { msg: '啊對(duì)對(duì)對(duì)' } }); } </script> </body> </html>
到此這篇關(guān)于uniapp web-view組件雙向通信的文章就介紹到這了,更多相關(guān)uniapp web-view組件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
KnockoutJS 3.X API 第四章之?dāng)?shù)據(jù)控制流component綁定
這篇文章主要介紹了KnockoutJS 3.X API 第四章之?dāng)?shù)據(jù)控制流component綁定的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-10-10JavaScript基于replace+正則實(shí)現(xiàn)ES6的字符串模版功能
這篇文章主要介紹了JavaScript基于replace+正則實(shí)現(xiàn)ES6的字符串模版功能,結(jié)合實(shí)例形式分析了replace結(jié)合正則實(shí)現(xiàn)ES6字符串模板功能的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-04-04HTML元素拖拽功能實(shí)現(xiàn)的完整實(shí)例
這篇文章主要給大家介紹了關(guān)于HTML元素拖拽功能實(shí)現(xiàn)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12當(dāng)某個(gè)文本框成為焦點(diǎn)時(shí)即清除文本框內(nèi)容
這篇文章主要介紹了當(dāng)某個(gè)文本框成為焦點(diǎn)時(shí)如何清除文本框內(nèi)容,需要的朋友可以參考下2014-04-04微信小程序中使用自定義圖標(biāo)(阿里icon)的方法
這篇文章主要介紹了微信小程序中使用自定義圖標(biāo)(阿里icon)的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08js用Date對(duì)象的setDate()函數(shù)對(duì)日期進(jìn)行加減操作
在某個(gè)日期上加減天數(shù)來(lái)說(shuō),其實(shí)只要調(diào)用Date對(duì)象的setDate()函數(shù)就可以了,具體方法如下2014-09-09Javascript取整函數(shù)及向零取整幾種常用的方法
這篇文章主要介紹了Javascript取整函數(shù)及向零取整幾種常用的方法,每種方法都有其特點(diǎn)和適用場(chǎng)景,推薦使用Math.trunc(),因?yàn)樗Z(yǔ)義明確、代碼易讀且性能較好,需要的朋友可以參考下2025-01-01微信小程序?qū)崿F(xiàn)topBar底部選擇欄效果
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)topBar底部選擇欄效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07