说明:目前三大主流浏览器中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+
示例:
< 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
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。代码会执行关闭窗口时的代码,但是窗口却只是刷新而已却不会关闭。
用法:
·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的表单的时候。
示例:
< 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>