关于监控窗口是否关闭的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 = " http://www.w3.org/1999/xhtml " >
< 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 = " http://www.w3.org/1999/xhtml " >
< 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>
复制代码


你可能感兴趣的:(js,窗口关闭事件)