uniapp开发h5 监听用户物理返回键 类似拼多多返回后弹窗

news2024/11/24 9:38:11

uniapp有个onBackPress生命周期  但是h5中只能监听到navbarr左边的返回按钮以及uni.navigateBack() 方法

h5既然监听不到物理返回键,那么用户点击了物理返回键自然会路由返回上一页,那么我们监听路由,由于路由是uni自己封装的,我测试的项目是hash路由,所以我监听了onhashchange事件 ,然后由于

首页===》详情页

遇到的问题

在详情页的onload里面监听hashchange事件,会发现监听到了物理返回,但是会先执行当前vue页面的destroyed函数,再执行物理返回中的操作函数。这样就会导致页面已经跳回上一个页面后才出现提示框。

于是我的做法是:在当前vue页面(A页面)加载时往浏览器历史里备份一份当前的url地址(B页面),此时用户点击返回,就会从B页面跳到A页面,由于这两个页面地址一致,就会产生点击回退却没有效果的错觉。接着回到A页面后,触发监听事件,处理具体的业务流程……

下面是代码:

首页:  /pages/test/test

<template>
	<!-- 首页 -->
	<div>
		<div @click="$jumpTo(`/pages/detail/detail`)" style="height: 40px;background-color: aquamarine;" class="flex justify-center align-center">去详情</div>
	</div>
</template>

<script>
	import { mapState } from 'vuex';
	export default {
		data() {
			return {

			}
		},
		components: {},
		computed: {
			
		},
		onLoad() {

		},
		onShow() {

		},
		methods: {

		}
	}
</script>

<style lang="scss" scoped>
</style>

详情页:/pages/detail/detail

<template>
	<div>

	</div>
</template>

<script>
	
	export default {
		data() {
			return {

			}
		},
		components: {},
		computed: {
		
		},
		onLoad() {
			window.history.pushState(null, null, document.URL + '#1') //往浏览器历史中添加一次记录
			window.onhashchange = (e) => {
				console.log(e);
				uni.showModal({
					title: '提示',
					content: '返回后此页面的操作将不作保留!',
					cancelText: '确定返回',
					confirmText: '留在此页',
					success: (res) => {
						if (res.confirm) {
							window.history.pushState(null, null, document.URL + '#1')
						} else if (res.cancel) {
							window.history.back();
							window.onhashchange = null //这里不取消监听那么上面的history.back()也会触发一次uni.showModal,就会有两个弹窗
						}
					}
				});
			}

		},
		onUnload() {
			window.removeEventListener("popstate", this.browserBack);
		},
		onShow() {

		},
		methods: {
			browserBack() {
				console.log(1);
				// 在这里写弹框
				uni.showModal({
					title: '提示',
					content: '返回后此页面的操作将不作保留!',
					cancelText: '确定返回',
					confirmText: '留在此页',
					success: (res) => {
						if (res.confirm) {
							// 用户选择留在此页,不进行任何操作
						} else if (res.cancel) {
							window.history.back(); // 使用window.history.back()返回上一页
						}
					}
				});
				window.history.replaceState(null, null, document.URL); // 保留此行代码
			},
		}
	}
</script>

<style lang="scss" scoped>
</style>

 如果是history路由的话,那么就监听popstate事件,和上面一个逻辑,可以参考这个老哥文章

无用的小技巧:

如果想禁用一个页面的返回操作,只需要在这个页面的历史记录中写入大量的历史。比如:

for(var i = 0 ; i < 20 ; i++){history.pushState(null,null)
}

相对的,取消禁用就需要以下代码 + 一个手动回退

history.go(-20)
location.reload()

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

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

相关文章

3D模型格式转换工具HOOPS Exchange:支持国际标准STEP格式!

HOOPS Exchange SDK是一组C软件库&#xff0c;使开发团队能够快速将可靠的2D和3D CAD导入和导出添加到其应用程序中&#xff0c;访问广泛的数据&#xff0c;包括边界表示 (B-REP)、产品制造信息 (PMI)、模型树、视图、持久 ID、样式、构造几何、可视化等&#xff0c;无需依赖任…

易点易动:引入二维码和移动技术,助力企业高效进行固定资产盘点

固定资产是企业重要的财务资源&#xff0c;而高效准确地进行海量固定资产盘点一直是企业管理的挑战。为了解决这一问题&#xff0c;易点易动固定资产管理系统引入了先进的二维码和移动技术。本文将详细介绍易点易动固定资产管理系统的二维码和移动技术&#xff0c;展示如何借助…

深度学习入门:一篇概述深度学习的文章

文章目录 &#x1f31f; 特征工程&#xff1a;推荐系统有哪些可供利用的特征&#xff1f;&#x1f34a; 1. 用户特征&#x1f34a; 2. 商品特征&#x1f34a; 3. 上下文特征&#x1f34a; 4. 社交特征&#x1f34a; 5. 行为特征 &#x1f31f; 特征处理&#xff1a;如何利用Spa…

【C++】list的介绍及使用 | 模拟实现list(万字详解)

目录 一、list的介绍及使用 什么是list&#xff1f; list的基本操作 增删查改 获取list元素 不常见操作的使用说明 ​编辑 接合splice ​编辑 移除remove 去重unique 二、模拟实现list 大框架 构造函数 尾插push_back 迭代器__list_iterator list的迭代器要如何…

Java八股文 ---Java并发篇

线程安全 线程安全就是多个线程去执行某类&#xff0c;这个类始终能表现出正确的行为&#xff0c;那么这个类就是线程安全的 我们判断是否要处理线程安全问题&#xff0c;就看有没有多个线程同时访问一个共享变量 能不能保证操作的原子性&#xff0c;考虑atomic包下的类够不够我…

DASCTF X CBCTF 2023

一、justpaint 1.先是压缩包密码爆破&#xff0c;密码为11452&#xff0c;然后开始代码审计&#xff0c;发现是一个线性的神经网络。 源代码如下&#xff1a; import torch import torch.nn as nn import numpy as np import matplotlib.pyplot as plt from PIL import Ima…

JVM重点

文章目录 0. 运行流程1. 内存区域划分1.1 堆1.2 Java 虚拟机栈1.3 程序计数器1.4 方法区 2. 类加载机制类加载过程2.1 加载2.2 验证2.3 准备2.4 解析2.5 初始化双亲委派模型 3. 垃圾回收机制3.1 垃圾判断算法3.1.1 引用计数算法3.1.2 可达性分析算法 3.2 垃圾回收算法3.2.1 标记…

01 # 手写 new 的原理

new 做了什么? 在构造器内部创建一个新的对象这个对象内部的隐式原型指向该构造函数的显式原型让构造器中的 this 指向这个对象执行构造器中的代码如果构造器中没有返回对象&#xff0c;则返回上面的创建出来的对象 手写 new 的过程 new 是一个运算符&#xff0c;只能通过函…

Redis Cluster高可用集群原理

目录 一、Redis Cluster和哨兵对比二、槽位定位算法三、集群节点间的通信机制四、集群选举原理五、网络抖动六、Redis集群为什么至少需要三个master节点&#xff0c;并且推荐节点数为奇数&#xff1f;七、集群没有过半机制会出现脑裂数据丢失问题八、跳转重定位九、集群对批量操…

封神工具:腾讯云服务器价格计算器,精准报价一键计算!

腾讯云服务器价格计算器可以一键计算出云服务器的精准报价&#xff0c;包括CVM实例规格价格、CPU内存费用、公网带宽收费、存储系统盘和数据盘详细费用&#xff0c;腾讯云百科txybk.com分享腾讯云价格计算器链接入口、使用方法说明&#xff1a; 腾讯云服务器价格计算器 打开腾…

行业追踪,2023-10-25

自动复盘 2023-10-25 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

[奇奇怪怪符号]输入法手动输入希腊字母

日常写材料总要输入一些奇奇怪怪符号&#xff0c;虽然知道有一张表&#xff0c;可以在上面选&#xff0c;但是在文本编辑器上找到并打开也不是一件容易的事情&#xff0c;&#xff08;功能多的编辑器就很臃肿&#xff0c;令人眼花缭乱的标签&#xff09; 很想要简洁的编辑器&a…

文件加密软件(2023十大文件加密软件排行榜)

文件加密软件已成为企业和个人保护文件安全的重要工具。本文将介绍2023年十大文件加密软件的排行榜&#xff0c;以帮助大家了解和选择适合自己的文件加密软件。 本文是根据软件的功能性、安全性、易用性和创新性等多方面指标进行评选&#xff0c;以体现各大文件加密软件的实力和…

C++多态的认识与理解

多态的概念 通俗来说&#xff0c;多态就是多种形态。具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生出不同的状态。 比方说买高铁票时&#xff0c;如果你是学生的话&#xff0c;买票就有优惠。如果你是军人的话&#xff0c;就可以优先买票。普通人的话&…

聚观早报 |2024年春节连休8天;RTE2023开幕

【聚观365】10月26日消息 2024年春节连休8天 RTE2023开幕 一加12首发“东方屏” 微软公布2024财年第一财季财报 Alphabet Q3业绩好于预期 2024年春节连休8天 国务院办公厅发布关于2024年部分节假日安排的通知。2024年春节&#xff0c;2月10日至17日放假调休&#xff0c;共…

Linux ———— 用户-组

Linux是一个多用户多任务的操作系统。 用户&#xff08;user&#xff09;&#xff1a; 在Linux系统中&#xff0c;用户是一个拥有独立空间、权限和身份的实体。每个用户都有一个唯一的用户名和用户ID。用户可以登录到系统、读取、写入、执行文件&#xff0c;并按照预设的权限进…

Pytorch使用torch.utils.data.random_split拆分数据集,拆分后的数据集状况

对于这个API,我最开始的预想是从 猫1猫2猫3猫4狗1狗2狗3狗4 中分割出 猫1猫2狗4狗1 和 猫4猫3狗2狗3 ,但是打印结果和我预想的不一样 数据集文件的存放路径如下图 测试代码如下 import torch import torchvisiontransform torchvision.transforms.Compose([torchvision.tran…

算法通关村-黄金挑战K个一组反转

大家好我是苏麟 , 今天带来K个一组反转 , K个一组反转 可以说是链表中最难的一个问题了&#xff0c;每k 个节点一组进行翻转&#xff0c;请你返回翻转后的链表。k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后…

索引模型的常见数据结构

索引的出现是为了提高查询效率,三种常见、也比较简单的数据结构 哈希表有序数组搜索树 哈希表 哈希表是一种以键 - 值&#xff08;key-value&#xff09;存储数据的结构&#xff0c;我们只要输入待查找的键即 key&#xff0c;就可以找到其对应的值即 Value。哈希的思路很简单…

Python实验项目4 :面对对象程序设计

1&#xff1a;运行下面的程序&#xff0c;回答问题。 &#xff08;1&#xff09;说明程序的执行过程&#xff1b; &#xff08;2&#xff09;程序运行结果是什么&#xff1f; # &#xff08;1&#xff09;说明程序的执行过程&#xff1b; # &#xff08;2&#xff09;程序运行…