捕捉页面的关闭按钮,并执行退出函数
為了不讓使用者在沒有按下[登出]就關閉IE或者按下回上一頁離開系統造成使用者的登入資訊殘留,我們希望能藉由抓到使用者確實離開系統或者按下IE [X]的時候,來清除使用者的登入資訊。
這個功能我想好多人問過了,這邊我來貼一下怎麼做,先講講我們怎麼抓到使用者要離開目前的頁面呢?我們可以透過javascript的beforeonunload跟onunload事件:
print?按下OK的話就會回到上一頁,按下Cancel的話就會中止回上一頁的動作,而按下[X]要關閉這個視窗,也會出現同樣的訊息,不過這時候我們發現,當我按下F5時,這個訊息也會跳出耶,怎麼辦?總不能我刷新一下,就要我登出了吧?我們這時候可以這樣做:
print?print?print?01var isAltF4 = false; 02//用來判斷是否按下[X] 03var isXClose = false; 04window.onbeforeunload = bunload; 05??06function bunload() 07{ 08????if (event.clientY < 0 || isAltF4 ) 09????{ 10????????mess = "確定離開?"; 11????????//代表是真的按下[X] 12????????isXClose = true; 13????????return mess; 14????} 15} 16??17function document.onkeydown(){ 18????if ((window.event.altKey)&&(window.event.keyCode==115)) 19????{ 20????????isAltF4 = true; 21????????bunload(); 22????} 23????else24????{ 25????????isAltF4 = false; 26????} 27} 28??29//真的關閉時,要觸發logoutUser 30window.onunload = logoutUser; 31function logoutUser() 32{ 33????//多判斷是不是按下[X]關閉,是的話才做登出 34????if (isXClose) 35????{ 36?????????try37?????????{? 38?????????????var xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");? 39?????????????xmlhttp.open("POST","Logout.aspx", false); 40?????????????xmlhttp.send();? 41?????????????return true; 42?????????} 43?????????catch(e) 44?????????{ 45?????????????alert('delete user account error message:' + e.message); 46?????????} 47?????} 48}多抓onunload事件,並進行登出動作,這邊我用了一個變數isXClose來判斷是否按下[X],在這邊不使用if (event.clientY < 0 || isAltF4 )來判斷的原因是在這個事件中,抓到的event.clientY已經與bunload中不同了,無法使用這樣的做法,因此我就多做了一道功夫來完成。
這個範例可以work的重點在於beforeonunload事件與onunload這兩個事件的順序與觸發原則,我們在beforeonunload這個事件是視窗卸載前的事件,在這邊可以決定是否觸發onunload的視窗關閉事件,但在onunload的部分則已經無法限制視窗是否關閉,因為它已經開始關閉視窗了。