手机
当前位置:查字典教程网 >编程开发 >Javascript教程 >关闭ie窗口清除Session的解决方法
关闭ie窗口清除Session的解决方法
摘要:复制代码代码如下://functionwindow.onunload(){alert('这就是你要做的事,关闭网页之后做的!');locat...

复制代码 代码如下:

//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">

<>

</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();">关闭时刷新

【关闭ie窗口清除Session的解决方法】相关文章:

根据内容自动调整弹出窗口大小的JS解决方案

自动关闭的层

jQuery仿gmail实现fixed布局的方法

javascript实现树形菜单的方法

快速掌握Node.js环境的安装与运行方法

jQuery判断一个元素是否可见的方法

Jquery实现动态切换图片的方法

子父窗口之间的操作

png在IE6 下无法透明的解决方法汇总

javascript实时显示当天日期的方法

精品推荐
分类导航