关闭ie窗口清除Session的解决方法


Posted in Javascript onJanuary 10, 2014
//function window.onunload() { alert('这就是你要做的事,关闭网页之后做的! '); location = 'SessionClear.aspx'; }
        //function window.onbeforeunload() { alert('这就是你要做的事,关闭网页之前做的! ') }
        function window.onunload() {
            if ((window.screenLeft >= 10000 && window.screenTop >= 10000) || event.altKey) {
                alert(window.screenLeft+","+window.screenTop);
                //用户非正常关闭时需要触发的动作
                location = 'Handler1.ashx';
            }
        } 
    </script>

Handler1.ashx:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.SessionState;
namespace WebApplication1
{
    /// <summary>
    /// $codebehindclassname$ 的摘要说明
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    public class Handler1 : IHttpHandler,IRequiresSessionState
    {
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            context.Session.Abandon();
            context.Session.Clear();
        }
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

解释:

一般的会员形式的网站,在会员登陆后都会建立会话或者Cookie,然后需要在会员退出时点退出连接或按纽退出。在会员直接关闭窗体的时候,没有触发涉及到退出的一系列退出。而这些要等到服务器会话过期才会被清除掉。

有幸的是在网络上终于找到可以捕获用户使用Alt+F4、标题栏按右键关闭、双击标题栏、直接按关闭按钮的事件的方法。当然对于最小化到任务栏再进行关闭是不能捕获的。

<script language="javascript"> 
<!-- 
function window.onunload(){ 
if((window.screenLeft>=10000 && window.screenTop>=10000)||event.altKey) 
{ 
//用户非正常关闭时需要触发的动作 
} 
} 
--> 
</script>

说明:
window.screenLeft = 10000 + 边框宽 (2×2) = 10004
window.screenTop = 10000 + 工具栏高 + 标题栏高 = 10097

需要说明的,在onBeforeUnload中屏幕这些坐标属性都是正常数值。

screenLeft:获取浏览器客户区左上角相对于屏幕左上角的 x 坐标。

screenTop:获取浏览器客户区左上角相对于屏幕左上角的 y 坐标。

我猜测,在窗体销毁时捕获的将产生一个特殊的数值。在正常情况下的点击测试,数值都不会超过该数值。

现在问题是,在onBeforeUnload中使用window.location可以正常地提交请求到指定URL,但在onUnload事件中该方法不能有效执行。解决的方法是新开一个窗口,在将之关闭掉。

我们可以写上这样的话,来代替以往使用的,一系列的window.location。因为门户网站涉及到多个跨服务器的网站服务器。在统一入口退出后,需要依次地进行顺序退出,才能达到门户网站期望的效果。

var newWindow;
window.opener=null;
newWindow=window.open(URL,PageName, 'height=0,width=0');
newWindow.opener=null;
newWindow.close();
……

该段代码已经经过测试,在onUnload里不要使用window.close,因为对象销毁前会立即触发该事件。而onBeforeUnload是页面将要被卸载前触发的事件。

而所谓的清除实质上就是把做好退出功能的页面,直接以打开新窗口方式的调用。可能在调用到关闭的时候能停顿一两秒,或者关闭窗口放在专门的退出页面。该页面与正常退出又切回到首页,不同的是退出后会自动进行关闭,不需要再另外进行控制直接打开即可。

[注意]在window.onUnload中如果不加判断,则会在刷新页面等导致当前页面变化都会触发该事件。因此必须要进行判断,捕捉特定的操作,才能屏蔽掉一些正常的操作。

续:在IE中如何在用户直接关闭窗口前清除Session

昨天曾经讲解了实现思路,但在实际操作中发现,必须要加上延迟才能确保程序可以正常执行完毕。下面附上实现的细节,并附上简单的时间延迟函数。代码已经经过测试。

<script language="javascript"> 
function window.onUnload() 
{ 
var newWindow; 
if((window.screenLeft>=10000 && window.screenTop>=10000)||event.altKey) 
{ 
newWindow=window.open(‘退出程序地址','网页名称', 
'width=0,height=0,top=4000,left=4000');//新窗口将在视区之外打开 
newWindow.opener=null; 
sleep(5000); 
newWindow.close();//新窗口关闭 
} 
} 
function sleep(milisecond) 
{ 
var currentDate,beginDate=new Date(); 
var beginHour,beginMinute,beginSecond,beginMs; 
var hourGaps,minuteGaps,secondGaps,msGaps,gaps; 
beginHour=beginDate.getHours(); 
beginMinute=beginDate.getMinutes(); 
beginSecond=beginDate.getSeconds(); 
beginMs=beginDate.getMilliseconds(); 
do 
{ 
currentDate=new Date(); 
hourGaps=currentDate.getHours() - beginHour; 
minuteGaps=currentDate.getMinutes() - beginMinute; 
secondGaps=currentDate.getSeconds() - beginSecond; 
msGaps=currentDate.getMilliseconds() - beginMs; 
if(hourGaps<0) hourGaps+=24; //考虑进时进分进秒的特殊情况 
gaps=hourGaps*3600+ minuteGaps*60+ secondGaps; 
gaps=gaps*1000+msGaps; 
}while(gaps<milisecond); 
} 
</script>

二,在窗口加载或退出时,想让浏览器刷新一次可以如下操作:
<script type="text/javascript" language="javascript">
       window.opener.document.location.reload();
</script>
<boey onload="opener.location.reload();">   开窗时刷新
<body onUnload="opener.location.reload();">关闭时刷新
Javascript 相关文章推荐
js实现点击获取验证码倒计时效果
Jan 28 Javascript
Easyui 之 Treegrid 笔记
Apr 29 Javascript
浅析Javascript中bind()方法的使用与实现
May 30 Javascript
原生js实现tab选项卡切换
Mar 23 Javascript
vue.js数据绑定的方法(单向、双向和一次性绑定)
Jul 13 Javascript
通俗解释JavaScript正则表达式快速记忆
Aug 23 Javascript
React如何将组件渲染到指定DOM节点详解
Sep 08 Javascript
vue项目打包上传github并制作预览链接(pages)
Apr 19 Javascript
微信小程序实现蓝牙打印
Sep 23 Javascript
详解如何在Vue项目中发送jsonp请求
Oct 25 Javascript
vue-video-player 解决微信自动全屏播放问题(横竖屏导致样式错乱问题)
Feb 25 Javascript
Vue 修改网站图标的方法
Dec 31 Vue.js
js出生日期 年月日级联菜单示例代码
Jan 10 #Javascript
JS实现根据出生年月计算年龄
Jan 10 #Javascript
javascript使用百度地图api和html5特性获取浏览器位置
Jan 10 #Javascript
javascript通过className来获取元素的简单示例代码
Jan 10 #Javascript
深入理解JSON数据源格式
Jan 10 #Javascript
文本框(input)获取焦点(onfocus)时样式改变的示例代码
Jan 10 #Javascript
Script标签与访问HTML页面详解
Jan 10 #Javascript
You might like
php 带逗号千位符数字的处理方法
2012/01/10 PHP
PHP中图片等比缩放的实例
2013/03/24 PHP
php封装的page分页类完整实例代码
2020/02/01 PHP
jQuery 获取对象 基本选择与层级
2010/05/31 Javascript
jquery 模板的应用示例
2013/11/12 Javascript
jquery教程限制文本框只能输入数字和小数点示例分享
2014/01/13 Javascript
javascript 通用loading动画效果实例代码
2014/01/14 Javascript
headjs实现网站并行加载但顺序执行JS
2016/11/29 Javascript
微信小程序 地图map实例详解
2017/06/07 Javascript
详解Vue学习笔记入门篇之组件的内容分发(slot)
2017/07/17 Javascript
Angular 1.x个人使用的经验小结
2017/07/19 Javascript
浅谈如何使用 webpack 优化资源
2017/10/20 Javascript
[01:00:12]2018DOTA2亚洲邀请赛 4.7 淘汰赛 VP vs LGD 第一场
2018/04/09 DOTA
Python安装使用命令行交互模块pexpect的基础教程
2016/05/12 Python
在python3环境下的Django中使用MySQL数据库的实例
2017/08/29 Python
python实现数据导出到excel的示例--普通格式
2018/05/03 Python
Python爬虫之网页图片抓取的方法
2018/07/16 Python
python判断计算机是否有网络连接的实例
2018/12/15 Python
Python动态参数/命名空间/函数嵌套/global和nonlocal
2019/05/29 Python
bluepy 一款python封装的BLE利器简单介绍
2019/06/25 Python
详解python实现小波变换的一个简单例子
2019/07/18 Python
Tensorflow实现神经网络拟合线性回归
2019/07/19 Python
Python及Pycharm安装方法图文教程
2019/08/05 Python
基于python实现可视化生成二维码工具
2020/07/08 Python
使用python将微信image下.dat文件解密为.png的方法
2020/11/30 Python
MONNIER Frères英国官网:源自巴黎女士奢侈品配饰电商平台
2018/12/06 全球购物
汽车电子与维修专业大学生求职信
2013/09/28 职场文书
成教自我鉴定
2013/10/27 职场文书
我们的节日端午节活动总结
2015/02/11 职场文书
上课睡觉万能检讨书
2015/02/17 职场文书
贪污检举信范文
2015/03/02 职场文书
同意报考公务员证明
2015/06/17 职场文书
2016元旦晚会主持人开场白和结束语
2015/12/03 职场文书
导游词之海南天涯海角
2019/12/05 职场文书
基于Redis6.2.6版本部署Redis Cluster集群的问题
2022/04/01 Redis
唤醒紫霞仙子,携手再游三界!大话手游X《大话西游》电影合作专属剧情任务
2022/04/03 其他游戏