SessionStorage销毁事件

时间:2019-04-26 08:48:19

标签: javascript

根据我对Web存储的(较差的)理解,sessionStorage对象是按选项卡维护的,它在页面重新加载和页面导航后仍然存在,并且在选项卡关闭或浏览器进程终止时被破坏。

是否有办法监听 sessionStorage销毁事件?
当选项卡或窗口关闭时,我似乎需要执行HTTP调用,看来sessionStorage是遵循相似生命周期的单个对象。

1 个答案:

答案 0 :(得分:3)

  

有没有办法监听sessionStorage destroy事件?

否,没有用于会话存储的“销毁”事件。

  

当选项卡或窗口关闭时,我需要执行HTTP调用,似乎sessionStorage是遵循相似生命周期的单个对象。

您无法区分页面重新加载和离开页面。

我唯一想到的就是要做到这一点:

  1. beforeunloadunload中,使用sendBeacon进行HTTP调用(必须是POST)。您不能只使用标准ajax(XMLHttpRequest / fetch),浏览器会在卸载事件中积极禁用标准ajax。因此,请使用sendBeacon(如果存在),如果不存在,则回退到标准(并且ugh!–同步)的ajax请求(这表明它仍然可以使用旧版本的浏览器)。
  2. 在页面加载时,检查sessionStorage中是否有标记,然后:
    • 如果存在,则进行ajax调用,基本上说“没关系!”说如果服务器刚刚收到“我要离开页面” ajax调用,则应忽略它。
    • 如果不存在,请设置标记。

您需要确保服务器处理以下可能性:由于网络请求的多变(尤其是信标始终是异步的),服务器可能会无序地接收这两个请求。因此,请在其中包含一些序列化信息(例如,performance.now()中的值,如有必要,可以回退到Date.now())。

或者,当然,在打开页面并使用超时指示用户离开页面时使用轮询。方法之间的权衡将很有趣。 :-)


用户window.document(有趣的用户名!)points out,您可能可以使用web sockets。我没有太多使用网络套接字的经验(必须解决!),但我认为一般的想法是,当用户离开页面或刷新时,您会看到套接字断开连接,但是(如上)如果刷新,此后不久您将再次看到套接字连接-就像“没关系!”打电话过来。