关闭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 相关文章推荐
javascript 另一种图片滚动切换效果思路
Apr 20 Javascript
使用javascript:将其它类型值转换成布尔类型值的解决方法详解
May 07 Javascript
js去除输入框中所有的空格和禁止输入空格的方法
Jun 09 Javascript
纯js实现仿QQ邮箱弹出确认框
Apr 29 Javascript
JS数字抽奖游戏实现方法
May 04 Javascript
jQuery控制DIV层实现由大到小,由远及近动画变化效果
Oct 09 Javascript
javascript常用经典算法实例详解
Nov 25 Javascript
基于构造函数的五种继承方法小结
Jul 27 Javascript
springmvc接收jquery提交的数组数据代码分享
Oct 28 jQuery
Angular使用Restful的增删改
Dec 28 Javascript
详解VUE单页应用骨架屏方案
Jan 17 Javascript
构建一个JavaScript插件系统
Oct 20 Javascript
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
mysql总结之explain
2012/02/27 PHP
JS 遮照层实现代码
2010/03/31 Javascript
JSChart轻量级图形报表工具(内置函数中文参考)
2010/10/11 Javascript
漂亮的jquery提示效果(仿腾讯弹出层)
2013/02/05 Javascript
JQuery制作的放大效果的popup对话框(未添加任何jquery plugin)分享
2013/04/28 Javascript
几种延迟加载JS代码的方法加快网页的访问速度
2013/10/12 Javascript
js隐式全局变量造成的bug示例代码
2014/04/22 Javascript
jQuery添加删除DOM元素方法详解
2016/01/18 Javascript
深入探秘jquery瀑布流的实现
2016/01/30 Javascript
js仿小米手机上下滑动效果
2017/02/05 Javascript
AngularJS封装$http.post()实例详解
2017/05/06 Javascript
jQuery操作css样式
2017/05/15 jQuery
nodejs密码加密中生成随机数的实例代码
2017/07/17 NodeJs
JS实现导出Excel的五种方法详解【附源码下载】
2018/03/15 Javascript
简单介绍react redux的中间件的使用
2018/04/06 Javascript
d3绘制基本的柱形图的实现代码
2018/12/12 Javascript
Angular4.0动画操作实例详解
2019/05/10 Javascript
python多进程操作实例
2014/11/21 Python
Python3.2中Print函数用法实例详解
2015/05/19 Python
详解python中的json的基本使用方法
2016/12/21 Python
Python 中urls.py:URL dispatcher(路由配置文件)详解
2017/03/24 Python
python访问抓取网页常用命令总结
2017/04/11 Python
啥是佩奇?使用Python自动绘画小猪佩奇的代码实例
2019/02/20 Python
20行Python代码实现视频字符化功能
2020/04/13 Python
python 通过文件夹导入包的操作
2020/06/01 Python
详细分析Python collections工具库
2020/07/16 Python
新加坡时尚网上购物:Zalora新加坡
2016/07/26 全球购物
沃尔玛旗下墨西哥超市:Bodega Aurrera
2020/11/13 全球购物
J2EE面试题大全
2016/08/06 面试题
消防安全汇报材料
2014/02/08 职场文书
酒店总经理岗位职责范本
2014/08/08 职场文书
水利专业大学生职业生涯规划书范文
2014/09/17 职场文书
2019最新版劳务派遣管理制度
2019/08/16 职场文书
MySQL 重写查询语句的三种策略
2021/05/10 MySQL
如何正确理解python装饰器
2021/06/15 Python
Python实现对齐打印 format函数的用法
2022/04/28 Python