• 【工作实践-06】uniapp使用webView


    一、建立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 目录下

    1. document.addEventListener('UniAppJSBridgeReady', function () {
    2. console.log('我建立起了通讯');
    3. uni.postMessage({
    4. data: {
    5. successFlag: true,
    6. }
    7. });
    8. })

            3.发送消息

                     首先中需要添加message的监听,当网页向应用 postMessage 时,会在特定时机(后退、组件销毁、分享)触发并收到消息。

    <web-view ref="webview" :src="webViewUrl" @message="onPostMessage">web-view>

                     其次网页向应用 postMessage 需要通过 wv.evalJS(``)方法,在此方法中利用uniapp的postMessage()方法向应用发送消息

    1. wv.evalJS(`uni.postMessage({
    2. data: {
    3. base64: canvas.toDataURL("image/png"),
    4. }
    5. }); `)

                    最后在uniapp通过 onPostMessage 函数中获取网页信息

    1. onPostMessage: function (e) {
    2. console.log(e.detail.data[0])
    3. },

     二、webview初始化遇坑

             1.setJsFile() 和 appendJsFile() 方法的区别

                    在初始化webview时,需要引入webview.js文件和添加的搭桥 js (post.js)文件 

                    此时需注意 setJsFile() 和 appendJsFile() 方法的区别:

                    setJsFile:设置新的JS文件后将清空之前设置的值。也就是后台如果一直 setJsFile,那么只有最后一个js文件生效

                    appendJsFile:添加多个js文件将按照添加的先后顺序执行。

            2. 文件路径

                     setJsFile() 和 appendJsFile()方法中所写的文件路径一定要正确

                    如果文件路径从static目录开始写,比如这样:

    1. wv.setJsFile("static/uni.webview.1.5.5.js")
    2. wv.appendJsFile("static/post.js")

                    这样写在安卓端没有问题,运行很顺利,但是在 IOS 端就会发现这两个方法所加文件并未生效,所以文件路径一定要写正确,默认带上'_www'

    1. wv.setJsFile("_www/static/uni.webview.1.5.5.js")
    2. wv.appendJsFile("_www/static/post.js")

             3. setJsFile() 和 appendJsFile()方法所写时机

                    在渲染时写 setJsFile() 和 appendJsFile()方法,在安卓端不会有任何问题,但在IOS端会发现这两个方法并未生效

                    因此建议在 IOS 端  setJsFile() 和 appendJsFile() 操作应放在监听 loaded 事件之后

    1. var currentWebview = this.$scope.$getAppWebview() //此对象相当于html5plus里的plus.webview.currentWebview()。在uni-app里vue页面直接使用plus.webview.currentWebview()无效
    2. this.wv = currentWebview.children()[0]
    3. this.wv.addEventListener("loaded", () => {
    4. this.wv.setJsFile("_www/static/uni.webview.1.5.5.js")
    5. this.wv.appendJsFile("_www/static/post.js")
    6. console.log('加载完成');
    7. this.getImg() // 加载完成后获取一次验证码图片,但可能获取为空
    8. }, false);

            4.setStyle()设置样式只能在APP端生效

                    只有app可以设置webview的宽高,其他的端是无解的

                    利用节点信息减去其他内容的高度,得到webview的高度,this.scope.scope.scope.getAppWebview()获取webview实例(只能app使用),再修改实例setStyle设置。

            5.层级问题(事件不触发)

                    在uniapp使用webview时,需要注意样式层级问题,如下代码,若在当前页面使用了webview,则点击时不会触发点击事件,原因就是webview显示层级高于当前页面

                    解决:添加样式层级:z-index: 999;

    1. <view class="privacy">
    2. <view @click="toPrivacy('user')"><u--text text="机电用户协议" size="12">u--text>view>、
    3. <view @click="toPrivacy('privacy')"><u--text text="隐私协议" size="12">u--text>view>
    4. view>
  • 相关阅读:
    java拦截器
    Javascript 中的堆、栈、引用和值指南
    用docker搭建简易ctf题目
    IntelliJ IDEA 修改mapper里的文件(xml文件) target目录对应的文件消失
    短视频社交|电影点播平台Springboot+vue+ElementUI前后端分离
    使用SpringBoot和ZXing实现二维码生成与解析
    Seata:分布式事务
    【C#】标准WebService Soap1.1 兼容 ContentType: application/xml
    Yocto Project 编译imx-第1节(下载和编译)
    LabVIEW样式检查表7
  • 原文地址:https://blog.csdn.net/weixin_49491274/article/details/136376097