关闭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 未结束的字符串常量常见解决方法
Jan 24 Javascript
jQuery.buildFragment使用方法及思路分析
Jan 07 Javascript
jquery文字上下滚动的实现方法
Mar 22 Javascript
jquery实现增加删除行的方法
Feb 03 Javascript
在React框架中实现一些AngularJS中ng指令的例子
Mar 06 Javascript
jQuery实现表格文本框淡入更改值后淡出效果
Sep 27 Javascript
node.js实现回调的方法示例
Mar 01 Javascript
详解vue挂载到dom上会发生什么
Jan 20 Javascript
图文详解vue框架安装步骤
Feb 12 Javascript
JavaScript数据结构与算法之基本排序算法定义与效率比较【冒泡、选择、插入排序】
Feb 21 Javascript
JavaScript ES6 Class类实现原理详解
May 08 Javascript
js实现直播点击飘心效果
Aug 19 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 文件状态缓存带来的问题
2008/12/14 PHP
php strcmp使用说明
2010/04/22 PHP
在PHP中养成7个面向对象的好习惯
2010/07/17 PHP
33道php常见面试题及答案
2015/07/06 PHP
php curl模拟post请求和提交多维数组的示例代码
2015/11/19 PHP
不用锚点也可以平滑滚动到页面的指定位置实现代码
2013/05/08 Javascript
jquery图片不完全按比例自动缩小的简单代码
2013/07/29 Javascript
js数组去重的常用方法总结
2014/01/24 Javascript
Javascript中的回调函数和匿名函数的回调示例介绍
2014/05/12 Javascript
javascript中2个感叹号的用法实例详解
2014/09/04 Javascript
基于jQuery实现复选框的全选 全不选 反选功能
2014/11/24 Javascript
JavaScript使用setTimeout实现延迟弹出警告框的方法
2015/04/07 Javascript
Jquery常用的方法汇总
2015/09/01 Javascript
javascript事件模型介绍
2016/05/31 Javascript
微信小程序 网络API 上传、下载详解
2016/11/09 Javascript
jQuery使用ajax方法解析返回的json数据功能示例
2017/01/10 Javascript
AngularJS入门教程二:在路由中传递参数的方法分析
2017/05/27 Javascript
DataTables添加额外的查询参数和删除columns等无用参数实例
2017/07/04 Javascript
详解NODEJS基于FFMPEG视频推流测试
2017/11/17 NodeJs
利用node实现一个批量重命名文件的函数
2017/12/21 Javascript
JS验证输入的是否是数字及保留几位小数问题
2018/05/09 Javascript
[03:59]第二届DOTA2亚洲邀请赛选手传记-VGJ.rOtk
2017/04/03 DOTA
[01:05:52]DOTA2-DPC中国联赛 正赛 Ehome vs Aster BO3 第一场 2月2日
2021/03/11 DOTA
Python字符串特性及常用字符串方法的简单笔记
2016/01/04 Python
Python实现翻转数组功能示例
2018/01/12 Python
python实现图片上添加图片
2019/11/26 Python
推荐技术人员一款Python开源库(造数据神器)
2020/07/08 Python
CSS3 Pie工具推荐--让IE6-8支持一些优秀的CSS3特性
2014/09/02 HTML / CSS
美国内衣第一品牌:Hanes(恒适)
2016/07/29 全球购物
团队精神的演讲稿
2014/05/14 职场文书
乡镇个人对照检查材料
2014/08/22 职场文书
高三复习计划
2015/01/19 职场文书
关于颐和园的导游词
2015/01/30 职场文书
万里长城导游词
2015/01/30 职场文书
大学生心理健康教育心得体会
2016/01/12 职场文书
Mybatis-Plus进阶分页与乐观锁插件及通用枚举和多数据源详解
2022/03/21 Java/Android