1. 程式人生 > >關於監控視窗是否關閉的onbeforeunload與onunload事件

關於監控視窗是否關閉的onbeforeunload與onunload事件

Onunload,onbeforeunload都是在重新整理或關閉時呼叫,可以在<script>指令碼中通過 window.onunload來指定或者在<body>裡指定。區別在於onbeforeunload在onunload之前執行,它還可 以阻止onunload的執行。   Onbeforeunload也是在頁面重新整理或關閉時呼叫,Onbeforeunload是正要去伺服器讀 取新的頁面時呼叫,此時還沒開始讀取;而onunload則已經從伺服器上讀到了需要載入的新的頁面,在即將替換掉當前頁面時呼叫。Onunload是無 法阻止頁面的更新和關閉的。而 Onbeforeunload 可以做到。
1、onbeforeunload事件:
  說明:目前三大主流瀏覽器中firefox和IE都支援onbeforeunload事件,opera尚未支援。
用法:
·object.onbeforeunload = handler 
·<element onbeforeunload = “handler” … ></element> 
描述:
事件觸發的時候彈出一個有確定和取消的對話方塊,確定則離開頁面,取消則繼續待在本頁。handler可以設一個返回值作為該對話方塊的顯示文字。
  觸發於:
  ·關閉瀏覽器視窗 
  ·通過位址列或收藏夾前往其他頁面的時候 
  ·點選返回,前進,重新整理,主頁其中一個的時候 
  ·點選 一個前往其他頁面的url連線的時候 
  ·呼叫以下任意一個事件的時候:click,document write,document open,document close,window close ,window navigate ,window NavigateAndFind,location replace,location reload,form submit. 
  ·當用window open開啟一個頁面,並把本頁的window的名字傳給要開啟的頁面的時候。 
  ·重新賦予location.href的值的時候。 
  ·通過input type=”submit”按鈕提交一個具有指定action的表單的時候。 
  可以用在以下元素:
  ·BODY, FRAMESET, window
  平臺支援:
  IE4+/Win, Mozilla 1.7a+, Netscape 7.2+, Firefox0.9+ 
  示例: 複製程式碼 <html xmlns=""><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"/><title>onbeforeunload測試</title><script>function checkLeave(){
      event.returnValue
="確定離開當前頁面嗎?";
}
</script></head><body onbeforeunload="checkLeave()"></body></html> 複製程式碼

但是onbeforeunload有個小毛病,就是頁面重新整理時,他還是會呼叫到onbeforeunload,為什麼?其實重新整理就相當於關閉了這個IE再重新開啟的意思,因此還是會呼叫到onbeforeunload。

 究竟怎麼解決重新整理不呼叫onbeforeunload呢?

 網上提供很多方法,本人覺得最實用還是以下這段JS

複製程式碼 window.onbeforeunload   =function(){   
      
var   n   =   window.event.screenX   -   window.screenLeft;   
      
var   b   =   n   >   document.documentElement.scrollWidth-20;   
      
if(b   &&   window.event.clientY   <0||   window.event.altKey)   
      {   
          alert(
"是關閉而非重新整理");   
          window.event.returnValue   
="是否關閉?";
      }
else{
             alert(
"是重新整理而非關閉");   
     }   
}
複製程式碼

解釋

其實這段程式碼主要是用於聊天室視窗的,一般的聊天室視窗是除了標題欄和側滑欄,其餘的XX欄都沒有的。用javascript彈出一個這樣的視窗的程式碼是: 
<script language="JavaScript"> 
window.open('欲載入的網頁的地址','_blank','width=視窗寬,height=視窗高,menubar=no,toolbar=no,directories=no,location=no,status=no,resizable=no,scrollbars=yes'); 
</script> 
其中值為“no”的就是不要的XX欄。 

這段程式碼中有幾個屬性值得說明一下: 
1.window.onbeforeunload():此方法被觸發於: 
關閉瀏覽器視窗 
通過位址列或收藏夾前往其他頁面的時候 
點選返回,前進,重新整理,主頁其中一個的時候 
點選 一個前往其他頁面的url連線的時候 

如果是用於上面我提到的聊天室視窗,那就只考慮兩個事件四個方法: 
1、正常關閉:點選關閉按鈕(右上角,這個按鈕的大小和程式碼中那個“-20”有關,最後我會說到);或者 按下ALT+F4鍵(所以程式碼中有對ALT鍵的檢測)。 
2、正常重新整理:按下F5鍵;或者 通過右鍵重新整理。 

2. 
window.event.screenX:滑鼠相對於使用者螢幕的水平位置 
window.screenLeft:視窗左上角相對於螢幕左上角的水平位置 
window.event.clientY:滑鼠在視窗客戶區域(除去所有的XX欄)中的Y座標(比如在標題欄上時,該值為負值) 
window.event.altKey:當alt鍵按下時,值為 TRUE ,否則為 FALSE 。只讀。 
document.documentElement.scrollWidth:視窗網頁正文全文寬 

所以 
n = window.event.screenX - window.screenLeft: 
求出滑鼠在當前視窗上的水平位置(參照:當前視窗左上角為0、0座標)。 

b = n > document.documentElement.scrollWidth-20: 
只看水平座標:滑鼠在當前視窗內時,n<m,b為false;滑鼠在當前視窗外時,n>m,b為true。20這個值是指關閉按鈕的寬度。 m=document.documentElement.scrollWidth-20 

window.event.clientY < 0: 
只看垂直座標:滑鼠在客戶區內時,y>0,x為false;滑鼠在客戶區外時,y<0,x為true。y=window.event.clientY


綜上: 
當onbeforeunload時間發生時,有ALT按下,或者滑鼠的位置在標題欄的最右上角(滑鼠停留在關閉按鈕上時)。就能執行if為真的語句了。 

window.event.returnValue = ""; 主要是用來當用戶關閉了視窗而不是重新整理時返回一個值,這個值由你設定。

注意:
這個程式碼看似不錯,但是有一點,它的基礎是以使用者的瀏覽器視窗為標準windows視窗而定的。也就是說,使用者的瀏覽器視窗得是win2000那個樣子的,因為這個樣子下,關閉按鈕的大小才會在 20 象素以內。如果使用者的視窗不是標準的windows視窗,而是其它的主題等等,這段程式碼可能就用不了了!
此外有個小BUG,當滑鼠停留在最右上角(關閉按鈕)時按下F5。程式碼會執行關閉視窗時的程式碼,但是視窗卻只是重新整理而已卻不會關閉。
2、onunload事件
用法:
·object.onbeforeunload = handler 
·<element onbeforeunload = "handler"></element>
  描述:
當用戶關閉一個頁面時觸發 onunload 事件。
  觸發於:
·關閉瀏覽器視窗 
·通過位址列或收藏夾前往其他頁面的時候 
·點選返回,前進,重新整理,主頁其中一個的時候 
·點選 一個前往其他頁面的url連線的時候 
·呼叫以下任意一個事件的時候:click,document write,document open,document close,window close ,window navigate ,window NavigateAndFind,location replace,location reload,form submit. 
·當用window open開啟一個頁面,並把本頁的window的名字傳給要開啟的頁面的時候。 
·重新賦予location.href的值的時候。 
·通過input type=”submit”按鈕提交一個具有指定action的表單的時候。 

  示例:

複製程式碼 <html xmlns=""><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"/><title>onunload測試</title><script>  function checkLeave(){
    alert("歡迎下次再來!");
  }
</script></head><body onunload="checkLeave()"></body></html> 複製程式碼

相關推薦

關於監控視窗是否關閉onbeforeunloadonunload事件

Onunload,onbeforeunload都是在重新整理或關閉時呼叫,可以在<script>指令碼中通過 window.onunload來指定或者在<body>裡指定。區別在於onbeforeunload在onunload之前執行,它還可 以阻

用js判斷頁面重新整理或關閉的方法(onbeforeunloadonunload事件)

Onunload,onbeforeunload都是在重新整理或關閉時呼叫,可以在<script>指令碼中通過window.onunload來指定或者在<body>裡指定。區別在於onbeforeunload在onunload之前執行,它還可以阻止on

onbeforeunloadonunload事件

Onunload,onbeforeunload都是在重新整理或關閉時呼叫,可以在<script>指令碼中通過 window.onunload來指定或者在<body>裡指定。區別在於onbeforeunload在onunload之前執行,它還可 以阻止onunload的執行。   On

獲取頁面離開onbeforeunloadonunload事件的返回值

在各種專案開發的過程中,頁面離開事件onbeforeunload是我們經常要用到的,可以避免使用者操作失誤,給使用者一個選擇的機會,就比如我們常常用到的編輯器中。如果使用者選擇了離開,那麼onunload或者onbeforeunload事件自然會觸發;但若使用者選擇了取消,又該如何檢測呢? 我們假定一個

關閉瀏覽器事件 onbeforeunloadonunload

onu 點擊 替換 接口 文字 代碼 com ajax 表單   在做畢設的時候,需要在關閉瀏覽器的時候向後臺服務器修改用戶在線狀態。首先講一下 onbeforeunload 和 onunload(都是在刷新或關閉時調用) 的區別: (1)onbeforeunload:在

視窗關閉時觸發子視窗關閉事件 wpf使用者控制元件的關閉事件 wpf usercontrol 釋放時觸發關閉事件

/// <summary> /// 關閉視窗事件 /// </summary> /// <param name="sender"></param> /// <

JS 監控頁面重新整理,關閉 事件的方法

onbeforeunload與onunload事件Onunload,onbeforeunload都是在重新整理或關閉時呼叫,可以在指令碼中通過window.onunload來指定或者在裡指定。區別在於onbeforeunload在onunload之前執行,它還可

捕捉視窗右上角關閉按鈕關閉事件

實現原理: 通過獲取事件源位置,判斷是否為右上角關閉按鈕觸發,從而區分關閉視窗和頁面重新整理動作 程式碼如下: window.onbeforeunload = function(){ var n = window.event.screenX - window.scr

Java 設定視窗系統關閉按鈕的事件響應

問題:       一般窗體的系統關閉         this.ctime.run();按鈕是預設不響應,點選關閉了之後,窗體只是隱藏,並沒有關閉       想要窗體真正關閉,就需要新增WindowListener事件響應,這樣的程式碼會顯得繁雜,測試程式碼的時候也很繁瑣

服務器性能調優(netstat監控大量ESTABLISHED連接Time_Wait連接問題)

r報錯 nginx vim 個數字 syn攻擊 並發 tco dir XML netstat監控大量ESTABLISHED連接與Time_Wait連接問題 問題描述: 在不考慮系統負載、CPU、內存等情況下,netstat監控大量ESTABLISHED連接與Tim

運維監控大數據的提取分析

monitor 運維監控 本文內容整理來自【敏捷運維大講堂】蔣君偉老師的線上直播分享。分別從以下3個維度來分享:1、雲時代監控分析的窘境;2、使用標簽標記監控數據的維度;3、監控數據應用場景。雲時代監控分析的窘境在虛擬化與容器技術廣泛應用的情況下,運維對象大規模地增長,監控平臺每天存儲的指標都以億計,

JavaScript觸摸手勢事件

media -o id3 tab view 集合 pad chm 訪問 處理Touch事件能讓你跟蹤用戶的每一根手指的位置。你可以綁定以下四種Touch事件: 1.touchstart: // 手指放到屏幕上的時候觸發 2.touchmove: /

總結oninput、onchangeonpropertychange事件的使用方法和差別

mon static 也會 npr listen 綁定 firefox pan tracking 前端頁面開發的非常多情況下都須要實時監聽文本框輸入,比方騰訊微博編寫140字的微博時輸入框hu9i動態顯示還能夠輸入的字數。過去一般都使用onchange/onke

bug-3——onload,onbeforeunloadOnunload的區別

即將 是不是 for load 加載 你是 簡單 onload window window.onload事件設置頁面加載時執行的動作,即進入頁面的時候執行的動作。 window.onunload已經從服務器上讀到了需要加載的新的頁面,在即將替換掉當前頁面時調用 一般用於

layer點擊確定關閉彈出層事件

.get 關閉 name 彈出層 close 事件 彈出 parent nbsp var index=parent.layer.getFrameIndex(window.name); parent.layer.close(index); parent.layer.c

js click onclick 事件綁定解綁

賦值 event blog 標簽 style button 代碼 .net element click 與 onclick 1.onclick 事件會在對象被點擊時發生。 <input id="btn1" type="button" onclick="test(

移動端web,tapclick事件

document 解決 取消 list 所有 ons scrip 還要 時間 一、tap與click的區別 兩者都會在點擊時系統自動觸發,但是在手機WEB端,click會有 200~300 ms。延遲來自判斷雙擊和長按,因為只有默認等待時間結束以確定沒有後續動作發生時,才

jquery論callback事件發生並列事件發生的區別

區別 隱藏 ide 發生 click call .com doctype charset 不用callback: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> &l

監控瀏覽器的前進後退---window.onpopstate事件

spa false 指定 史記 ace 條目 scrip dex 方法 有時候,由於業務需求,需要監聽用戶的後退行為,比如禁止用戶後退,比如想在用戶後退是給鏈接加上參數,這該怎麽辦呢?window對象的popstate事件就派上用場了 每當處於激活狀態的歷史記錄條目發生變化

a標簽的hrefclick事件

void 跳轉 javascrip 返回 置頂 onclick str script 可能 <a href=‘index.html‘ onclick=‘index()‘ >鏈接</a> a標簽中如果同時存在href和onclick時,以上的寫法,on