监听浏览器关闭页面事件

最近在工作中遇到挺有意思的需求,特意记录下来,分享给兄弟萌。

大致需求如下:
场景一:在业务页面中需要监听用户是否关闭浏览器窗口,如果中途关闭,则给出二次确认提示。

场景二:在业务页面直接关闭浏览器窗口(此场景与场景一在同一个业务页面中进行)。

简述:在同一页面中,某种情况需要监听浏览器窗口关闭事件,给出二次确认框提示;某种情况不需要监听页面关闭事件,允许直接关闭当前页面。

一提到监听,大家肯定会想到用addEventListener实现,如下:

    //注册监听事件 
    // key:beforeunload --移除监听事件时用到
    window.addEventListener('beforeunload', function (e) {
        e.preventDefault();
        e.returnValue = '是否确定关闭页面?关闭后已经完成的题目不会保存!';
    });
        //移除指定监听事件,key:beforeunload
        //beforeunload 与注册监听事件的key值一致
        window.removeEventListener('beforeunload',function (e) {
                 return null;
          },false);

上述代码的确可以实现监听页面关闭时,弹出浏览器的二次确认弹框事件,但却无法满足上面提到的场景二(上述代码用javascript的注册事件监听成功,但移除事件失败)

解决方案

既然javascript的方式不行,那我就用jquery的方式。

        //	页面重新加载前 触发,相当于注册一个页面监听事件
        $(window).on('beforeunload', function(event) {
				event.preventDefault(); // 阻止默认行为,即弹出确认对话框
				event.returnValue = '是否确定关闭页面?关闭后已经完成的题目不会保存!'; //             
                 设置返回值
			});
				//注销页面关闭的监听事件
                //beforeunload 与 jq里监听的名称一致
                $(window).off('beforeunload');
                //关闭页面
				window.close();

如果需要直接关闭页面不再弹出二次确认框,则需要注销上面的监听即可。如果需要弹出二次确认框,则直接使用close方法即可,无需注销关闭页面的监听。
 

demo示例代码:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<style>
		button:hover{
			cursor: pointer;
			background-color:rgba(63,126,247,0.5)
		}
	</style>
	<script src="https://code.jquery.com/jquery-3.7.1.min.js"
	  integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo="
	  crossorigin="anonymous"></script>
	  <script>
		$(document).ready(function(){
		  $("#openChild").click(function () {
		  	  window.open("./childWindow.html", "_blank");
		  });
        }); 
	  </script>
	<body>
		<button id="openChild">打开子窗口-业务页面</button>
	</body>
</html>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<script src="https://code.jquery.com/jquery-3.7.1.min.js"
		integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script>
	<script>
		$(document).ready(function() {
			$(window).on('beforeunload', function(event) {
				event.preventDefault(); // 阻止默认行为,即弹出确认对话框
				event.returnValue = '是否确定关闭页面?关闭后已经完成的题目不会保存!'; // 设置返回值
			});
			console.log($("#close"))
			$("#close").click(function() {
				$(window).off('beforeunload'); //注销页面关闭的监听事件
				window.close();
			});

			$("#close2").click(function() {
				window.close(); //关闭页面
			});
		});
	</script>
	<body>
		<h1>我是子窗口-由父页面打开的。。。。</h1>
		<button id="close">直接关闭</button>
		<button id="close2">二次确认的关闭</button>
	</body>
</html>

demo效果图:

直接关闭页面:

关闭页面时二次确认:

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值