JS监听页面回退前进的方案

news2024/11/18 7:42:25

您好,如果喜欢我的文章,可以关注我的公众号「量子前端」,将不定期关注推送前端好文~

前言

在业务中遇到需求,App中的H5页面跳转到其他外链页面,外链页面修改了整个APP中的导航栏样式,回退到当前页面,导航栏受到了影响,造成了用户体验下降的问题,步骤如下:

  1. 位于自身BUC下的H5页:

1.png

  1. 点击查看活动,跳转到外链活动页(由其他BU提供的H5),非可控,APP标题栏被隐藏处理:

2.png

  1. 回退页面,回到自身H5页,问题发生,标题栏由于被上一步隐藏处理了,影响到了本BU项目的视觉:

3.png

问题解决

问题解决的思路无非两种~

  1. 自己做监听,由于APP与浏览器不同,在回退页面不会触发页面的刷新,因此要监听页面的回退做APP标题栏重置操作;
  2. 找提供活动页的研发,在活动页销毁时重置标题栏;

我们选择第一种,因为第二种别人不干。

onpageshow

通过window.onpageshow可以监听到页面展示,我们在当前页做一个监听操作,与window.onload不同之处是,当页面主动刷新渲染后,每次加载页面,都会走到onpageshow的回调,这就很符合页面回退做处理的业务场景。

根据思路写出如下代码:

const ShopChaimDetail = () => {
  // ***

  useEffect(() => {
    window.onpageshow = (event) => {
      console.log('页面加载了');
    };
    return () => {
      window.onpageshow = () => {};
    };
  }, []);
  
  // ***
};

那么如何判断页面此次加载是属于主动刷新,还是history前进回退呢?

performance.navigation.type

performance.navigation.type用于判断网页来源类型,一共有四种类型:

  1. 网页通过点击链接、地址栏输入、表单提交、脚本操作等方式加载,相当于常数performance.navigation.TYPE_NAVIGATE
  2. 网页通过“重新加载”按钮或者location.reload()方法加载,相当于常数performance.navigation.TYPE_RELOAD
  3. 网页通过“前进”或“后退”按钮加载,相当于常数performance.navigation.TYPE_BACK_FORWARD
  4. 任何其他来源的加载,相当于常数performance.navigation.TYPE_RESERVED

我们需要在页面回退时重置APP标题栏的样式,因此判断window.performance.navigation.type === 2即可。

改装一下上面的代码块:

const ShopChaimDetail = () => {
  // ***

  useEffect(() => {
    getApplyDetail(true);
    window.onpageshow = (event) => {
      listenWebViewBack(event);
    };
    return () => {
      window.onpageshow = () => {};
    };
  }, []);

  /**
   * @description: 监听容器中回退页面的方式回到当前页,重置标题栏样式
   * @param {*} event
   * @return {*}
   */
  const listenWebViewBack = (event) => {
    if (
      event.persisted ||
      (window.performance && window.performance.navigation.type == 2)
    ) {
      //页面是从缓存中获取的数据||是通过浏览器后退来到该页面
      showNativeTabbar();
      if (isIos) {
        resetIosTabbar();
      } else {
        resetAndroidTabbar();
      }
    }
  };
  
  // ***
};

这样通过onpageshow监听 + performance.navigation.type判断网页来源就实现了监听回退的方案。

结尾

本文属于博主日常工作开发记录下来的有意思的方案,如果对你有帮助,那真是太好不过了~

如果喜欢我的文章,可以关注我的公众号「量子前端」,将不定期关注推送前端好文~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信开发之自动回复的技术实现

请求URL: http://域名地址/sendText 请求方式: POST 请求头Headers: Content-Type:application/jsonAuthorization:login接口返回 参数: 参数名必选类型说明wId是string登录实例标识wcId是string接收…

人物宣传稿怎么写?写作技巧有哪些?

人物宣传稿是一种介绍个人或组织成员的文案,旨在宣传其成就、特点和影响力。以下是一些人物宣传稿的写作技巧,帮助您撰写出生动、引人入胜的宣传稿。接下来伯乐网络传媒就来给大家讲解一下。 突出核心信息: 在宣传稿的开头,用简洁…

ARTS 挑战打卡的第1天,我学到了这些~

关于 ARTS 的释义 —— 每周完成一个 ARTS: ● Algorithm: 每周至少做一个 LeetCode 的算法题 ●Review: 阅读并点评至少一篇英文技术文章 ● Tips: 学习至少一个技术技巧 ● Share: 分享一篇有观点和思考的技术文章 深度学习 深度学习概念崛起框架 主页传送门&…

在线思维导图怎么绘制?学学这几种绘制方法

在线思维导图怎么绘制?思维导图是一种非常有效的学习和工作工具,可以帮助我们更好地组织和呈现信息,提高学习效率和工作效率。而在线思维导图的出现,更是为我们的绘制带来了极大的便利。现在也有很多绘制思维导图的方法&#xff0…

【RedisInsight】连入Docker容器可视化redis服务

文章目录 下载安装RedisInsight添加数据库添加docker容器内的redis数据库 下载安装RedisInsight 进入redis官网下载:https://redis.com/redis-enterprise/redis-insight/,安装过程一路Next即可。 打开桌面上的快捷方式启动:RedisInsight-v2…

windows创建占用特定端口程序

默认情况下,远程桌面使用的是3389端口。如果您想将远程桌面端口更改为8005,以达到模拟程序占用端口8005的情况,可以执行以下操作: 如执行以下命令,则1,2,3步相同操作可以跳过,直接往…

C++ 好用的日志库--spdlog

背景 spdlog 是一个快速、异步的、header-only 的 C 日志库。它提供了简单易用的 API 并具有高性能和可扩展性。 下载和使用 下载 spdlog 库下载地址:github 链接 hello world 在使用时只需要 include 整个 /include/spdlog 文件夹即可。 #include "spd…

【excel技巧】进阶版:excel文件批量提取文件名

前面给大家分享了简单的excel提取文件名方法,今天继续分享,进阶版excel文件批量提取文件名的方法。 点击excel工具栏中的【数据】功能,点击获取数据 – 来自文件 – 从文件夹 然后找到需要提取文件名的文件夹,点击打开&#xff0…

直线导轨使用中常见的问题有哪些?

直线导轨作为设备的核心部件之一,起着导向和支撑的作用功能。目前,已被广泛应用在各行各业中,大到机械设备,小到抽屉,我们都能看到直线导轨的身影,可以说,直线导轨已经悄无声息的进入到我们的生…

OC与Swift的相互调用

OC调用Swift方法 1、在 Build Settings 搜索 Packaging ,设置 Defines Module 为 YES 2、新建 LottieBridge.swift 文件,自动生成桥 ProductName-Bridging-Header.h 3、在 LottieBridge.swift 中,定义Swift类继承于OC类,声明 obj…

站点可靠性工程 (SRE)

随着世界各地的组织努力开发安全、可靠、可扩展且可持续的 IT 基础架构,对高效基础架构监控和管理的需求日益增长,企业正在用不可扩展的遗留架构换取现代解决方案,在尖端技术的推动下,这些使基础设施管理过程更加顺畅和轻松&#…

Django学习笔记-默认的用户认证系统(auth)

一、Django默认的用户认证系统 Django 自带一个用户验证系统。它负责处理用户账号、组、权限和基于cookie的用户会话。 Django 验证系统处理验证和授权。简单来说,验证检验用户是否是他们的用户,授权决定已验证用户能做什么。这里的术语验证用于指代这…

【云原生】K8S二进制搭建一

目录 一、环境部署1.1操作系统初始化 二、部署etcd集群2.1 准备签发证书环境在 master01 节点上操作在 node01与02 节点上操作 三、部署docker引擎四、部署 Master 组件4.1在 master01 节点上操 五、部署Worker Node组件 一、环境部署 集群IP组件k8s集群master01192.168.243.1…

虹科方案 | 虹科AR助力汽车产业降本增效,实现数字化转型!

虹科AR远程解决方案 将高性能的Vuzix AR眼镜与工业远程软件相结合,一线员工使用AR眼镜呼叫专家,由远程专家进行诊断并给出建议,支持一线员工与远程专家实时语音视频交互、AR标注指引、发送文件图片并进行会议录制,帮助一线员工解…

8.物联网操作系统之事件标志组

。事件标志组定义 FreeRTOS事件标志组介绍 FreeRTOS事件标志组工作原理 一。事件标志组定义 信号量信号量只能实现任务与单个事件或任务间的同步。但是某些任务可能会需要与多个事件或任务进行同步,此时就可以使用事件标志组来解决。事件标志组能够实现某个任务与…

opencv36-形态学操作-膨胀 cv2.dilate()

膨胀操作是形态学中另外一种基本的操作。膨胀操作和腐蚀操作的作用是相反的,膨胀操作能对图像的边界进行扩张。膨胀操作将与当前对象(前景)接触到的背景点合并到当前对象内,从而实现将图像的边界点向外扩张。如果图像内两个对象的…

接口测试原理和基本步骤

目录 1、接口测试原理 2、接口测试的实现 3、接口测试用例 4、接口测试工具 5、HTTP协议 6、JMeter 7、抓包 8、接口测试可以发现什么样的Bug? 1、接口测试原理 接口测试,实际上是针对于接口做测试的。 那么接口是什么? 软件开发&…

人力管理系统servlet+jsp人事考勤员工部门java jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 人力管理系统servletjsp 系统有1权限:管理…

Linux - gcc/g++工具使用

gcc/g是用于编译C/C程序的编译器 1.编译过程 1. 预处理(头文件展开,条件编译,进行宏替换,去注释等) 2. 编译(C语言汇编语言) 3. 汇编(汇编->可重定位目标二进制文件,不可以被执行的&#xff…

图解系列 非对称加密应用场景

非对称加密使用一对密钥,分别是公钥(public key)和私钥(private key)。 使用场景 加密场景 加密场景 公钥加密、私钥解密: 公钥加密:在这种场景下,使用接收方的公钥对数据进行加密…