关闭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 动态添加样式规则 W3C校检
Dec 25 Javascript
关于jQuery中.attr()和.prop()的问题探讨
Sep 06 Javascript
关闭时刷新父窗口两种方法
May 07 Javascript
Linux下编译安装php libevent扩展实例
Feb 14 Javascript
js判断输入字符串是否为空、空格、null的方法总结
Jun 14 Javascript
酷! 不同风格页面布局幻灯片特效js实现
Feb 19 Javascript
AngularJS 在同一个界面启动多个ng-app应用模块详解
Dec 20 Javascript
Vue.js bootstrap前端实现分页和排序
Mar 10 Javascript
js上传图片预览的实现方法
May 09 Javascript
Vue-resource拦截器判断token失效跳转的实例
Oct 27 Javascript
解决Vue中 父子传值 数据丢失问题
Aug 27 Javascript
微信小程序 SOTER 生物认证DEMO 指纹识别功能
Dec 13 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
用PHP实现图象锐化代码
2007/06/14 PHP
8个出色的WordPress SEO插件收集
2011/02/26 PHP
ThinkPHP公共配置文件与各自项目中配置文件组合的方法
2014/11/24 PHP
基于GD2图形库的PHP生成图片缩略图类代码分享
2015/02/08 PHP
php变量与数组相互转换的方法(extract与compact)
2016/12/02 PHP
php设计模式之迭代器模式实例分析【星际争霸游戏案例】
2020/04/07 PHP
Javascript 面向对象(二)封装代码
2012/05/23 Javascript
jquery 动态创建元素的方式介绍及应用
2013/04/21 Javascript
extjs每个组件要设置唯一的ID否则会出错
2014/06/15 Javascript
IE下支持文本框和密码框placeholder效果的JQuery插件分享
2015/01/31 Javascript
jquery代码实现简单的随机图片瀑布流效果
2015/04/20 Javascript
jQuery实现鼠标经过图片变亮其他变暗效果
2015/05/08 Javascript
jQuery.trim() 函数及trim()用法详解
2015/10/26 Javascript
JavaScript数据类型学习笔记分享
2016/09/01 Javascript
用file标签实现多图文件上传预览
2017/02/14 Javascript
Vue input控件通过value绑定动态属性及修饰符的方法
2017/05/03 Javascript
详解node-ccap模块生成captcha验证码
2017/07/01 Javascript
vue使用keep-alive实现数据缓存不刷新
2017/10/21 Javascript
原生JS实现瀑布流插件
2018/02/06 Javascript
微信小程序框架wepy之动态控制类名
2018/09/14 Javascript
javascript使用正则表达式实现注册登入校验
2020/09/23 Javascript
[57:55]完美世界DOTA2联赛PWL S3 Magma vs Phoenix 第二场 12.12
2020/12/16 DOTA
Python基于列表list实现的CRUD操作功能示例
2018/01/05 Python
python实现聊天小程序
2018/03/13 Python
Python图像处理之直线和曲线的拟合与绘制【curve_fit()应用】
2018/12/26 Python
学习Python列表的基础知识汇总
2020/03/10 Python
python用分数表示矩阵的方法实例
2021/01/11 Python
金牌葡萄酒俱乐部:Gold Medal Wine Club
2017/11/02 全球购物
澳洲女装时尚在线:Blue Bungalow
2018/05/05 全球购物
英国现代家具和照明购物网站:Heal’s
2019/10/30 全球购物
全球最大化妆品零售网站:SkinStore
2020/10/24 全球购物
自学考试自我鉴定范文
2013/09/26 职场文书
化验室技术员岗位职责
2013/12/24 职场文书
2015年消费者权益日活动总结
2015/02/09 职场文书
python实现简单的井字棋
2021/05/26 Python
JS 基本概念详细介绍
2021/10/16 Javascript