在用户关闭页面时,提示用户有内容未保存-论onbeforeunload事件的用法

简介: 在用户关闭页面时,提示用户有内容未保存-论onbeforeunload事件的用法

onbeforeunload该事件在火狐、谷歌中默认不生效,除非你打开控制台。

可以间接实现,监听页面中输入框是否有值,如果有,则触发,代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
<input type="text" id="name">
<script>
        const beforeUnloadListener = (event) => {
          event.preventDefault();
          return event.returnValue = "Are you sure you want to exit?";
        };
        const nameInput = document.querySelector("#name");
        nameInput.addEventListener("input", (event) => {
          if (event.target.value !== "") {
            addEventListener("beforeunload", beforeUnloadListener, {capture: true});
          } else {
            removeEventListener("beforeunload", beforeUnloadListener, {capture: true});
          }
        });
</script>
</body>
</html>
效果:

原理:

beforeunload当窗口、文档及其资源即将被卸载时触发该事件。文档仍然可见,此时事件仍然可以取消。

此事件使网页能够触发确认对话框,询问用户是否真的要离开该页面。如果用户确认,浏览器导航到新页面,否则取消导航。

如果将事件直接绑定到window或body中,则在谷歌和火狐中不会触发,因为用户可能与页面没有任何交互,浏览器会忽略,就像浏览器不支持自动播放音视频那样,这时可以在页面中添加一个输入框,然后事件监听该输入框,如果输入框值为空,再触发该事件。

使用说明

该beforeunload事件遭受与该事件相同的问题unload。

特别是在移动设备上,beforeunload事件不会被可靠地触发。例如,beforeunload在以下场景中根本不会触发事件:

  1. 移动用户访问您的页面。
  2. 然后用户切换到不同的应用程序。
  3. 稍后,用户从应用管理器关闭浏览器。

建议开发者beforeunload只在这种场景下监听,并且只有在实际有未保存的更改时才监听,以尽量减少对性能的影响。

相关文章
|
2月前
|
开发者 Windows
NDM多线程下载器!实用的下载器,绿色版下载及安装教程
NDM是一款小巧高效的多线程下载器,支持Windows、Mac及浏览器插件,绿色单文件仅904KB,无需安装。已汉化,操作简单,下载速度快,支持HTTP/HTTPS/FTP协议,不支持磁力链接。使用前需关闭杀毒软件,配合7-ZIP解压,浏览器插件可自动嗅探音视频资源。
409 2
|
3月前
|
数据采集 存储 Web App开发
Python爬虫库性能与选型实战指南:从需求到落地的全链路解析
本文深入解析Python爬虫库的性能与选型策略,涵盖需求分析、技术评估与实战案例,助你构建高效稳定的数据采集系统。
361 0
|
SQL JavaScript 前端开发
简单用Nodejs + express 编写接口
【6月更文挑战第3天】该文介绍了如何在Node.js和Express中创建GET和POST接口。首先,简要提到了准备工作,建议查阅上一篇文章。接着展示了GET接口的示例,说明可以直接在浏览器中请求。然后,详细解释了POST接口的步骤,包括引入Express模块、设置路由处理程序、解析请求体及处理请求。最后,强调了编写接口时应注意错误处理、安全性、中间件使用、路由组织、日志记录、性能优化和测试等关键点。作者以肥晨的身份结尾,鼓励关注其分享的前端学习资料和技术动态。
402 1
|
存储 JavaScript 前端开发
Blazor 调用 Clipboard API 读写剪贴板数据
【10月更文挑战第14天】Blazor 是一个使用 .NET 和 C# 构建交互式 Web UI 的框架。由于浏览器安全策略,直接访问某些原生 API(如 Clipboard API)受限。通过 JavaScript 互操作性(JS Interop),可在 Blazor 中调用这些 API。首先在 HTML 定义 JavaScript 函数,再通过 `IJSRuntime` 调用。此外,需注意不同浏览器对 Clipboard API 的支持程度及用户隐私授权问题。
270 2
|
Kubernetes Docker 容器
掌握Docker容器化技术:从入门到实战
掌握Docker容器化技术:从入门到实战
204 0
|
C语言
【学习笔记】Verilog之四:结构建模方法
Verilog 提供两种建模方法:行为建模和结构建模。行为建模专注于电路功能描述,类似高级编程语言,不涉及底层实现。数据流建模使用 `assign` 进行连续赋值,适合描述组合逻辑。线网可以在声明时直接赋值。顺序行为建模通过 `initial` 和 `always` 语句实现,`initial` 用于一次性初始化,`always` 则用于响应特定事件的重复执行。时序控制包括时延和事件控制,用于精确控制电路行为。阻塞和非阻塞赋值决定了语句执行的顺序和并发性。过程性连续赋值如 `assign-deassign` 和 `force-release` 提供了更多灵活性。
|
负载均衡 算法 应用服务中间件
负载均衡技术在Web服务器集群中的应用
【8月更文第28天】随着互联网的发展和用户对Web服务需求的增长,单台服务器很难满足大规模访问的需求。为了提高系统的稳定性和扩展性,通常会采用Web服务器集群的方式。在这种架构中,负载均衡器扮演着至关重要的角色,它能够合理地分配客户端请求到不同的后端服务器上,从而实现资源的最优利用。
411 2
|
前端开发
你不知道的css——2. 百分比高度失效,绝对定位和非绝对定位元素的宽高百分比计算方法的不同
你不知道的css——2. 百分比高度失效,绝对定位和非绝对定位元素的宽高百分比计算方法的不同
236 1
|
SQL 安全 前端开发
【组件健壮性】后端开发常见安全问题、防范与开发规范
本文介绍后端开发过程中遇到的常见安全问题及其解决方案,包括越权漏洞、SQL注入、XSS跨站脚本攻击、CSRF跨站请求伪造攻击等。
|
SQL 开发框架 .NET
聊聊 System.Linq.Dynamic,以及分享一个使用 System.Linq.Dynamic 扩展 LINQ 查询的详细例子
聊聊 System.Linq.Dynamic,以及分享一个使用 System.Linq.Dynamic 扩展 LINQ 查询的详细例子
425 0