webview JS与nvue通讯传值

前言

wrs-webview是webview的组件,支持本地、网络url、h5源码富文本,加载进度、加载结果回调,H5 js、nvue通讯传值、文件选择、相机拍照、相机录像、录音、alert、confirm、prompt

功能

  • 支持本地、网络url、h5源码富文本, 加载进度、加载结果回调
  • 支持H5 js、nvue通讯互调传值
  • 支持文件选择、相机拍照、相机录屏
  • 支持alert、confirm、prompt

原生插件通用使用流程

HBuildX集成原生插件请参考:https://www.jianshu.com/p/1418c9e73eb3 或官网https://nativesupport.dcloud.net.cn/NativePlugin/use/use

wrs-webview组件

温馨提示:本文档在插件市场显示有些属性、事件、代码实例等显示有兼容性问题,完成文档请查看下面的组件文档链接

<wrs-webview 
:config="config" 
ref='webview' 
:url="url"
:style="'width:'+width+'px;height:'+height+'px;'" 
@onLoadStart="onLoadStart" 
@onLoadFinish="onLoadFinish" 
@onLoadError="onLoadError" 
@onProgress="onProgress" 
@onJSData="onJSData">
</wrs-webview>

属性

  • url webview加载地址,可以是本地H5文件地址或远程网络地址
  • config 配置
    progressColor 进度条颜色
    scrollIndicator 是否显示滚动条
  • onLoadStart 开始加载
  • onLoadFinish 加载完成
  • onLoadError 加载出错
  • onProgress 加载进度
  • onJSData 接收到H5 js发送的数据

方法

  • this.$refs.webview.sendDataToJS() 调用H5 JS的函数,并获取函数返回值
    如:调用login函数,函数参数是‘123456’字符串
    var params = {};
    params.js = "login('123456')";
    this.$refs.webview.sendDataToJS(params);
function login(account) {
    alert('登录,账号:' + account);
}

如果函数参数是个Object对象,则

                var params = {};
                params.account = '123456';
                var options = {};
                options.js = "register("+JSON.stringify(params)+")";
                this.$refs.webview.sendDataToJS(options);
function register(params) {
    alert('注册,账号:' + params.account);
}

如果js函数有返回值,则

				var params = {};
				params.a = 1;
				params.b = 2;
				var options = {};
				options.js = "add("+JSON.stringify(params)+")";
				this.$refs.webview.sendDataToJS(options, (resp) => {
					console.log("a + b = " + resp.result);
				});
function add(params) {
	return {
		result: params.a + params.b
	};
}

  • webview的H5 JS发送数据给nvue,会回调 @onJSData事件
    var params = {};
    params.msg = "你好,我是JS";
    if(IOS) {
        window.webkit.messageHandlers.bridge.postMessage(params);
      } else if (ANDROID) {
          var jsonStr = JSON.stringify(params);
          window.messageHandlers.bridge(jsonStr);
     }

如果参数为空时,iOS需要传个空对象,防止出错,如:

    if(IOS) {
        window.webkit.messageHandlers.bridge.postMessage({});
      } else if (ANDROID) {
          window.messageHandlers.bridge();
     }
  • this.$refs.webview.goBack() 返回上一个历史
  • this.$refs.webview.goForward() 前往下一个历史
  • this.$refs.webview.reload() 重新加载刷新
  • this.$refs.webview.stopLoading() 停止加载刷新
  • this.$refs.webview.backForwardList(callback) 获取当前历史
				this.$refs.webview.backForwardList((resp) => {
					if(isString(resp)) {
						console.log("listory is String");
					} else {
						 console.log("listory is not String" );
						resp = JSON.stringify(resp);
					}
					 console.log("listory:" + resp );
				});

完整demo

index.nvue

<template>
    <div>
        <text>WebView</text>
        <text class="log">{{msg}}</text>
        <wrs-webview :config="config" ref='webview' :url="url"
            :style="'width:'+width+'px;height:'+height+'px;'" @onLoadStart="onLoadStart" @onLoadFinish="onLoadFinish" @onLoadError="onLoadError" @onProgress="onProgress" @onJSData="onJSData"></wrs-webview>
        <button @click="changeUrl()">加载其他网址</text></button> 
        <button @click="sendDataToJS()">发送消息数据给JS</button>
    </div>
</template>

<script>
    String.prototype.endWith = function(endStr) {
        var d = this.length - endStr.length;
        return (d >= 0 && this.lastIndexOf(endStr) == d)
    }
    export default {
        data() {
            return {
                url: 'http://www.baidu.com',
                index: 0,
                msg: "",
                config: {
                    progressColor: "#ff00ff",
                    scrollIndicator: false
                }
            }
        },
        onLoad() {
            // 设置播放器宽高,一般宽度铺满全屏,宽高比是16:9
            const {
                windowWidth,
                windowHeight
            } = uni.getSystemInfoSync();
            this.width = windowWidth;
            this.height = this.width / (16.0 / 9.0);
        },
        methods: {
            changeUrl: function(){
                this.index ++;
                if(this.index % 3 == 0) {
                    this.url = "http://www.baidu.com";
                } else if(this.index % 3 == 1){
                    var absPath = plus.io.convertLocalFileSystemURL('_www');
                    // Android获取的absPath以/结尾,iOS获取的absPath不是/结尾
                    if (absPath.endWith('/')) {
                        absPath = absPath.substring(0, absPath.length - 1);
                    }
                    this.url = absPath + "/static/loginSys/index.html"
                } else {
                    this.url = "<body><h1>静态网站</h1></body>";
                }
            },
            onProgress: function(resp){
                this.showMsg("加载进度:" + JSON.stringify(resp.detail))
            },
            onLoadStart: function(resp) {
                this.showMsg("开始加载:" + JSON.stringify(resp.detail))
            },
            onLoadFinish: function(resp) {
                this.showMsg("加载完成:" + JSON.stringify(resp.detail))
            },
            onLoadError: function(resp) {
                this.showMsg("加载出错:" + JSON.stringify(resp.detail))
            },
            onJSData: function(resp){
                this.showMsg("收到JS消息:" + JSON.stringify(resp.detail))
            },
            sendDataToJS: function() {
                // var options = {};
                // options.js = "login('123456')";
                // this.$refs.webview.sendDataToJS(options);
                
                var params = {};
                params.account = '123456';
                var options = {};
                options.js = "register("+JSON.stringify(params)+")";
                this.$refs.webview.sendDataToJS(options);
            },
            showMsg: function(msg) {
                this.msg = msg;
            }
        }
    }
</script>

<style>
    .btn {
        margin-top: 25rpt;
    }
</style>

index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="./css/index.css">
<script type="text/javascript" src="./js/index.js"></script>

</head>
<body>
<h1>静态网站</h1>
<p class="title">标题</p>
<img src="./images/logo.png" alt="Big Boat">
<h1 onclick="clickAlert()">Alert</h1>
<h1 onclick="clickConfirm()">Confirm</h1>
<h1 onclick="clickPrompt()">Prompt</h1>
<h1 onclick="clickNative()">JS发送数据给原生</h1>
<br />
<h1 >请选择文件:</h1>
<input type="file" name="lname" />
<br />
<h1 >照相机拍照:</h1>
 <input type="file" accept="image/*" id="capture" capture="camera"> 
<br />
<h1 >录音(只支持iOS):</h1>
    <input type="file" accept="audio/*" id="capture" capture="camera"> 
    <input type="file" accept="audio/*" capture="microphone">
<br />
<h1 >摄像机录像:</h1>
  <input type="file" accept="video/*" id="capture" capture="camcorder">     
<br />
</body>
</html>

index.js

 var browser={
          versions:function(){
              var u = navigator.userAgent;
              var app = navigator.appVersion;
              return {
                  trident: u.indexOf('Trident') > -1, //IE内核
                  presto: u.indexOf('Presto') > -1, //opera内核
                  webKit: u.indexOf('AppleWebKit') > -1, //苹果、谷歌内核
                  gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1,//火狐内核
                  mobile: !!u.match(/AppleWebKit.*Mobile.*/), //是否为移动终端
                  ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端
                      android: u.indexOf('Android') > -1 || u.indexOf('Adr') > -1, //android终端
                      iPhone: u.indexOf('iPhone') > -1 , //是否为iPhone或者QQHD浏览器
                      iPad: u.indexOf('iPad') > -1, //是否iPad
                      webApp: u.indexOf('Safari') == -1, //是否web应该程序,没有头部与底部
                      weixin: u.indexOf('MicroMessenger') > -1, //是否微信 (2015-01-22新增)
                      qq: u.match(/\sQQ/i) == " qq" //是否QQ
                      };
                      }(),
                  language:(navigator.browserLanguage || navigator.language).toLowerCase()
      }
      var IOS = browser.versions.ios;
      var ANDROID = browser.versions.android;
      
function clickTitle() {
    console.log("点击了标题");
    alert("点击了标题");
}

function clickAlert() {
    console.log("点击了标题");
    alert("您好");
}

function clickConfirm() {
    var result = confirm('是否删除!');
    if (result) {
        alert('删除成功!');
    } else {
        alert('不删除!');
    }
}

function clickPrompt() {
    var value = prompt('输入你的名字:', '默认名字');
    if (value == null) {
        alert('你取消了输入!');
    } else if (value == '') {
        alert('姓名输入为空,请重新输入!');

    } else {
        alert('你好,' + value);
    }
}

function login(account) {
    alert('登录,账号:' + account);
}

function register(params) {
    alert('注册,账号:' + params.account);
}

function clickNative() {
    var params = {};
    params.msg = "你好,我是JS";
    if(IOS) {
        window.webkit.messageHandlers.bridge.postMessage(params);
      } else if (ANDROID) {
          var jsonStr = JSON.stringify(params);
          window.messageHandlers.bridge(jsonStr);
     }
}

function alertMsg(msg) {
    alert(msg);
}

支持定制,联系方式 QQ:252797991

如果觉得可以就点个👍吧,欢迎粉丝收藏,土豪打赏,您的关注就是我们创作的动力!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狼人残风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值