uniapp-webview获取h5页面加载错误信息及自定义错误页面(捕获uniapp中webview加载error)

news/2024/11/16 21:33:20/文章来源:https://www.cnblogs.com/sugartang/p/18199717

问题描述

  • uniapp中需要加载H5页面,使用了webview,但是在某些情况下,页面加载出现错误,但是官方文档里给出的捕获错误信息的回调函数,只适用部分平台,某些平台无法获取@error异常信息,这种情况如何处理呢?
  • 解决uniapp web-view组件的@load @error事件无效,事件不触发的问题

原因分析

原因:运行平台问题

除去代码语法问题,查看官方文档平台说明,如果运行在非小程序的情况下,就会导致事件无效

获取h5页面加载错误:HTML5+引擎plus.webview

  • uni-app应用程序内置HTML5+引擎,允许js直接调用丰富的原生功能。因此我们可以使用js创建webview来加载h5的html,通过plus.webview可获取应用界面管理对象,获取页面异常详情并添加处理逻辑。
  • 参考文档:HTML5+引擎 Webview模块
  • 参考文档:uni-app使用plus注意事项
<template><div></div>
</template>
<script setup>import { ref } from "vue";import { onLoad, onBackPress } from "@dcloudio/uni-app";const vw = ref("webview");const pages = getCurrentPages();onLoad((options) => {// #ifdef APP-PLUSvar wv = plus.webview.create("", 'custom-webview', {plusrequire: 'none', //禁止远程网页使用plus的API'uni-app': 'none', //不加载uni-app渲染层框架,避免样式冲突top: uni.getSystemInfoSync().statusBarHeight + 44 //放置在titleNView下方。});wv.onerror = (e)=>{console.log("拿到错误啦:", e)}wv.loadURL("https://www.baidu.com/");//加载urllet pages = getCurrentPages();//获取当前页面栈的实例let currentPage = pages[pages.length - 1]; // 上一页var currentWebview = currentPage.$getAppWebview();//获取当前页面的webview对象实例currentWebview.append(wv);//Webview窗口中添加子窗口// #endif});</script>

自定义错误页面方案:自定义Webview的404等错误页面,Webview窗口加载页面错误时显示一个默认自定义错误页面

一把报错的时候会有一个默认的错误页,不太好看,我们可以自己写一个好看的提示页,然后放在项目根目录下,然后采用如下配置:

设置应用全局默认错误页面

5+App和wap2app:配置manifest.json

"plus": {  "error": {  "url": "error.html"  },  //...  
},  
//...

uni-app项目:配置manifest.json

"app-plus": {  "error": {  "url": "hybrid/html/error.html"  },  //...  
},  
//...

单独设置某个Webview窗口的错误页面怎么处理呢?

使用HTML5+引擎 Webview API来单独处理这种需求即可~

var styles = {errorPage:"error.html"}; // 设置为“none”则关闭此Webview窗口的跳转到错误页面功能  
var webview = plus.webview.create( "url", "id", styles );     
webview.show();

附赠:HTML5+引擎 Webview API说明

参考文档:HTML5+引擎 Webview模块 uni-app使用plus注意事项

属性:

  • isRecovery: 当前Webview窗口是否由于内核崩溃自动恢复

方法:

  • all: 获取所有Webview窗口
  • close: 关闭Webview窗口
  • create: 创建新的Webview窗口
  • currentWebview: 获取当前窗口的WebviewObject对象
  • getDisplayWebview: 获取屏幕所有可视的Webview窗口
  • getWebviewById: 查找指定标识的WebviewObject窗口
  • getLaunchWebview: 获取应用首页WebviewObject窗口对象
  • getSecondWebview: 获取应用第二个首页WebviewObject窗口对象
  • getTopWebview: 获取应用显示栈顶的WebviewObject窗口对象
  • hide: 隐藏Webview窗口
  • open: 创建并打开Webview窗口
  • prefetchURL: 预载网络页面
  • prefetchURLs: 预载网络页面(多个地址)
  • show: 显示Webview窗口
  • startAnimation: Webview窗口组合动画
  • defaultHardwareAccelerated: 获取Webview默认是否开启硬件加速

对象:

  • AnimationTypeShow: 一组用于定义页面或控件显示动画效果
  • AnimationTypeClose: 一组用于定义页面或控件关闭的动画效果
  • WebviewObject: Webview窗口对象,用于操作加载HTML页面的窗口
  • WebviewAnimationOptions: Webview窗口动画参数
  • WebviewAnimationStyles: Webview窗口动画样式
  • WebviewBounceStyle: Webview窗口回弹样式
  • WebviewContentAnimationOptions: Webview窗口内容动画参数
  • WebviewDock: 原生控件在窗口中停靠的方式
  • WebviewDragEvent: Webview窗口滑动事件数据
  • WebviewDragOptions: 窗口手势操作参数
  • WebviewDragOtherViewOptions: 手势操作关联对象参数
  • WebviewDrawOptions: 截屏绘制操作参数
  • WebviewFavoriteOptions: 窗口收藏参数
  • WebviewLoadDataOptions: 创建加载HTML数据参数
  • WebviewShareOptions: 窗口的分享参数
  • WebviewSubNViewStyles: 窗口原生子View控件样式
  • WebviewTitleNViewStyles: 窗口标题栏控件样式
  • WebviewTitleNViewBackButtonStyles: 窗口标题栏自定义返回按钮样式
  • WebviewTitleNViewButtonStyles: 窗口标题栏自定义按钮样式
  • WebviewTitleNViewSearchInputStyles: 窗口标题栏搜索框样式
  • WebviewProgressStyles: 标题栏控件的进度条样式
  • WebviewSplitLineStyles: 窗口标题栏控件的分割线样式
  • WebviewEvent: Webview窗口事件
  • WebviewExtraOptions: JSON对象,原生窗口扩展参数
  • WebviewPosition: 原生控件在窗口中显示的位置
  • WebviewPullToRefreshStyles: Webview窗口下拉刷新样式
  • WebviewRenderedEventOptions: Webview窗口rendered事件参数
  • WebviewReplaceWebApiOptions: 替换H5标准API配置信息
  • WebviewStatusbarStyles: JSON对象,Webview窗口的系统状态栏区域样式
  • WebviewStyles: JSON对象,Webview窗口对象的样式
  • WebviewTransform: 一组用于定义页面或控件变形的属性
  • WebviewTransition: 一组用于定义页面或控件转换效果的属性
  • WebviewOverrideResourceOptions: 拦截Webview窗口资源请求的参数
  • WebviewOverrideUrlOptions: 拦截Webview窗口URL请求的属性
  • WebviewListenResourceOptions: 监听Webview窗口资源加载的属性

回调方法:

  • BounceEventCallback: Webview窗口回弹事件的回调函数
  • EventCallback: Webview窗口事件的回调函数
  • PopGestureCallback: Webview窗口侧滑事件的回调函数
  • HistoryQueryCallback: 历史记录查询的回调函数
  • ListenResourceLoadingCallback: Webview窗口加载资源事件的回调函数
  • OverrideUrlLoadingCallback: Webview窗口拦截URL链接跳转的回调函数
  • TitleUpdateCallback: Webview窗口加载页面标题更新的回调函数
  • WebviewAnimationCallback: Webview窗口组合动画回调函数
  • WebviewDragCallback: Webview窗口滑屏操作事件回调函数
  • WebviewCustomButtonCallback: Webview窗口标题栏上自定义按钮点击事件回调函数
  • SuccessCallback: Webview窗口操作成功回调函数
  • ErrorCallback: Webview窗口操作失败回调函数

权限:

{
// ...
"permissions":{// ..."Webview": {"description": "窗口管理"}
}
}

注意事项

1.uniapp调用HTML5+的扩展规范时,必须使用条件编译。否则,运行到h5、applet等平台时,会出现plus is not defined错误。

// #ifdef APP-PLUS
var appid = plus.runtime.appid;
console.log('应用的 appid 为:' + appid);
// #endif

2.uni应用程序中的事件侦听器Event listeners

在普通的H5+项目中,使用document.addEventListener,在uni应用程序中,没有document,我们可以使用plus.globalEvent.addEventListener

// #ifdef APP-PLUS
// Listen for new intent events
plus.globalEvent.addEventListener('newintent', function(){});
// #endif

结语

  • 今天就写到这里啦~
  • 小伙伴们,( ̄ω ̄( ̄ω ̄〃 ( ̄ω ̄〃)ゝ我们明天再见啦~~
  • 大家要天天开心哦

欢迎大家指出文章需要改正之处~
学无止境,合作共赢

在这里插入图片描述

欢迎路过的小哥哥小姐姐们提出更好的意见哇~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/709007.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

物联网在智慧园区的八大应用

物联网在智慧园区领域有许多应用。以下是一些常见的应用场景: 智能安防系统: 通过物联网技术,可以实现智能监控、入侵检测、视频监控、智能门禁等安防功能,提高园区的安全性和管理效率。 能源管理: 物联网可以用于实时监测和控制园区内的能源消耗,包括电力、水、气等,通…

tensorflow与python版本对应关系

下完之后才发现tensorflow1.12.0需要3.6的版本……

听说你是高手?说说你的 JVM调优方法论 吧?(美团面试,问的贼细)

文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备 免费赠送 :《尼恩技术圣经+高并发系列PDF》 ,帮你 实现技术自由,…

一个页面从输入URL到加载显示完成,这个过程发生了什么?

目录一、解析URL1、流程2、URL格式:3、示例二、浏览器封装HTTP请求报文1、流程2、HTTP请求报文例子3、封装三、DNS解析1、缓存判断1.1、浏览器缓存1.2、操作系统缓存1.3、路由器缓存2、递归查询至ISP DNS服务器3、迭代查询过程4、保存结果至各级缓存四、建立TCP连接(三次握手…

vscode 无法调试 golang testify suite 中的单个 test 的解决办法

目录问题描述网上的讨论最终的解决办法 问题描述 对于如下这样简单的测试文件: package main// Basic imports import ("testing""github.com/stretchr/testify/assert""github.com/stretchr/testify/suite" )var assertObj *assert.Assertions/…

【Linux】Deepin安装Anaconda后手动配置环境变量

配置环境变量 如果安装完毕后,重新打开终端,输入conda表示没找到这个命令 说明没有配置环境变量 那么我们首先第一件事,就是找到我们的conda安装到哪里了例如我的是安装到主目录的(默认在这的,安装的时候我没有修改安装路径) 然后进入这个文件夹,进入bin,在bin下运行终端…

Redis 缓存常见问题处理

缓存穿透 缓存穿透是指客户端的请求数据在缓存和数据库中都不存在,这样缓存永远不会生效,这些请求都会到达数据库,从而导致数据库负载过高。 常见解决方案有两种:缓存空对象:实现简单、方便维护,是解决缓存穿透的首选方法,但会造成额外内存消耗,或短期的数据不一致 布隆…

[原]代码管理工具WeCode及其数据导出

1.WeCode简介SVN、Git等工具适合多人协作时代码管理。类似在线的Gist(http://gist.github.com),WeCode是适合个人离线代码片段管理。wecode是CodeHelp的升级版本,是专门为我们程序员设计的一款源代码管理软件。 它能方便的管理您在编程和学习中有用的源代码,减少经常到处查找…

go高并发之路——go语言如何解决并发问题

一、选择GO的原因 作为一个后端开发,日常工作中接触最多的两门语言就是PHP和GO了。无可否认,PHP确实是最好的语言(手动狗头哈哈),写起来真的很舒爽,没有任何心智负担,字符串和整型压根就不用区分,开发速度真的是比GO快很多。现在工作中也还是有一些老项目在使用PHP,但…

线程安全使用 HashMap 的四种技巧

这篇文章,我们聊聊线程安全使用 HashMap 的四种技巧。1方法内部:每个线程使用单独的 HashMap 如下图,tomcat 接收到到请求后,依次调用控制器 Controller、服务层 Service 、数据库访问层的相关方法。 每次访问服务层方法 serviceMethod 时,都会在方法体内部创建一个单独的…

C - AtCoder Magics

C - AtCoder Magics https://atcoder.jp/contests/abc354/tasks/abc354_c思路 首先按照a属性对数列进行排序,大的在前,小的在后, 完成后, 则数列在a参数上是非递增的。 如下图中x轴对应 a 参数, y轴对应c参数, discard条件,实际上是找出 数列 对于c参数 沿着 a 参数非递…