背景是沒有辦法直接捕獲到的,不過可以通過在頁面中加入以下腳本讓浏覽器關閉時觸發一次送出
<script>
window.οnunlοad=function(){
if(event.clientX>document.body.clientWidth && event.clientY < 0 || event.altKey) //如果是關閉浏覽器而不是重新整理頁面
__doPostBack('closing',''); //觸發一次送出
}
</script>
然後即可在背景此動作進行捕獲
protected void Page_Load(object sender, EventArgs e)
{
if (Request["__EVENTTARGET"] == "closing")
{
...最後的處理...
Response.End(); //因為是最後的處理,不需要頁面輸出,是以執行到這裡就可以了
}
...原有的正常代碼...
}
有些情況下,頁面不會自動生成__doPostBack函數即其相關控件(如:頁面上隻有Button控件時),可以在頁面上手工添加以下代碼:
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['form1'];
if (!theForm) {
theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
//]]>
</script>
以上方法對于使用者通過任務管理器中止IE程序之類的“狠招”沒有任務辦法...
另外還有個缺點:
1.隻有在使用者關閉浏覽器時才會觸發,如果是頁面跳轉就捕獲不到了
2.當然也可以把那個腳本改成
<script>
window.οnunlοad=function()
</script>
這樣,不管如果都會觸發送出,但是問題更大,因為即使是使用者進行正常的頁面送出,比如點選頁面上的某個按鈕也會觸發這個事件!
3.解決辦法是使用UpdatePanel,這樣普通的送出是不會重新整理頁面的,也就不會觸發window.onunload事件了。但是還有一個問題,就是當第一次頁面發生跳轉時(不管是背景控制還是前面使用者操作的)都會使頁面變成一個空白頁面。因為那個腳本強制讓頁面重新整理了一下,導緻跳轉失效,而背景捕獲到了closing參數,處理完後終止了輸出,導緻頁面變成了空白頁。
4.也有辦法解決背景控制的跳轉問題,前是前台使用者修改位址欄這樣的跳轉就沒有辦法了,不想細寫了,反正我沒找到一個完美的解決辦法。
PS:以上方法還有一個惡心的用途,把背景的那句"Response.End();"去掉後,就可以讓使用者永遠離開你的頁面(包括修改位址欄和點選收藏夾等),除非關閉浏覽器
另外再提供一個解決的思路,可以較好的實作頁面關閉或頁面跳轉後的處理,但是實作起來相對麻煩些。就是用ajax做“心跳”:當使用者打開你的頁面時,儲存一個對應的時間戳以及頁面關閉後要做的進行中用到的相關資訊。在頁面中加入一個時間觸發器,每過一段時間(比如8秒)就用ajax送出一次,重新整理使用者對應的時間戳。(也可以在global的sessionstart中進行時間戳的建立,并用sessionid作為辨別進行重新整理,這樣可以不局限于一個頁面,做到僅當使用者關閉所有打開你的站點的視窗之後才觸發,靈活性非常高)另外用一個線程,每過一段時間去檢查這個儲存的時間戳(比如20秒),如果發現每個時間戳和系統目前時間相差大于等于閥值(比如20秒)即認定使用者關閉了浏覽器或跳轉到别的頁面了,然後就可以進行你要的處理了。