各位大哥,请问一下使用 js 怎么判断用户关闭了浏览器, 我现在用的是 window.onbeforeunload,但是没办法区分 tab 页面关闭、刷新和浏览器关闭。 求教。
1
horizon 2021-09-15 09:22:23 +08:00
没办法
|
2
kop1989 2021-09-15 09:28:41 +08:00
不太理解区分页签关闭和浏览器 app 关闭的业务场景。
一个页签,就是一个浏览器进程。 |
3
v2byy 2021-09-15 09:30:04 +08:00 via iPhone
js run 在 render 进程里面的,感知不了 browser 进程吧
|
4
yunyuyuan 2021-09-15 09:32:55 +08:00 3
这个涉及了用户隐私吧。https://stackoverflow.com/questions/3888902/detect-browser-or-tab-closing 。
你可以用 sessionStorage,这个数据只持续到浏览器关闭 |
5
dzdh 2021-09-15 09:37:16 +08:00 2
ws 断开就关了
|
6
IceBay 2021-09-15 09:37:35 +08:00
每隔一段时间更新时间戳到 localStorage 进行对比?
|
7
MoeMoesakura 2021-09-15 09:41:16 +08:00
@dzdh 不能保证吧,要是用户合上了笔记本,进入睡眠模式,你怎么判断啊
|
8
FaiChou 2021-09-15 09:44:42 +08:00
还是说清楚下具体需求吧, 不然光从你的问题来看, 用户关闭了浏览器(tab), 进程(线程)都杀死了, js 肯定都被干掉了, 你的判断逻辑也不能正常运行.
|
9
aristolochic 2021-09-15 09:46:30 +08:00 1
瞧这问题问的,要是用户用一个软件的 WebView 打开你的网站,你难道还想去监听这个用户是关了你的页面还是关了整个软件? Web 怎么可能让你知道那么多,岂不是反了天了。现在浏览器标准都是安全越收越紧,是绝对不可能再出一个 API 告诉你浏览器关了的。
说白了对于 Web 而言,网站是不应该也不可能 Native aware 的,且不说 Tab 这些概念不是所有浏览器都有,比如有那种就一个页面的浏览器( surf 就是,在平铺窗口管理器生态有一定市场),还有那么多 WebView 也是没有标签的,更不可能让你了解到原生的情况。 浏览器插件 /扩展倒是可以知道标签的状态,具体能不能知道浏览器关没关就没了解过了。 要想完全控制,老老实实套 Electron 。 |
10
itechnology 2021-09-15 09:51:47 +08:00
我觉得是做不到的。浏览器不可能让你知道它是否被关闭了。
|
11
Rheinmetal 2021-09-15 09:55:13 +08:00 30
今天想知道关闭浏览器
明天想干什么我都不敢想了 :doge: |
12
fregie 2021-09-15 10:18:17 +08:00
runtime 都没了,你的代码都运行不了了,要怎么判断..
|
13
dzdh 2021-09-15 10:18:32 +08:00
@MoeMoesakura 跟关了 tab 有啥区别
|
14
mywaiting 2021-09-15 10:23:02 +08:00
想知道浏览器是否关闭,如果条件合适还是可以做到的
举个例子来说,稍有点互联网经验的同学都会装 ADBlock 插件,页面引入的 JS 检测一下 ADBlock 插件的 API 能否调用就能检测浏览器是否在关闭状态 不过这里面有个鸡先还是蛋先的问题,浏览器都关闭,还怎么页面引入 JS 来检测? 很尴尬对吧? |
15
sampeng 2021-09-15 10:29:03 +08:00
你是想浏览器关闭,弹出来:“你真的想关吗?不要关好吗”
|
16
cyrbuzz 2021-09-15 10:37:00 +08:00
道是有的,不过比较奇怪,要看用户是否接受。
昨天撸了一遍 Chrome 插件编写,其中有 tabs 权限与 window 权限(这个随便自己配)的插件,可以通过 tabs 的 onRemoved 和 window 的 onRemoved 事件监听到标签以及整个窗口的关闭,这样就可以感知到时 tab 的关闭还是窗口的关闭。 所以这个道可以是引导用户安装你的特定插件。 tabs remove https://developer.chrome.com/docs/extensions/reference/tabs/#method-remove window remove https://developer.chrome.com/docs/extensions/reference/windows/ 另外这种需求也比较好奇... |
17
TomatoYuyuko 2021-09-15 10:45:07 +08:00
如果你想做清除操作,一般是在进入页面初始化的时候做,而不是离开页面的时候做。类似的操作大多如此。
|
18
fkdtz 2021-09-15 10:54:08 +08:00 7
就像黄志诚和韩琛怎么知道陈永仁和刘建明有没有被发现甚至挂了?定期联系联系呗。
要是哪天联系不上了,八成是挂了。 |
20
lin07hui 2021-09-15 11:02:12 +08:00
tab 页面关闭和浏览器关闭 这也要区别?
刷新可以使用 sessionStorage 来做 |
21
Yvette 2021-09-15 11:07:48 +08:00
|
22
dfkjgklfdjg 2021-09-15 11:24:16 +08:00
单纯区分浏览器刷新和关闭页面就好了,关注是否关注了浏览器是什么鬼,和你没关系啊。
|
23
statement 2021-09-15 11:26:47 +08:00
遇到过相同需求 B 端产品可以解决 用 app 模式就行 C 端监测心跳不准确
|
24
wolfan 2021-09-15 11:27:45 +08:00
不如断定是否重新打开了浏览器。
而且像 edge 内置了休眠,长时间不活动页面会被主动休眠的。 |
25
yousabuk 2021-09-15 11:29:36 +08:00 via iPhone
你得像网银控件那么干
|
26
hanssx 2021-09-15 11:32:44 +08:00
websocket 心跳
|
27
shyling 2021-09-15 11:56:46 +08:00
每个页面连个 ws 。。全断了就当关浏览器了
|
28
GeruzoniAnsasu 2021-09-15 12:04:04 +08:00
大胆一点,快进到产品包一个有后门的浏览器
|
29
TomChaai 2021-09-15 12:24:35 +08:00
这个问题等效于“电脑怎么知道用户拔了电源”。
要么时刻后台刷新,长时间断开视作关闭,要么非正常 exit,下次再上线的时候处理 |
30
sha851092391 2021-09-15 12:36:58 +08:00
这个需求很简单吧,在 window.onbeforeunload 弹出对话框,询问用户 “请选择你关闭的原因:1 、标签页关闭; 2 、刷新; 3 、浏览器关闭; 4 、不告诉你”,这样实现还合法,完美~
|
31
SixGod66 2021-09-15 12:42:06 +08:00
js 设置没有过期时间的 cookie,在浏览器关闭时会自动清空。sessionStorage 在最新的 Chrome 中已经无法跨标签共享数据了
|
32
meiyoumingzi6 2021-09-15 13:25:12 +08:00
js 怎么感知电脑关闭了? 手动狗头
|
33
2i2Re2PLMaDnghL 2021-09-15 13:25:40 +08:00
信不信我把宇宙停了三十年再给你继续?没错,正好当你看到这句话的时候。
你怎么检测到宇宙停了? 外部可以内视,但内部不可外视 |
34
kisshere 2021-09-15 14:39:32 +08:00 via Android
ws,或者 Ajax 心跳,后端参与才行
|
35
Justin13 2021-09-15 14:50:41 +08:00 via Android
这要能区分出来,那不就是 bug 了么
|
36
afirefish 2021-09-15 15:03:21 +08:00
ws+心跳,断开了就是关闭了
|
37
qwerthhusn 2021-09-15 15:20:44 +08:00 2
死刑犯怎么判断自己还有没有被枪毙
|
38
WordlessEcho 2021-09-15 15:24:40 +08:00
我在前端写了一个删除撤销的功能(就是延迟几秒再删除),但是页面关闭了之后删除请求就发不出去了(
|
39
zhw2590582 2021-09-15 15:25:28 +08:00
我怎么判断我睡着了
|
40
ws52001 2021-09-15 15:59:53 +08:00
这个要求有点过分的。。
|
41
robinlovemaggie 2021-09-15 16:14:09 +08:00
你这我问题让我想起前两天有人问:人怎么知道死后有没有灵魂?
|
42
lakehylia 2021-09-15 16:23:00 +08:00
楚门怎么知道自己生活在虚拟的世界里?他自己是不知道的,只有世界之外的女主进来了,他才知道。
|
43
codehz 2021-09-15 16:29:03 +08:00 via Android
刷新还是可以做的
用 PerformanceNavigationTiming.type 判断即可 |
44
shellus 2021-09-15 17:26:12 +08:00
@zhw2590582 明天醒来你就知道了
|
45
StephenHe 2021-09-15 17:49:36 +08:00
又要强奸用户
|
46
cw2k13as 2021-09-15 17:56:24 +08:00
websocket
|
47
hengshenyu 2021-09-15 18:32:50 +08:00 1
好像很多人觉得不行啊?我觉得理论上还是有可行性的
1. 首先 onbeforeunload 这个接口在 tab 关闭时会触发 2. Navigator.sendBeacon()这个接口在浏览器关闭和 tab 关闭都会触发,没错:虽然不能告诉死人他死了,但是可以告诉他家人(即使浏览器关了也可以通知后端) 那么:在 1 没触发且 2 触发了,此时即为用户关闭了浏览器而不是关闭了标签页。 以上仅理论 |
48
o00o 2021-09-15 18:47:58 +08:00
|
49
SenLief 2021-09-15 18:55:46 +08:00
不能被动判断,但是可以主动吧,比如填表单的时候如果关闭或者刷新就会弹窗,这是如何实现的?
|
50
wangbenjun5 2021-09-15 20:17:47 +08:00
思路奇异啊,怎么判断用户关闭浏览器?假设有方法判断用户关闭浏览器,然后呢?是要阻止用户关闭浏览器吗?哈哈,幸亏 chrome 没有提供这个 API,不然流氓网站上了天
|
51
xuanbg 2021-09-15 20:22:28 +08:00
这就好比你自怎么知道自己死掉了一样。答案就是没办法知道。因为你都没有意识了啊
浏览器都关掉了,你一个运行在浏览器里面的 JS 代码,也就同时被关掉了,就算你知道了,也干不了啥事情。。。 |
52
jeeyong 2021-09-15 20:34:59 +08:00
以前我记得有个 window.close() 类似的事件?
那会用来做关闭页面后, 弹出广告.. |
53
yolee599 2021-09-15 20:48:41 +08:00 via Android
换一个说法,电脑怎么判断用户拔掉了主机电源?
|
54
44670 2021-09-15 20:57:51 +08:00
navigator.sendBeacon
试试这个 |
55
ipwx 2021-09-15 21:07:44 +08:00
@WordlessEcho 你这思路有问题,应该是延迟几秒再确认删除。。。
|
56
MrKrabs 2021-09-15 22:28:51 +08:00 1
人怎么判断自己死了
|
57
2i2Re2PLMaDnghL 2021-09-16 02:11:14 +08:00
@hengshenyu 1. beforeunload 在浏览器关闭时也会触发
2. sendBeacon 不是一个可供产生触发的接口,它是一个替代 XHR 和 fetch 的请求用接口。 @jeeyong 因为历史原因,window 是指标签页 @SenLief beforeunload 事件 |
58
liuidetmks 2021-09-16 06:34:55 +08:00 via iPhone
我专门在火狐中 关闭了 beforeunload 事件,
觉得弹出提示的网站好烦 |
59
gogolang 2021-09-16 08:54:58 +08:00
js 定时发送 http 请求,什么时候请求停了就是关闭浏览器了。
你看这样行不? |
60
luzemin 2021-09-16 09:01:58 +08:00
window.onbeforeunload 拦住弹个窗问用户,你是在关闭 Tab 还是关闭浏览器?(逃
|
61
meepo3927 2021-09-16 10:04:50 +08:00
tab 关闭和浏览器关闭, 区分不了。
而且浏览器窗口也是可以多开的, 你需要拿到程序进程才能判断。 |
62
systemcall 2021-09-16 10:43:56 +08:00
让用户换成 IE8 或者 IE6,之后用万能的 ActiveX,给用户装个驱动,你连用户关闭了哪个浏览器、关闭了浏览器之后再做什么都知道的一清二楚
|
63
MoeMoesakura 2021-09-16 18:14:46 +08:00
@dzdh 那个例子不贴切,举个无聊的例子:用户用一个丢包率极高的网络(长宽),ws 你怎么确定一直在线(((
|
64
dzdh 2021-09-16 18:22:34 +08:00
@MoeMoesakura 99%丢包的话那就认为这个用户不存在啊。难不成是付费聊天应用,按秒收费的。
|