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

种地  金牌会员 | 2024-7-27 02:16:28 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 554|帖子 554|积分 1662

一、建立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.发送消息
                 首先<web-view>中必要添加message的监听,当网页向应用 postMessage 时,会在特定时机(后退、组件烧毁、分享)触发并收到消息。
  1. <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);
  9.                        
复制代码
        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>
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

种地

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表