如何用JS判断浏览器刷新还是关闭?

abcdef1111111 2010-04-17 09:09:04
 var currentKeyCode = -1;

function document.onkeydown() { // 本窗口的所有下属页面都必须含有本函数

top.currentKeyCode = event.keyCode;
}


function window.onbeforeunload() {

var sw = 0, s0 = "";
if (currentKeyCode == 116)
{
s0 += "刷新窗口!(F5)";
}
else
{
if ((event.altKey)&&(currentKeyCode == 115))
{
s0 += "关闭窗口!(alt+F4)"; sw = 1;
}
else
{
if ((event.clientX > 0)&&(event.clientX < document.body.clientWidth))
{
s0 += "刷新窗口!";
}
else
{
s0 += "关闭窗口!"; sw = 1;
}
}
}
if (sw == 1)
{
event.returnValue = "";
}
else
{
currentKeyCode = -1;
}
}
这是我从网上找的一段JS代码,用浏览器右上角的关闭按钮时好用,但在选项卡上关闭和在任务栏上关闭,这个方法就不作用了,我用的是IE8
...全文
4525 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenjian09150228 2012-09-11
  • 打赏
  • 举报
回复
11楼的,关闭 刷新都触发onbeforeunload事件
LcngYexue 2011-11-01
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 lcngyexue 的回复:]

我网上找的,原文是http://www.tedpavlic.com/post_detect_refresh_with_javascript.php

原文给了两个方法,方法一大致翻译如下,

对于大多数浏览器,表单隐藏域的值在浏览器刷新后仍被保留。所以可以给页面添加一个拥有默认值(本例中为空)的表单隐藏域,如果在pageload事件中此默认值未改变,则说明pageload事件不是被刷新触……
[/Quote]

这得刷新完成之后才能检测到。。
LcngYexue 2011-11-01
  • 打赏
  • 举报
回复
我网上找的,原文是http://www.tedpavlic.com/post_detect_refresh_with_javascript.php

原文给了两个方法,方法一大致翻译如下,

对于大多数浏览器,表单隐藏域的值在浏览器刷新后仍被保留。所以可以给页面添加一个拥有默认值(本例中为空)的表单隐藏域,如果在pageload事件中此默认值未改变,则说明pageload事件不是被刷新触发的,此时可以给这个表单隐藏域设置一个非默认值;若在pageload事件中此表单隐藏域的值被改变了(在非刷新页面导致的pageload事件中改变的),那么说明此时的pageload事件是被刷新触发的。
代码如下,
<html>
<head>

<script language="JavaScript"> <!--
function checkRefresh()
{
if( document.refreshForm.visited.value == "" )
{
// 非刷新,改变默认值
document.refreshForm.visited.value = "1";

// 非刷新情况下的其它应用逻辑
}
else
{
// 刷新页面导致下面代码的执行

// 刷新情况下的其它应用逻辑
}
} -->
</script>

</head>

<body onLoad="JavaScript:checkRefresh();">

<form name="refreshForm">
<input type="hidden" name="visited" value="" />
</form>

</body>
</html>

我没对代码进行测试,只是路过。。
zhenshangzhengren 2011-08-08
  • 打赏
  • 举报
回复
mark还不懂顶顶
zhangsuyunpk521 2010-10-31
  • 打赏
  • 举报
回复
function CloseOpen(event) {
if(event.clientX<=0 || event.clientY<0) {
//获取当前时间
var date=new Date();
//将date设置为过去的时间
alert("关闭网页");
date.setTime(date.getTime()-10000);
//将userId这个cookie删除
document.cookie="zhuangtao;expire="+date.toUTCString();
document.cookie="quanxianzifucuan;expire="+date.toUTCString();
document.cookie="quanxian;expire="+date.toUTCString();
s0 += "关闭窗口!"; sw = 1;
onbeforeunload();
// window.event.returnValue = '关闭浏览器将退出系统.';
}
else
{
alert("刷新或离开");
}
}

var currentKeyCode = -1;

function document.onkeydown() { // 本窗口的所有下属页面都必须含有本函数

top.currentKeyCode = event.keyCode;
}

function onbeforeunload(){

var sw = 0, s0 = "";
if (currentKeyCode == 116)
{
s0 += "刷新窗口!(F5)";
}
else
{
if ((event.altKey)&&(currentKeyCode == 115))
{
s0 += "关闭窗口!(alt+F4)"; sw = 1;
//获取当前时间
var date=new Date();
//将date设置为过去的时间
alert("关闭窗口");
date.setTime(date.getTime()-10000);
//将userId这个cookie删除
document.cookie="zhuangtao;expire="+date.toUTCString();
document.cookie="quanxianzifucuan;expire="+date.toUTCString();
document.cookie="quanxian;expire="+date.toUTCString();
}
else
{
if ((event.clientX > 0)&&(event.clientX < document.body.clientWidth))
{
s0 += "刷新窗口!";
}
else
{
//获取当前时间
var date=new Date();
//将date设置为过去的时间
alert("关闭网页");
date.setTime(date.getTime()-10000);
//将userId这个cookie删除
document.cookie="zhuangtao;expire="+date.toUTCString();
document.cookie="quanxianzifucuan;expire="+date.toUTCString();
document.cookie="quanxian;expire="+date.toUTCString();
s0 += "关闭窗口!"; sw = 1;
}
}
}
if (sw == 1)
{
event.returnValue = "";
}
else
{
currentKeyCode = -1;
}

}

cai0611 2010-10-26
  • 打赏
  • 举报
回复
不是选择卡上不可以,是关闭整个多标签浏览器不可以啊???
cai0611 2010-10-26
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 abcdef1111111 的回复:]
引用 18 楼 huminghua 的回复:
把&amp;&amp; 改成 ||
改了这个后,能判断在在选项卡上关闭了,呵呵
[/Quote]

我怎么不可以啊??
多标签关闭!!!
wanzyly123 2010-06-18
  • 打赏
  • 举报
回复
asdfasdfasdfasdf
abcdef1111111 2010-04-20
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 huminghua 的回复:]
把&& 改成 ||
[/Quote]改了这个后,能判断在在选项卡上关闭了,呵呵
abcdef1111111 2010-04-20
  • 打赏
  • 举报
回复

function CloseOpen(event) {
if(event.clientX<=0 || event.clientY<0) {
//获取当前时间
var date=new Date();
//将date设置为过去的时间
alert("关闭网页");
date.setTime(date.getTime()-10000);
//将userId这个cookie删除
document.cookie="zhuangtao;expire="+date.toUTCString();
document.cookie="quanxianzifucuan;expire="+date.toUTCString();
document.cookie="quanxian;expire="+date.toUTCString();
s0 += "关闭窗口!"; sw = 1;
onbeforeunload();
// window.event.returnValue = '关闭浏览器将退出系统.';
}
else
{
alert("刷新或离开");
}
}

var currentKeyCode = -1;

function document.onkeydown() { // 本窗口的所有下属页面都必须含有本函数

top.currentKeyCode = event.keyCode;
}

function onbeforeunload(){

var sw = 0, s0 = "";
if (currentKeyCode == 116)
{
s0 += "刷新窗口!(F5)";
}
else
{
if ((event.altKey)&&(currentKeyCode == 115))
{
s0 += "关闭窗口!(alt+F4)"; sw = 1;
//获取当前时间
var date=new Date();
//将date设置为过去的时间
alert("关闭窗口");
date.setTime(date.getTime()-10000);
//将userId这个cookie删除
document.cookie="zhuangtao;expire="+date.toUTCString();
document.cookie="quanxianzifucuan;expire="+date.toUTCString();
document.cookie="quanxian;expire="+date.toUTCString();
}
else
{
if ((event.clientX > 0)&&(event.clientX < document.body.clientWidth))
{
s0 += "刷新窗口!";
}
else
{
//获取当前时间
var date=new Date();
//将date设置为过去的时间
alert("关闭网页");
date.setTime(date.getTime()-10000);
//将userId这个cookie删除
document.cookie="zhuangtao;expire="+date.toUTCString();
document.cookie="quanxianzifucuan;expire="+date.toUTCString();
document.cookie="quanxian;expire="+date.toUTCString();
s0 += "关闭窗口!"; sw = 1;
}
}
}
if (sw == 1)
{
event.returnValue = "";
}
else
{
currentKeyCode = -1;
}

}

<body onunload="CloseOpen(event)" ></body></html>
我最后用的是这个,但还是没法判断在任务栏上直接关闭浏览器,结帖
abcdef1111111 2010-04-20
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 littleqiang520 的回复:]
js标签只有onload\onunload\onbeforeunload事件,而没有onclose事件。

不管页面是关闭还是刷新都会执行onunload事件。

如何捕捉到页面关闭呢?
页面加载时只执行onload
页面关闭时只执行onunload
页面刷新时先执行onbeforeunload,然后onunload,最后onload。

这样我们可以在onbeforeun……
[/Quote]这个刷新时也一样,没法用
黄_瓜 2010-04-20
  • 打赏
  • 举报
回复
onunload事件?
huminghua 2010-04-20
  • 打赏
  • 举报
回复
把&& 改成 ||
guguda2008 2010-04-20
  • 打赏
  • 举报
回复
关标签是UNLOAD,CLOSE是关进程才触发的
abcdef1111111 2010-04-17
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 littleqiang520 的回复:]
js标签只有onload\onunload\onbeforeunload事件,而没有onclose事件。

不管页面是关闭还是刷新都会执行onunload事件。

如何捕捉到页面关闭呢?
页面加载时只执行onload
页面关闭时只执行onunload
页面刷新时先执行onbeforeunload,然后onunload,最后onload。

这样我们可以在onbeforeun……
[/Quote]这方法我试过,不是很理想
healer_kx 2010-04-17
  • 打赏
  • 举报
回复
印象里这个问题确实没有好的解法,
阿非 2010-04-17
  • 打赏
  • 举报
回复
你还是换个思路吧

如果浏览器没有标签页 eg: IE6 那可以根据鼠标所在位置判断

但有标签页的就行不通了
liq1979 2010-04-17
  • 打赏
  • 举报
回复
js标签只有onload\onunload\onbeforeunload事件,而没有onclose事件。

不管页面是关闭还是刷新都会执行onunload事件。

如何捕捉到页面关闭呢?
页面加载时只执行onload
页面关闭时只执行onunload
页面刷新时先执行onbeforeunload,然后onunload,最后onload。

这样我们可以在onbeforeunload中加一个标记,在onunload中判断该标记,即可达到判断页面是否真的关闭了。

1、Js代码
1.window.onbeforeunload = function() {
2.
3.var n = window.event.screenX - window.screenLeft;
4.
5.var b = n > document.documentElement.scrollWidth-20;
6.
7.
8.if(b && window.event.clientY < 0 || window.event.altKey) {
9.
10.alert("是关闭而非刷新");
11.
12.window.open(this.location);
13.
14.
15.//return false;
16.
17.//window.event.returnValue = ""; }
18.
19.} else{
20.
21.alert("是刷新而非关闭");
22.
23.}
24.
25.}
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.open(this.location);


//return false;

//window.event.returnValue = ""; }

} else{

alert("是刷新而非关闭");

}

}


2、

Js代码
1.function promptOnClose(e){
2.
3.//e = e ? e : windowevent;
4.
5.var promptString = '你是否要离开此页面,离开该页面的信息将不被保存!';
6.
7.//event.returnValue = promptString;
8.
9.return promptString;
10.
11.}
12.
13.if (window != top){
14.
15.top.location.href = "www.baidu.com";
16.
17.}else{
18.
19.if (window.Event) {
20.
21. window.onbeforeunload = function(event) {
22.
23. return promptOnClose(event);
24.
25. }
26.
27.} else {
28.
29. window.onbeforeunload = function() {
30.
31. return promptOnClose(event);
32.
33. }
34.
35. }
36.
37.}
abcdef1111111 2010-04-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 fredrickhu 的回复:]
这个不懂 帮顶
[/Quote]谢谢F兄
--小F-- 2010-04-17
  • 打赏
  • 举报
回复
这个不懂 帮顶
加载更多回复(10)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧