zoukankan      html  css  js  c++  java
  • 在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>

  • 相关阅读:
    Java反射得到属性的值和设置属性的值
    想建一个比较严格的自律打卡监督群,群主真的会很较真
    JS面向对象篇四、原型链与继承(多种继承实现方式及其利弊分析)
    JS面向对象篇三、创建对象的几种方法
    JS面向对象篇二、什么是原型?原型对象与实例对象、构造函数的关系及相关方法
    JS面向对象篇一、理解对象及属性特性(属性描述符)
    javascript作用域篇一、什么是javascript作用域链
    javascript函数篇四、函数的属性和方法——apply()、call()和bind()方法区别
    javascript函数篇三、函数声明提升
    javascript函数篇二、深入理解为什么javascript中没有函数重载
  • 原文地址:https://www.cnblogs.com/HeroZearin/p/2948863.html
Copyright © 2011-2022 走看看