微信H5如何关闭浏览器(如何监听手机的物理返回键)

2023-11-19

一、背景

背景是这样的:该项目进入h5时会通过 location.replace(xxx) 或 location.href = xxx 跳转到某个地址①,该地址会请求获得微信 openId;获取成功后再重定向到h5首页。

那么问题来了,重定向会在微信浏览器留下一条 history 记录,那么我在h5首页按手机的物理返回键,就不会因为已是第一页而退出浏览器,而是跳回地址①,再重定向到首页;按返回键又回到①,又重定向到首页。。。除非手速够快,不然就会形成“死循环”。

那么,怎样能在首页按返回键时,直接关闭微信浏览器呢?

二、解决思路

解决思路很自然:

1、在首页监听手机何时被按下返回键;

2、当发生1中事件时,截停浏览器默认事件(不返回history中的重定向页);

3、然后执行自定义事件(关闭微信浏览器)。

三、解决方法

1、在首页监听手机何时被按下返回键

监听 popstate 事件。其实并没有严格意义上的“按下物理返回键”事件,但手机的物理返回键其实作用就跟浏览器左上角的 “←” 按钮作用相似,都是返回上一个页面(也就是history中的上一条记录)。而浏览器中返回上一条 history 记录时触发了 “popstate” 事件。因此我们可以利用 “popstate” 来模拟 “按下物理返回键” 事件。

代码:

// 本示例使用了 vue3 + typescript。其他框架类似,在组件创建、挂载时加上这个事件监听;

function closeWXWindow() {
  // TODO: 关闭微信浏览器
}

onMounted(() => {
  window.addEventListener('popstate', closeWXWindow);
});

// 记得离开该页面时取消监听,否则在其他页面按返回键也会直接关闭浏览器了~
onUnmounted(() => {
  window.removeEventListener('popstate', closeWXWindow);
});

2、当发生1中事件时,截停浏览器默认事件(不返回history中的重定向页)

这个稍微有点小复杂~

大家乍一看可能脱口而出:“这个我熟!在事件处理函数里加一行 event.preventDefault() 嘛!”

遗憾的是,即使用上这么一行,浏览器还是会回到上一级页面。其实可以这么理解:正是因为返回了上一级页面,所以才会有 "popstate" 事件;而不是有了 “popstate” 事件,然后才去执行返回上一级页面的默认行为。

所以说,按下返回键后,“返回上一级页面” 这个动作,浏览器无论如何都会执行

直接截停是没戏了,但咱们可以模拟呀——只要上一级页面跟当前页面是同一个页面,那返回去跟没返回去不就一样了么!

因此,我们只需要在进入首页(假设地址是 localhost:8080/home)时,往 history 里再加入一条首页记录,不就好了嘛!

代码:

function closeWXWindow() {
  // TODO: 关闭微信浏览器
}

onMounted(() => {
  /** 新增内容 begin									
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

微信H5如何关闭浏览器(如何监听手机的物理返回键) 的相关文章

  • 在 Linux 中创建分区 - 分步指南

    在本教程中 我们将介绍在 Linux 中创建分区的步骤 这可以帮助您为特定用途分配不同的内存区域 创建分区还可以帮助您在计算机上安装多个操作系统 并最大限度地减少磁盘损坏时的损坏 如何在Linux中创建分区 在本教程中 我们将使用 fdis

随机推荐

  • Python实战项目23个实战小项目小程序简单

    Python项目23个小项目简单 项目类别 部分项目运行截图 含代码注释 项目类别 51商城 AI智能联系人管理 双击即启动 BBS问答社区 DIY字符画 双击即启动 Excel数据分析师 双击即启动 RCQ读者书库 双击即启动 Word助
  • LaTeX+Overleaf 论文速通教程

    一 文本 排版 二 章节和段落 三 数学公式 四 插入图片 五 插入表格 六 参考文献与交叉引用 不使用BibTeX 使用BibTeX 推荐 七 交叉引用label和ref Overleaf开发界面 latex命令 命令 可选参数 必选参数
  • 【ts】使用ts的vue项目必须安装的插件和要进行的配置(一般使用搭建vue的时候脚手架会帮忙弄好,但是还是要知道项目里这些代码都是什么)

    使用ts的项目 是需要安装ts loader来处理 ts文件的 例如babel loader是用于处理js文件 而ts就是ts loader 先确保项目是否安装了webpack和typescript npm install webpack
  • 前端面试话术集锦第 14 篇:高频考点(React常考基础知识点)

    这是记录前端面试的话术集锦第十四篇博文 高频考点 React常考基础知识点 我会不断更新该博文 1 生命周期 在V16版本中引入了Fiber机制 这个机制一定程度上的影响了部分生命周期的调用 并且也引入了新的2个API来解决问题 在之前的版
  • 深度学习用streamlit做网页demo

    CSDN话题挑战赛第2期 参赛话题 学习笔记 深度学习 图像生成领域许多工作都会做网页demo 技术与应用接轨 让用户体验模型能力 之前试过用轻量级Web应用框架Flask将深度学习模型部署到微信小程序端 pytorch模型部署小程序 三思
  • 智能机器人编程有必要学吗?

    机器人编程是由各种传统的学科构成的 例如 数学 物理 化学 结构 建筑 地理 生物 能源 信息技术等 学习机器人可以培养孩子的各种能力 包括动手 想象 创造 观察 分析 判断 归纳 理解 决策 组织 实验 计划性 条理性等 如果你正为这些纷
  • 31种选择器的应用

    选择器 selector 是CSS中很重要的概念 所有HTML语言中的标记都是通过不同的CSS选择器进行控制的 用户只需要通过选择器对不同的HTML标签进行控制 并赋予各种样式声明 即可实现各种效果 1 1 margin 0 padding
  • 2021.1.18

    标题 标题 标题 标题 标题 标题 引用 1 代码引用 for i in range 100 print hello world 三个反引号 语言类别插入代码框 2 句中引用 ban掉菲奥娜 3 单行引用 亚索示意敌人已不见踪影 亚索已经0
  • 【9】Docker的迁移与备份

    1 容器保存为镜像 实际工作中经常会使用到 docker commit 容器名称 保存为新镜像的名称 不能和已有的镜像名称重复 我们可以通过以下的命令将容器保存为镜像 docker commit redis myredis 根据新保存的 镜
  • ping

    为什么ping不通 1 ping不通也有好几种返回信息的 Ping不成功的返回信息有 Request Timed Out Destination Net Unreachable 和 Ba d IP address 还有 Source que
  • 3个超好用的图片压缩软件,超高压缩比,保持图片清晰度

    分享3个好用的图片压缩工具 不仅可以大大压缩图片大小 还能保持图片分辨率 压缩后的图片画质也能保持清晰 1 一键抠图 一个智能抠图在线网站 支持人像抠图 物品抠图和证件照之外 除此之外 还有图片压缩 图片格式转换 图片编辑 照片修复等功能
  • ValueError: embedded null character

    问题 报错 ValueError embedded null character 原因 路径中包含 0 被认为是转义字符 不会自动识别为路径 导致报错 需注意含 0 t 等特殊转义字符的路径 解决方案 路径改为 1 D 00pythonPr
  • 电源滤波电路的设计

    一 电源滤波技术 常用的滤波措施有 去耦电容 电感 磁珠等 常用的滤波场景有 电源滤波 接口滤波等 在进行PCB设计时 滤波器件的摆放位置相当关键 对于电容类去耦的滤波原则是靠近滤波区域位置放置最佳 在滤波电路的EMC设计中 滤波的作用基本
  • 电磁场仿真工具们

    首先说明两点 1 不同的商用电磁场仿真工具可能采用的算法不同 但对于偏上电感等常见结构 在各仿真器设置正确的情况下 各仿真工具得到的结果应该相似 如果对仿真结果有疑问 最简单的验证方法是 对同一模型使用不同原理的两种电磁场仿真工具进行仿真
  • vue2使用 tinymce富文本编辑器-图片上传、粘贴图片上传致服务器

    1 安装tinymce富文本编辑器插件 npm i tinymce npm i tinymce tinymce vue 2 创建Editor js文件 封装组件 以便使用
  • c1048: [编程入门]自定义函数之字符串拷贝

    题目描述 有一字符串 包含n个字符 写一函数 将此字符串中从第m个字符开始的全部字符复制成为另一个字符串 输入 数字n 一行字符串 数字m 输出 从m开始的子串 样例输入复制 6 abcdef 3 样例输出复制 cdef 思路 两种方法 一
  • Kafka : KafkaProducer Closing the kafka producer with timeoutMillis

    1 美图 2 背景 一段kafka写入程序 不晓得为啥突然发现很多奇怪的日志 kafka 多线程发送数据 然后在本地是可以的 在服务器上是偶现的 我写了一个本地程序多线程生产数据 发现是没有问题的 Test public void mult
  • mysql“Access denied for user 'root'@'IP地址

    mysql Access denied for user root IP地址 2013 12 27 17 29 1308人阅读 评论 0 收藏 举报 分类 面试 经历 42 版权声明 本文为博主原创文章 未经博主允许不得转载 xshell连
  • kvm环境创建虚拟机

    使用libvirt的xml配置文件创建虚拟机 kvm支持的镜像很多 常用的是原始镜像 img 还有支持动态大小扩张的qocw2格式 首选 更优的选择是系统盘如C盘用img格式 数据盘用qcow2格式以减少服务器磁盘闲置空间 本文仅记录如何用
  • 微信H5如何关闭浏览器(如何监听手机的物理返回键)

    一 背景 背景是这样的 该项目进入h5时会通过 location replace xxx 或 location href xxx 跳转到某个地址 该地址会请求获得微信 openId 获取成功后再重定向到h5首页 那么问题来了 重定向会在微信
Powered by Hwhale