關(guān)閉ie窗口清除Session的解決方法
//function window.onunload() { alert('這就是你要做的事,關(guān)閉網(wǎng)頁之后做的! '); location = 'SessionClear.aspx'; }
//function window.onbeforeunload() { alert('這就是你要做的事,關(guān)閉網(wǎng)頁之前做的! ') }
function window.onunload() {
if ((window.screenLeft >= 10000 && window.screenTop >= 10000) || event.altKey) {
alert(window.screenLeft+","+window.screenTop);
//用戶非正常關(guān)閉時需要觸發(fā)的動作
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;
}
}
}
}
解釋:
一般的會員形式的網(wǎng)站,在會員登陸后都會建立會話或者Cookie,然后需要在會員退出時點退出連接或按紐退出。在會員直接關(guān)閉窗體的時候,沒有觸發(fā)涉及到退出的一系列退出。而這些要等到服務(wù)器會話過期才會被清除掉。
有幸的是在網(wǎng)絡(luò)上終于找到可以捕獲用戶使用Alt+F4、標題欄按右鍵關(guān)閉、雙擊標題欄、直接按關(guān)閉按鈕的事件的方法。當然對于最小化到任務(wù)欄再進行關(guān)閉是不能捕獲的。
<script language="javascript">
<!--
function window.onunload(){
if((window.screenLeft>=10000 && window.screenTop>=10000)||event.altKey)
{
//用戶非正常關(guān)閉時需要觸發(fā)的動作
}
}
-->
</script>
說明:
window.screenLeft = 10000 + 邊框?qū)?(2×2) = 10004
window.screenTop = 10000 + 工具欄高 + 標題欄高 = 10097
需要說明的,在onBeforeUnload中屏幕這些坐標屬性都是正常數(shù)值。
screenLeft:獲取瀏覽器客戶區(qū)左上角相對于屏幕左上角的 x 坐標。
screenTop:獲取瀏覽器客戶區(qū)左上角相對于屏幕左上角的 y 坐標。
我猜測,在窗體銷毀時捕獲的將產(chǎn)生一個特殊的數(shù)值。在正常情況下的點擊測試,數(shù)值都不會超過該數(shù)值。
現(xiàn)在問題是,在onBeforeUnload中使用window.location可以正常地提交請求到指定URL,但在onUnload事件中該方法不能有效執(zhí)行。解決的方法是新開一個窗口,在將之關(guān)閉掉。
我們可以寫上這樣的話,來代替以往使用的,一系列的window.location。因為門戶網(wǎng)站涉及到多個跨服務(wù)器的網(wǎng)站服務(wù)器。在統(tǒng)一入口退出后,需要依次地進行順序退出,才能達到門戶網(wǎng)站期望的效果。
var newWindow;
window.opener=null;
newWindow=window.open(URL,PageName, 'height=0,width=0');
newWindow.opener=null;
newWindow.close();
……
該段代碼已經(jīng)經(jīng)過測試,在onUnload里不要使用window.close,因為對象銷毀前會立即觸發(fā)該事件。而onBeforeUnload是頁面將要被卸載前觸發(fā)的事件。
而所謂的清除實質(zhì)上就是把做好退出功能的頁面,直接以打開新窗口方式的調(diào)用??赡茉谡{(diào)用到關(guān)閉的時候能停頓一兩秒,或者關(guān)閉窗口放在專門的退出頁面。該頁面與正常退出又切回到首頁,不同的是退出后會自動進行關(guān)閉,不需要再另外進行控制直接打開即可。
[注意]在window.onUnload中如果不加判斷,則會在刷新頁面等導致當前頁面變化都會觸發(fā)該事件。因此必須要進行判斷,捕捉特定的操作,才能屏蔽掉一些正常的操作。
續(xù):在IE中如何在用戶直接關(guān)閉窗口前清除Session
昨天曾經(jīng)講解了實現(xiàn)思路,但在實際操作中發(fā)現(xiàn),必須要加上延遲才能確保程序可以正常執(zhí)行完畢。下面附上實現(xiàn)的細節(jié),并附上簡單的時間延遲函數(shù)。代碼已經(jīng)經(jīng)過測試。
<script language="javascript">
function window.onUnload()
{
var newWindow;
if((window.screenLeft>=10000 && window.screenTop>=10000)||event.altKey)
{
newWindow=window.open(‘退出程序地址','網(wǎng)頁名稱',
'width=0,height=0,top=4000,left=4000');//新窗口將在視區(qū)之外打開
newWindow.opener=null;
sleep(5000);
newWindow.close();//新窗口關(guān)閉
}
}
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();">關(guān)閉時刷新
相關(guān)文章
JS中FileReader類實現(xiàn)文件上傳及時預(yù)覽功能
這篇文章主要為大家詳細介紹了JS中FileReader類實現(xiàn)文件上傳及時預(yù)覽功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-03-03JavaScript實現(xiàn)在頁面刷新時成功發(fā)送停止請求
最近接到一個需求,需要在頁面刷新或者關(guān)閉瀏覽器標簽頁的時候觸發(fā)停止當前sql的接口,所以本文小編給大家詳細介紹了解決方案和實現(xiàn)代碼,需要的朋友可以參考下2023-11-11基于JS實現(xiàn)彈出一個隱藏的div窗口body頁面變成灰色并且不可被編輯
這篇文章主要介紹了基于JS實現(xiàn)彈出一個隱藏的div窗口body頁面變成灰色并且不可被編輯的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-12-12