wrs-webview 插件

前言

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容

  • uni-app是啥,套用官方的话,它是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到...
    Test_A阅读 6,005评论 8 5
  • 前排提示:非推广软文 微信公众号: 因卓诶;此文已同步到因卓诶blog Uniapp这两年是Vue开发者很喜欢的跨...
    因卓诶阅读 2,782评论 1 6
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 120,585评论 2 7
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 5,980评论 0 4