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