关闭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对象的property和prototype是这样一种关系
Mar 24 Javascript
javascript contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
Feb 04 Javascript
juqery 学习之三 选择器 简单 内容
Nov 25 Javascript
目前流行的JavaScript库的介绍及对比
Sep 29 Javascript
AngularJS中取消对HTML片段转义的方法例子
Jan 04 Javascript
javascript省市级联功能实现方法实例详解
Oct 20 Javascript
Javascript实现汉字和拼音互转的终极方案
Oct 19 Javascript
利用jquery实现下拉框的禁用与启用
Dec 07 Javascript
js案例之鼠标跟随jquery版(实例讲解)
Jul 21 jQuery
Vue在页面数据渲染完成之后的调用方法
Sep 11 Javascript
js通过canvas生成图片缩略图
Oct 02 Javascript
JavaScript实现显示和隐藏图片
Apr 29 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
ThinkPHP缓存方法S()概述
2014/06/13 PHP
确保Laravel网站不会被嵌入到其他站点中的方法
2019/10/18 PHP
DOM2非标准但却支持很好的几个属性小结
2012/01/21 Javascript
基于jQuery的弹出框插件
2012/03/18 Javascript
event对象获取方法总结在google浏览器下测试
2013/11/03 Javascript
jQuery Ajax异步处理Json数据详解
2013/11/05 Javascript
JS实现遮罩层效果的简单实例
2013/11/12 Javascript
JS中使用Array函数shift和pop创建可忽略参数的例子
2014/05/28 Javascript
js/jquery判断浏览器类型的方法小结
2015/05/12 Javascript
分享自己用JS做的扫雷小游戏
2016/02/17 Javascript
js获取客户端操作系统类型的方法【测试可用】
2016/05/27 Javascript
老生常谈JavaScript数组的用法
2016/06/10 Javascript
AngularJS 执行流程详细介绍
2016/08/18 Javascript
jQuery实现导航样式布局操作示例【可自定义样式布局】
2018/07/24 jQuery
详解Angular6 热加载配置方案
2018/08/18 Javascript
深入理解Vue 的钩子函数
2018/09/05 Javascript
vue实现直播间点赞飘心效果的示例代码
2019/09/20 Javascript
[12:29]《一刀刀一天》之DOTA全时刻19:蝙蝠骑士田伯光再度不举
2014/06/10 DOTA
Python下的Softmax回归函数的实现方法(推荐)
2017/01/26 Python
Python之Scrapy爬虫框架安装及使用详解
2017/11/16 Python
Python小工具之消耗系统指定大小内存的方法
2018/12/03 Python
django 通过URL访问上传的文件方法
2019/07/28 Python
Python操作Sonqube API获取检测结果并打印过程解析
2019/11/27 Python
解决python使用list()时总是报错的问题
2020/05/05 Python
Python中的With语句的使用及原理
2020/07/29 Python
selenium携带cookies模拟登陆CSDN的实现
2021/01/19 Python
俄罗斯EPL钻石珠宝店:ЭПЛ
2019/10/22 全球购物
公关活动策划方案
2014/05/25 职场文书
大学专科自荐信
2014/06/17 职场文书
敬老院献爱心活动总结
2014/07/08 职场文书
员工生日活动方案
2014/08/24 职场文书
小学生勤俭节约演讲稿
2014/08/28 职场文书
2014年党委工作总结
2014/11/22 职场文书
单独二胎证明
2015/06/24 职场文书
企业文化学习心得体会
2016/01/21 职场文书
python中的mysql数据库LIKE操作符详解
2021/07/01 MySQL