`
wenson
  • 浏览: 1041595 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

在IE中如何在用户直接关闭窗口前清除Session

阅读更多
一般的会员形式的网站,在会员登陆后都会建立会话或者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>
分享到:
评论

相关推荐

    关闭ie窗口清除Session的解决方法

    本篇文章主要是对关闭ie窗口清除Session的解决方法进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助

    人人都应该掌握的一些电脑操作技巧

    启动“系统配置实用程序”,在“启动”项中列出了系统启动时加载的项目及来源,仔细查看你是否需要它自动加载,否则清除项目前的复选框,加载的项目愈少,启动的速度自然愈快。此项需要重新启动方能生效。 十四、...

    KODExplorer 芒果云-资源管理器

    - 弹出层中的弹出层关闭,父窗口失去焦点问题。 - 代码中grunt部分代码拆分开,放到程序外面;提交到git、osc - 桌面:删除alert enter快捷键删除 - install 检测 加入跳过,(只判断用到的函数) 加入多语言 - ...

    PHP程序开发范例宝典III

    实例089 关闭IE主窗口时,不弹出询问对话框 132 实例090 弹出提示对话框并重定向网页 133 3.8 弹出网页对话框 134 实例091 弹出全屏显示的网页模式对话框 134 实例092 网页拾色器 136 实例093 日期选择器...

    asp.net知识库

    突破屏蔽限制,自己的网站使劲弹新IE窗口 对页面SCROLLING的CSS不能生效原因 .Net 中IE使用WinForm控件的使用心得。 动态加载用户控件的组件!(终结MasterPages技术) 在ASP.NET 1.1下实现模板化站点的新思路 在ASP...

    网管教程 从入门到精通软件篇.txt

    如果不能在启动目录(默认为 %systemroot%System32)中找到该文件,将试着在 Windows 安装 CD 中找到它。如果有多引导系统的计算机,必须保证是在包含 Windows 的驱动器上使用该命令。 Diskpart  创建和删除硬盘...

    C#编程经验技巧宝典

    112 &lt;br&gt;0188 如何在ASP.NET中显示当前IE浏览器头信息 113 &lt;br&gt;5.6 其他应用技巧 114 &lt;br&gt;0189 如何判断年份是否为闰年 114 &lt;br&gt;0190 如何根据年份判断十二生肖 114 &lt;br&gt;0191 如何根据IP...

    UniGUI 说明

    16. 怎样给每一个在线用户建立一套变量,在用户断开后立即清除 ............................. 18 17. TUniHiddenPanel 的作用 ....................................................................................

Global site tag (gtag.js) - Google Analytics