美文网首页
wrs-webview 插件

wrs-webview 插件

作者: 浪人残风 | 来源:发表于2021-07-20 10:42 被阅读0次

前言

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);
}

组件文档:https://www.jianshu.com/p/87606a8eaf2c
支持定制,联系方式 QQ:252797991

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

相关文章

  • wrs-webview 插件

    前言 wrs-webview是webview的组件,支持本地、网络url、h5源码富文本,加载进度、加载结果回调,...

  • React配置过程中用到的插件汇总

    ●react插件●react-dom插件●react-router插件●react-redux插件●babel插件...

  • iOS项目实战02

    修改插件:查找插件 -> 插件路径(不能记) -> Xcode插件开发 -> 查看插件代码 -> 搜索instal...

  • 5.文档 - gitbook - 插件

    参考 官方插件 重点参考 GitBook 插件 常用插件 配置插件 到 官方插件 上找合适的插件 在配置文件中安装...

  • FCPX系列的插件怎么安装导入?Final cut pro x插

    fcpx插件怎么安装? Fcpx插件怎么解压安装?fcpx插件怎么卸载?fcpx插件怎么添加?fcpx lut插件...

  • Cordova 插件更新

    查看项目插件列表 移除插件 添加插件

  • IDEA破解

    配置插件 配置仓库 下载插件 使用插件

  • Cordova 本地插件

    1 安装插件环境 2 创建插件 例子 添加配置 进入插件文件夹下初始化插件 插件使用

  • Webpack入门之plugins篇

    入门篇主要先学学插件的使用,不涉及自定义插件。 首先 插件分为:内置插件和外部插件。 内置插件例如BannerPl...

  • Gradle中插件的使用

    目录 插件的类型 插件的类型分为:1.脚本插件2.二进制插件 插件的使用 1.脚本插件的使用 脚本插件的使用方法如...

网友评论

      本文标题:wrs-webview 插件

      本文链接:https://www.haomeiwen.com/subject/kselmltx.html