function window.onunload() {
if ((window.screenLeft >= 10000 && window.screenTop >= 10000) || event.altKey) {
alert(window.screenLeft+","+window.screenTop);
//用戶非正常關(guān)閉時(shí)需要觸發(fā)的動(dòng)作
location = 'Handler1.ashx';
}
}
</script>
namespace WebApplication1
{
/// <summary>
/// $codebehindclassname$ 的摘要說(shuō)明
/// </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;
}
}
}
}
一般的會(huì)員形式的網(wǎng)站,在會(huì)員登陸后都會(huì)建立會(huì)話或者Cookie,然后需要在會(huì)員退出時(shí)點(diǎn)退出連接或按紐退出。在會(huì)員直接關(guān)閉窗體的時(shí)候,沒(méi)有觸發(fā)涉及到退出的一系列退出。而這些要等到服務(wù)器會(huì)話過(guò)期才會(huì)被清除掉。
有幸的是在網(wǎng)絡(luò)上終于找到可以捕獲用戶使用Alt+F4、標(biāo)題欄按右鍵關(guān)閉、雙擊標(biāo)題欄、直接按關(guān)閉按鈕的事件的方法。當(dāng)然對(duì)于最小化到任務(wù)欄再進(jìn)行關(guān)閉是不能捕獲的。
需要說(shuō)明的,在onBeforeUnload中屏幕這些坐標(biāo)屬性都是正常數(shù)值。
screenLeft:獲取瀏覽器客戶區(qū)左上角相對(duì)于屏幕左上角的 x 坐標(biāo)。
screenTop:獲取瀏覽器客戶區(qū)左上角相對(duì)于屏幕左上角的 y 坐標(biāo)。
我猜測(cè),在窗體銷毀時(shí)捕獲的將產(chǎn)生一個(gè)特殊的數(shù)值。在正常情況下的點(diǎn)擊測(cè)試,數(shù)值都不會(huì)超過(guò)該數(shù)值。
現(xiàn)在問(wèn)題是,在onBeforeUnload中使用window.location可以正常地提交請(qǐng)求到指定URL,但在onUnload事件中該方法不能有效執(zhí)行。解決的方法是新開一個(gè)窗口,在將之關(guān)閉掉。
我們可以寫上這樣的話,來(lái)代替以往使用的,一系列的window.location。因?yàn)殚T戶網(wǎng)站涉及到多個(gè)跨服務(wù)器的網(wǎng)站服務(wù)器。在統(tǒng)一入口退出后,需要依次地進(jìn)行順序退出,才能達(dá)到門戶網(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)過(guò)測(cè)試,在onUnload里不要使用window.close,因?yàn)閷?duì)象銷毀前會(huì)立即觸發(fā)該事件。而onBeforeUnload是頁(yè)面將要被卸載前觸發(fā)的事件。
而所謂的清除實(shí)質(zhì)上就是把做好退出功能的頁(yè)面,直接以打開新窗口方式的調(diào)用。可能在調(diào)用到關(guān)閉的時(shí)候能停頓一兩秒,或者關(guān)閉窗口放在專門的退出頁(yè)面。該頁(yè)面與正常退出又切回到首頁(yè),不同的是退出后會(huì)自動(dòng)進(jìn)行關(guān)閉,不需要再另外進(jìn)行控制直接打開即可。
[注意]在window.onUnload中如果不加判斷,則會(huì)在刷新頁(yè)面等導(dǎo)致當(dāng)前頁(yè)面變化都會(huì)觸發(fā)該事件。因此必須要進(jìn)行判斷,捕捉特定的操作,才能屏蔽掉一些正常的操作。
續(xù):在IE中如何在用戶直接關(guān)閉窗口前清除Session
昨天曾經(jīng)講解了實(shí)現(xiàn)思路,但在實(shí)際操作中發(fā)現(xiàn),必須要加上延遲才能確保程序可以正常執(zhí)行完畢。下面附上實(shí)現(xiàn)的細(xì)節(jié),并附上簡(jiǎn)單的時(shí)間延遲函數(shù)。代碼已經(jīng)經(jīng)過(guò)測(cè)試。
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; //考慮進(jìn)時(shí)進(jìn)分進(jìn)秒的特殊情況
gaps=hourGaps*3600+ minuteGaps*60+ secondGaps;
gaps=gaps*1000+msGaps;
}while(gaps<milisecond);
}
</script>
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注