本文介绍在权限管理系统中,当父窗口(如admin注销或main.html关闭)时,如何自动关闭所有通过window.open打开的子窗口。核心方案是在父窗口body标签添加onUnload事件,利用数组记录所有子窗口句柄,并在注销或关闭时遍历执行close()方法。
问题背景与简化目标
在处理权限管理系统时,由于新系统界面风格与原系统存在差异,通常采用在新窗口中打开权限管理页面的方式。然而,这带来了一个问题:当管理员(admin)注销登录时,权限管理的子窗口并未自动关闭。这导致其他普通用户登录后,仍可能操作该权限管理窗口,存在安全隐患。
为简化问题场景,我们需要实现的功能是:当管理员注销或主页面(main.html)关闭时,所有通过该主页面打开的新窗口应同步关闭,从而解决上述安全漏洞。
以下是具体的实现代码示例。
代码实现与关键逻辑
代码如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body onUnload="closeNews();">
<a href="#" onclick="openNew('http://www.baidu.com','nihao')">打开新窗口</a>
<a href="#" onclick="logOut();">退出登录</a>
</body>
</html>
<script>
//用户记录所有打开的子窗口
var win_Array = new Array();
var win_num = -1;
//每次打开一个新窗口都记录下来
function openNew(uri,param){
win_num = win_num+1;
win_Array[win_num] = window.open(uri);
}
//用户注销的时候,执行关闭方法。body添加onUnload = "closeNews();" 当main窗口关闭时候,所有的子窗口关闭
function closeNews(){
//关闭权限管理
if(win_Array.length > 0){
for(var i = 0;i <= win_Array.length;i++){
var win_one = win_Array[i];
if(win_one != undefined){
win_one.close();
}
}
}
}
function logOut(){
//关闭子窗口
closeNews();
//退出登录
}
</script> 注意事项与测试反馈
说明一下:
在body标签中添加onUnload="closeNews();"是关键步骤。该事件确保当父窗口关闭时,自动执行关闭所有子窗口的逻辑。
测试结果显示,在Web项目环境中,IE8、IE10、Firefox、Chrome和Opera浏览器均能正常工作。
需要注意的是,如果仅作为静态HTML文件(如main.html)运行而非部署在Web容器中,IE浏览器可能会出现问题。因为在静态模式下,IE的window.open()行为可能表现为打开新页面而非新标签页,导致后续的窗口关闭方法失效。
由于时间有限,暂未深入探究IE在静态模式下的具体行为差异,欢迎了解原因的JavaScript技术专家提供指导。再次致谢。