(1)操作演示
同时2个窗口打开github.com
在其中一个窗口登录用户
另外一个窗口显示需要Reload
刷新窗口后
在一个窗口做登出处理,另外一个窗口也会提示需要Reload
(2)代码分析
浏览器右键查看源代码可以看到以下代码,其中"d-none"就是控制是否显示div的。
<div class="js-stale-session-flash stale-session-flash flash flash-warn flash-banner d-none"> <svg aria-hidden="true" class="octicon octicon-alert" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M8.865 1.52c-.18-.31-.51-.5-.87-.5s-.69.19-.87.5L.275 13.5c-.18.31-.18.69 0 1 .19.31.52.5.87.5h13.7c.36 0 .69-.19.86-.5.17-.31.18-.69.01-1L8.865 1.52zM8.995 13h-2v-2h2v2zm0-3h- 2V6h2v4z"/></svg> <span class="signed-in-tab-flash">You signed in with another tab or window. <a href="">Reload</a> to refresh your session.</span> <span class="signed-out-tab-flash">You signed out in another tab or window. <a href="">Reload</a> to refresh your session.</span> </div>
查看源代码可以看到页面总共引入了2个JavaScript文件:
<script crossorigin="anonymous" integrity="sha256-LrSxxxxx" src="https://assets-cdn.github.com/assets/frameworks-2ebxxxxx.js"></script> <script async="async" crossorigin="anonymous" integrity="sha256-izZxxxxx" src="https://assets-cdn.github.com/assets/github-8b3xxxxx.js"></script>
继续查看第二JavaScript文件并搜索"js-stale-session-flash",可以找到以下代码,可见是通过监听Storage数据变更StorageEvent事件后是否存在logged-in来判断的!
window.addEventListener("storage",function(e){if(e.storageArea===localStorage&&"logged-in"===e.key&&e.newValue!==a){a=e.newValue;var n=document.querySelector(".js-stale-session-flash");r["default"](n instanceof HTMLElement,"Flash element must exist and be an HTMLElement"),n.classList.toggle("is-signed-in","true"===a),n.classList.toggle("is-signed-out","false"===a),n.classList.remove("d-none"),
继续在第二JavaScript文件里搜索"logged-in",可以看到以下代码,可见根据head里<meta name="user-login" content="">的content的值来判断的,有值时为true。有值的情况下是: <meta name="user-login" content="rensanning">
!function(){var e=document.querySelector("meta[name=user-login]");if(e instanceof HTMLMetaElement){var n=e.content,a=String(!!n.length);try{localStorage.setItem("logged-in",a)}catch(i){return}
总结一下:监听LocalStorage的StorageEvent事件!
StackOverflow上也有相关的问题: https://stackoverflow.com/questions/39550656/how-does-github-detect-signing-in-out