在浏览器的多个tab页中共享sessionStorage

来源:互联网 发布:雅虎域名管理 编辑:程序博客网 时间:2024/05/16 01:56

在浏览器中的多个tab页中共享数据,可以通过cookie或localStorage实现。 某些情况下,需要在浏览器关闭后即清除该数据,可以通过sessionStorage完成。 但sessionStorage仅保存在当前tab页中,想要在多个tab中共享该数据,可通过localStorage实现。

注册storage事件

当localStorage的值发生变化时,页面会监听到”stroage”事件:

  1. window.addEventListener("storage", function(event){

  2.  if(!event.newValue){

  3.    reutrn;

  4.  }

  5.  if(event.key == "getSession"){

  6.    localStorage.setItem("storeSessionData", sessionStorage.getItem("sessionValue"));

  7.    localStorage.removeItem("storeSessionData");

  8.  }

  9.  ...

  10. });

在该函数中,当 localStorage 中 key 为 getSession 的内容发生变化时会调用该函数,函数中有一个 event 对象,该event的属性 key 为 localStorage改变内容的key(这里为getSession) , 另一个属性 newValue 存储着 localStorage中key对应的内容 ,利用该方式可完成sessionStorage在tab间的共享

通过localStorage.setItem执行storage中的函数

在新打开的tab中,首先检查session的值是否存在,若不存在,则执行:

  1. if(!sessionStorage.getItem("sessionValue")){

  2.  localStorage.setItem("getSession", Date.now());

  3. }

编写storage事件函数

  1. window.addEventListener("storage", function(event){

  2.  ...

  3.  if(event.key == "getSession"){

  4.    localStorage.setItem("storeSessionData", sessionStorage.getItem("sessionValue"));

  5.    localStorage.removeItem("storeSessionData");

  6.  }

  7.  if(event.key == "storeSessionData"){

  8.    sessionStorage.setItem("sessionValue", event.newValue);

  9.    $("#session-data-panel").text("Session: " + sessionStorage.getItem("sessionValue"));

  10.    localStorage.removeItem("getSession");

  11.  }

  12.  ...

  13. });

新建tab页中执行localStorage.setItem("getSession", Date.now());会导致其他tab页进入第一个if,执行

  1. localStorage.setItem("storeSessionData", sessionStorage.getItem("sessionValue"));

  2. localStorage.removeItem("storeSessionData");

在其他tab执行完第一行代码后,会激活新打开的tab开始执行”storage”事件回调函数中的第二个if,执行sessionStorage.setItem,获取其他tab中sessionStorage存储的值(event.newValue)。 类似的,当某个tab中的sessionStorage的内容被修改时,同样可利用localStorage完成sessionStorage与其他tab的同步。

在线Demo(https://codepen.io/19920612/full/LLyqvP/) 

在Demo中可以看到,页面初始的session为空,点击按钮产生一个内容为随机数的session,再在新的页面中打开该地址,两个tab间的session内容是同步的。

示例代码:

  1. <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>

  2. <script type="text/javascript">

  3.  $().ready(function(){

  4.    if(!sessionStorage.getItem("sessionValue")){

  5.      localStorage.setItem("getSession", Date.now());

  6.    }else{

  7.      $("#session-data-panel").text("Session: " + sessionStorage.getItem("sessionValue"));

  8.    }

  9.    window.addEventListener("storage", function(event){

  10.      if(!event.newValue){

  11.        return ;

  12.      }

  13.      if(event.key == "getSession"){

  14.        localStorage.setItem("storeSessionData", sessionStorage.getItem("sessionValue"));

  15.        localStorage.removeItem("storeSessionData");

  16.      }

  17.      if(event.key == "storeSessionData"){

  18.        sessionStorage.setItem("sessionValue", event.newValue);

  19.        $("#session-data-panel").text("Session: " + sessionStorage.getItem("sessionValue"));

  20.        localStorage.removeItem("getSession");

  21.      }

  22.      if(event.key == "updateSession"){

  23.        sessionStorage.setItem("sessionValue", event.newValue);

  24.        $("#session-data-panel").text("Session: " + sessionStorage.getItem("sessionValue"));

  25.        localStorage.removeItem("updateSession");

  26.      }

  27.    });

  28.    $("#create-session-btn").click(function(){

  29.      var t = Math.random() * 100;            

  30.      sessionStorage.setItem("sessionValue", t);

  31.      $("#session-data-panel").text("Session: " + t);

  32.      localStorage.setItem("updateSession", t);

  33.    });

  34.  });

  35. </script>

  36. <body>

  37.  <div id="session-data-panel">Session: No Session</div>

  38.  <button id="create-session-btn">Click create a random session</button>

  39. </body>

作者:缪运泽 

原文:http://miaoyunze.com/2017/06/21/share-sessionData-between-tabs/


原创粉丝点击