Vue开发实践:解决Chrome浏览器禁止通过代码关闭窗口的问题

前言

        在开发 Electron 桌面端应用时,软件有一个退出软件的按钮,用于关闭应用程序。然而,在实现这一功能的过程中,我们可能会遇到一些问题。本文将探讨这个问题,并给出解决方案。       

实现

        询问负责 Electron 的同学,得知直接关闭当前窗口就行。

        没有花多少时间去思考,第一时间赶到的代码是 window.close();

        但是实际运行一下发现并没有关闭窗口,打开控制栏发现警告 " 只能关闭由代码打开的窗口 ":

        这是因为 Chrome 浏览器的安全限制,window.close() 方法只能在通过 window.open() 方法或脚本创建的窗口中调用。这意味着我们只能关闭由 JavaScript 打开的窗口或标签页。

        解决原理

        网上查询了下相关解决方法,发现解决方案都是: 通过 JavaScript 打开一个新窗口到自身,新窗口(具有"由 JavaScript 创建"属性)会覆盖原来的窗口(不具有 "由 JavaScript 创建"属性),然后再执行 window.close() 即可关闭窗口。

        以下是各种方法汇总:

序号关闭代码需要确认无任何作用无需确认测试
1window.close()IE7firefox,chrome, safariOperaClose
2window.opener=null; window.open('','_self'); window.close();firefoxIE7,Opera, chrome,safariClose
3window.open('','_self'); window.close();firefoxIE7,Opera, chrome,safariClose
4window.opener=null; window.close();IE7firefox,safarichrome,OperaClose
5const opened=window.open('about:blank','_self'); opened.opener=null; opened.close();firefoxsafari,IE7, chrome,OperaClose
6const opened=window.open('about:blank','_self'); opened.close();safari,firefoxfirefox,IE7, chrome,OperaClose

        但是经过我的测试,以上统统只能跳转到空白页,并没有实现关闭窗口!

        问题原因

        偶然的,我发现在首页(此时 history 栈只有当前页记录)点击关闭软件按钮可以完美的实现功能,一旦进入软件,再返回首页点击关闭软件按钮就只能跳转到空白页。那么问题就出在历史记录上面,查阅发现是因为 Chrome 浏览器为了保护用户数据的安全,不允许直接关闭包含历史记录的窗口。历史记录是用户在浏览器中浏览过的网页记录,如果允许直接关闭窗口,可能会导致用户丢失未保存的浏览数据,或者导致误操作关闭了包含重要信息的窗口。

       那么我们知道是因为存在历史记录导致我们的代码无法正确执行,那么让历史记录一直为空就好了,参考我之前写的 Element UI导航菜单之秘:无痕迹浏览与历史记录栈的管理 ,将项目内所有路由跳转从 push 修改为 replace 模式,这样 history 栈就会一直为当前页对应记录,就不会影响到我们关闭窗口了。

        解决方案

  1. 通过 JavaScript 打开一个新窗口到自身,新窗口(具有"由 JavaScript 创建"属性)会覆盖原来的窗口(不具有 "由 JavaScript 创建"属性),然后再执行 window.close() 即可关闭窗口。
  2. 将项目的路由跳转从 push 修改为 replace 模式。这样,history 栈就会一直为当前页对应记录,就不会影响到我们关闭网页了。

        需要注意的是,以上方法可能会影响到用户的使用体验,因为用户无法使用历史记录回退前进功能了。因此,在决定是否使用这些方法时,需要权衡利弊。


总结

        虽然最后我们实现代码关闭窗口的功能,但是我也在想:用户无法使用历史记录回退/前进功能了,虽然我们也可以再自己设置实体按键。但是用户真的需要这么一个实体关闭按钮吗?用户自身不能点击右上角关闭吗?

        在某些情况下,我们需要监听用户的关闭行为,但有时我们也无需这么做。那么在某些情况下这个关闭按钮的需求就是伪需求,属于不合理的需求,我们应该直接对产品说出 delete it!删除掉这个退出实体按钮是更好的选择!至于功能,用户自己会动手。


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

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

相关文章

智能变电站协议系列-1、GOOSE、SV、MMS协议简介及GOOSE示例运行问题(IEC61850)

文章目录 一、前言二、资料准备三、智能变电站自动化系统架构四、GOOSE、MMS、SV协议以及其他协议1、GOOSE(通用面向对象变电站事件)协议2、MMS(制造消息规范)协议3、采样值 (SV) 协议4、数字化变电站中使用的其他协议遗留协议 五…

智能算力进阶C位,揭秘人工智能产业背后的“冰山一角”

作者 | 曾响铃 文 | 响铃说 前几年,在IDC领域,市场谈及最多的还是数据中心,随着人工智能产业的成熟,特别是今年以来大模型的爆发,智算中心逐步替代了数据中心进入大众视野,成为市场热议的关键词&#xff…

java-多线程

程序,进程,线程 【1】程序,进程,线程 ➢程序(program):是为完成特定任务、用某种语言编写的一组指令的集合,是一段静态的代码。 (程序是静态的) ➢进程(process):是程序的一次执行…

VGGNet

目录 一、VGGNet介绍 1、VGG块 2、VGG架构 3、LeNet, AlexNet和VGGNet对比 4、总结 二、代码实现 1、定义VGG卷积块 2、VGG网络 3、训练模型 4、总结 一、VGGNet介绍 VGGNet(Visual Geometry Group Network)是一种深度卷积神经网络,…

RocketMQ系统性学习-RocketMQ高级特性之消息大量堆积处理、部署架构和高可用机制

🌈🌈🌈🌈🌈🌈🌈🌈 【11来了】文章导读地址:点击查看文章导读! 🍁🍁🍁🍁🍁🍁&#x1f3…

恶意软件样本行为分析——Process Monitor和Wireshark

1.1 实验名称 恶意软件样本行为分析 1.2 实验目的 1) 熟悉 Process Monitor 的使用 2) 熟悉抓包工具 Wireshark 的使用 3) VMware 的熟悉和使用 4) 灰鸽子木马的行为分析 1.3 实验步骤及内容 第一阶段:熟悉 Process Monitor 的使用 利用 Process …

职场利器-软考高级、PMP、CKA/CKS/CKAD备考

1、【软考高级】信息系统项目管理师 全国计算机技术与软件专业技术资格(水平)考试网上报名平台http://bm.ruankao.org.cn/sign/welcome 模拟作答系统230747 第一次裸考 考试成绩查询 三科均未通过 软考考试多少分通过? ​​​​​​​ 软考高级,它的考试科目是《…

金蝶云星空执行部署包后业务对象会被标记上部署包的开发码

文章目录 金蝶云星空执行部署包后业务对象会被标记上部署包的开发码 金蝶云星空执行部署包后业务对象会被标记上部署包的开发码 会被标记成开发码的业务对象包括以下: 新增的业务对象,扩展的业务对象 --查询二开的元数据打包 FPACKAGEID不为空&#xff…

集合论:二元关系(1)

集合论这一章内容很多,重点是二元关系中关系矩阵,关系图和关系性质:自反、反自反、对称、反对称、传递以及关系闭包的运算,等价关系,偏序关系,哈斯图,真吓人! 1.笛卡儿积 由两个元素x和y按照一…

Midjourney V6版本强势来袭,挑战像素极限!

最新的Midjourney V6模型带来了一系列强大的功能和改进,以下是一些关键特性的总结: AI提示词(第33辑)Midjourney V6版本强势来袭,挑战像素极限!-喜好儿aigc 目前测试已发现: 提示词长度已增至…

安卓好用的python编辑器,安卓平台python编辑器

本篇文章给大家谈谈安卓上好用的python编辑软件有哪些,以及安卓上好用的python编辑软件推荐,希望对各位有所帮助,不要忘了收藏本站喔。 1. 简介 Thonny是基于python内置图形库tkinter开发出来的支持多平台(windows,Mac,Linux)的python IDE&am…

简单了解一下当前火热的大数据 -- Kylin

神兽麒麟 一、Apache Kylin 是什么?二、Kylin架构结语 一、Apache Kylin 是什么? 由eBay公司中国团队研发,是一个免费开源的OLAP多维数据分析引擎优点 超快的响应速度,亚秒级支持超大数据集(PB以上,千亿记…