从我对Web存储的(较差的)理解中,sessionStorage
对象是按选项卡维护的,它在页面重新加载和页面导航后仍然存在,并且在选项卡关闭或浏览器进程终止时被破坏。
有没有办法监听sessionStorage
销毁事件?
当选项卡或窗口关闭时,我需要执行HTTP调用,看来sessionStorage
是遵循相似生命周期的单个对象。
最佳答案
有没有办法监听sessionStorage destroy事件?
不,没有用于会话存储的“销毁”事件。
关闭选项卡或窗口时,我似乎需要执行HTTP调用,似乎sessionStorage是遵循相似生命周期的单个对象。
您无法区分页面重新加载和离开页面。
我唯一想到的就是要做到这一点:
在beforeunload
或unload
中,使用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/