4

js 怎么判断用户关闭了浏览器

 3 years ago
source link: https://www.v2ex.com/t/801913
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
js 怎么判断用户关闭了浏览器

V2EX  ›  JavaScript

js 怎么判断用户关闭了浏览器

  aizya · 9 小时 46 分钟前 · 4257 次点击

各位大哥,请问一下使用 js 怎么判断用户关闭了浏览器, 我现在用的是 window.onbeforeunload,但是没办法区分 tab 页面关闭、刷新和浏览器关闭。 求教。

49 条回复    2021-09-15 18:55:46 +08:00

horizon

horizon   9 小时 43 分钟前

kop1989

kop1989   9 小时 37 分钟前

不太理解区分页签关闭和浏览器 app 关闭的业务场景。
一个页签,就是一个浏览器进程。

v2byy

v2byy   9 小时 36 分钟前 via iPhone

js run 在 render 进程里面的,感知不了 browser 进程吧

dzdh

dzdh   9 小时 28 分钟前

ws 断开就关了

IceBay

IceBay   9 小时 28 分钟前

每隔一段时间更新时间戳到 localStorage 进行对比?

MoeMoesakura

MoeMoesakura   9 小时 24 分钟前

@dzdh 不能保证吧,要是用户合上了笔记本,进入睡眠模式,你怎么判断啊

FaiChou

FaiChou   9 小时 21 分钟前

还是说清楚下具体需求吧, 不然光从你的问题来看, 用户关闭了浏览器(tab), 进程(线程)都杀死了, js 肯定都被干掉了, 你的判断逻辑也不能正常运行.

aristolochic

aristolochic   9 小时 19 分钟前

瞧这问题问的,要是用户用一个软件的 WebView 打开你的网站,你难道还想去监听这个用户是关了你的页面还是关了整个软件? Web 怎么可能让你知道那么多,岂不是反了天了。现在浏览器标准都是安全越收越紧,是绝对不可能再出一个 API 告诉你浏览器关了的。

说白了对于 Web 而言,网站是不应该也不可能 Native aware 的,且不说 Tab 这些概念不是所有浏览器都有,比如有那种就一个页面的浏览器( surf 就是,在平铺窗口管理器生态有一定市场),还有那么多 WebView 也是没有标签的,更不可能让你了解到原生的情况。

浏览器插件 /扩展倒是可以知道标签的状态,具体能不能知道浏览器关没关就没了解过了。

要想完全控制,老老实实套 Electron 。

itechnology

itechnology   9 小时 14 分钟前

我觉得是做不到的。浏览器不可能让你知道它是否被关闭了。

Rheinmetal

Rheinmetal   9 小时 11 分钟前   ❤️ 16

今天想知道关闭浏览器
明天想干什么我都不敢想了
:doge:

fregie

fregie   8 小时 47 分钟前

runtime 都没了,你的代码都运行不了了,要怎么判断..

dzdh

dzdh   8 小时 47 分钟前

@MoeMoesakura 跟关了 tab 有啥区别

mywaiting

mywaiting   8 小时 43 分钟前

想知道浏览器是否关闭,如果条件合适还是可以做到的

举个例子来说,稍有点互联网经验的同学都会装 ADBlock 插件,页面引入的 JS 检测一下 ADBlock 插件的 API 能否调用就能检测浏览器是否在关闭状态

不过这里面有个鸡先还是蛋先的问题,浏览器都关闭,还怎么页面引入 JS 来检测?

很尴尬对吧?

sampeng

sampeng   8 小时 37 分钟前

你是想浏览器关闭,弹出来:“你真的想关吗?不要关好吗”

cyrbuzz

cyrbuzz   8 小时 29 分钟前

道是有的,不过比较奇怪,要看用户是否接受。

昨天撸了一遍 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/

另外这种需求也比较好奇...

TomatoYuyuko

TomatoYuyuko   8 小时 21 分钟前

如果你想做清除操作,一般是在进入页面初始化的时候做,而不是离开页面的时候做。类似的操作大多如此。

fkdtz

fkdtz   8 小时 12 分钟前   ❤️ 3

就像黄志诚和韩琛怎么知道陈永仁和刘建明有没有被发现甚至挂了?定期联系联系呗。

要是哪天联系不上了,八成是挂了。

dunn

dunn   8 小时 9 分钟前 via iPhone

@sampeng 请选择 再看一会 残忍关闭

lin07hui

lin07hui   8 小时 4 分钟前

tab 页面关闭和浏览器关闭 这也要区别?
刷新可以使用 sessionStorage 来做

dfkjgklfdjg

dfkjgklfdjg   7 小时 41 分钟前

单纯区分浏览器刷新和关闭页面就好了,关注是否关注了浏览器是什么鬼,和你没关系啊。

statement

statement   7 小时 39 分钟前

遇到过相同需求 B 端产品可以解决 用 app 模式就行 C 端监测心跳不准确

wolfan

wolfan   7 小时 38 分钟前

不如断定是否重新打开了浏览器。
而且像 edge 内置了休眠,长时间不活动页面会被主动休眠的。

yousabuk

yousabuk   7 小时 36 分钟前 via iPhone

你得像网银控件那么干

hanssx

hanssx   7 小时 33 分钟前

websocket 心跳

shyling

shyling   7 小时 9 分钟前

每个页面连个 ws 。。全断了就当关浏览器了

GeruzoniAnsasu

GeruzoniAnsasu   7 小时 2 分钟前

大胆一点,快进到产品包一个有后门的浏览器

TomChaai

TomChaai   6 小时 41 分钟前

这个问题等效于“电脑怎么知道用户拔了电源”。
要么时刻后台刷新,长时间断开视作关闭,要么非正常 exit,下次再上线的时候处理

sha851092391

sha851092391   6 小时 29 分钟前

这个需求很简单吧,在 window.onbeforeunload 弹出对话框,询问用户 “请选择你关闭的原因:1 、标签页关闭; 2 、刷新; 3 、浏览器关闭; 4 、不告诉你”,这样实现还合法,完美~

SixGod66

SixGod66   6 小时 24 分钟前

js 设置没有过期时间的 cookie,在浏览器关闭时会自动清空。sessionStorage 在最新的 Chrome 中已经无法跨标签共享数据了

meiyoumingzi6

meiyoumingzi6   5 小时 41 分钟前

js 怎么感知电脑关闭了? 手动狗头

2i2Re2PLMaDnghL

2i2Re2PLMaDnghL   5 小时 40 分钟前

信不信我把宇宙停了三十年再给你继续?没错,正好当你看到这句话的时候。
你怎么检测到宇宙停了?
外部可以内视,但内部不可外视

kisshere

kisshere   4 小时 26 分钟前 via Android

ws,或者 Ajax 心跳,后端参与才行

Justin13

Justin13   4 小时 15 分钟前 via Android

这要能区分出来,那不就是 bug 了么

afirefish

afirefish   4 小时 2 分钟前

ws+心跳,断开了就是关闭了

qwerthhusn

qwerthhusn   3 小时 45 分钟前

死刑犯怎么判断自己还有没有被枪毙

WordlessEcho

WordlessEcho   3 小时 41 分钟前

我在前端写了一个删除撤销的功能(就是延迟几秒再删除),但是页面关闭了之后删除请求就发不出去了(

zhw2590582

zhw2590582   3 小时 40 分钟前

我怎么判断我睡着了

ws52001

ws52001   3 小时 6 分钟前

这个要求有点过分的。。

robinlovemaggie

robinlovemaggie   2 小时 52 分钟前

你这我问题让我想起前两天有人问:人怎么知道死后有没有灵魂?

lakehylialakehylia   2 小时 43 分钟前

楚门怎么知道自己生活在虚拟的世界里?他自己是不知道的,只有世界之外的女主进来了,他才知道。

codehz

codehz   2 小时 37 分钟前 via Android

刷新还是可以做的
用 PerformanceNavigationTiming.type 判断即可

shellus

shellus   1 小时 40 分钟前

@zhw2590582 明天醒来你就知道了

StephenHe

StephenHe   1 小时 16 分钟前

又要强奸用户

cw2k13as

cw2k13as   1 小时 9 分钟前

websocket

hengshenyu

hengshenyu   33 分钟前

好像很多人觉得不行啊?我觉得理论上还是有可行性的
1. 首先 onbeforeunload 这个接口在 tab 关闭时会触发
2. Navigator.sendBeacon()这个接口在浏览器关闭和 tab 关闭都会触发,没错:虽然不能告诉死人他死了,但是可以告诉他家人(即使浏览器关了也可以通知后端)

那么:在 1 没触发且 2 触发了,此时即为用户关闭了浏览器而不是关闭了标签页。

以上仅理论

SenLief

SenLief   10 分钟前

不能被动判断,但是可以主动吧,比如填表单的时候如果关闭或者刷新就会弹窗,这是如何实现的?

关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2673 人在线   最高记录 5497   ·  

创意工作者们的社区

World is powered by solitude

VERSION: 3.9.8.5 · 22ms · UTC 11:06 · PVG 19:06 · LAX 04:06 · JFK 07:06
♥ Do have faith in what you're doing.


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK