根据我对 Web 存储的(较差)理解,sessionStorage
对象是按选项卡维护的,它在页面重新加载和页面导航中仍然存在,并且在选项卡关闭或浏览器进程终止时被销毁。
有没有办法监听 sessionStorage
销毁事件?
我需要在关闭选项卡或窗口时执行 HTTP 调用,并且 sessionStorage
似乎是遵循类似生命周期的单个对象。
最佳答案
Is there a way to listen to the sessionStorage destroy event?
不, session 存储没有“销毁”事件。
I need to perform an HTTP call when the tab or window is being closed and it seems the sessionStorage is the single object which follow a similar lifecycle.
您无法区分页面重新加载和离开页面。
我能想到的唯一接近你想做的事情就是这样做:
- 在
卸载前
或卸载
中,使用sendBeacon
进行 HTTP 调用(必须是 POST)。您不能只使用标准 ajax (XMLHttpRequest
/fetch
),浏览器会在卸载事件中主动禁用标准 ajax。因此,如果有,请使用sendBeacon
,如果没有,则回退到标准(和 - 呃! - 同步)ajax 请求(这表明旧版浏览器可能仍然有效)。< - 在页面加载时,检查
sessionStorage
中的标记,然后:- 如果存在,请执行 ajax 调用,基本上说“没关系!”也就是说,如果服务器刚刚收到“我要离开页面”ajax 调用,它应该忽略它。
- 如果不存在,请设置标记。
您需要确保服务器能够处理以下可能性:由于网络请求的变化无常(特别是信标始终是异步的),服务器可能会乱序接收两个请求。因此,请在其中包含一些序列化信息(例如,来自 performance.now()
的值,必要时回退到 Date.now()
)。
或者,当然,在页面打开时使用轮询,并使用超时来指示用户已离开页面。权衡这些方法之间的权衡将会很有趣。 :-)
用户window.document (有趣的用户名!)points out您可以使用web sockets为了这。我没有太多使用网络套接字的经验(必须解决这个问题!),但我认为总体思路是,当用户离开页面或刷新时,您会看到套接字断开连接,但是(如上所述)如果是刷新,此后很快您就会再次看到套接字连接 - 这就像“没关系!”上面调用。
关于javascript - SessionStorage 销毁事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55863991/