在GitHub网站上打开多个选项卡/窗口时,如果您碰巧登录/退出其中一个,则会收到所有其他通知,促使您重新加载以刷新会话状态。
怎么做?
到目前为止,我所知道的是页面HTML代码包含一些隐藏的SVG图形+跨度,这些跨度通过JavaScript激活:
<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 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"></path></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>
Run Code Online (Sandbox Code Playgroud)
这是通过storageEvents完成的。
基本上,Storage接口在它影响的全局对象上发出storage事件。
本质上,在每次生成的GitHub页面加载中,GitHub都将meta标签设置为名称“ user-login”。该值将是当前登录的用户。
例如,如果我查看已在GitHub上加载的页面的源代码,则源代码包含以下行:
<meta name="user-login" content="timgws">
Run Code Online (Sandbox Code Playgroud)
然后,每次页面加载时,都会检索内容的值,并将其存储在LocalStorage中。大致来说,使用jQuery的代码是:
localStorage.setItem("logged-in", $("meta[name='user-login']").attr("content"));
Run Code Online (Sandbox Code Playgroud)
最后,最后一个魔术是监听storage事件,如果用户名已更改,则接听,然后切换flash类的可见性。
var currentUser = localStorage.getItem("logged-in");
window.addEventListener("storage", function (event) {
if (event.storageArea === localStorage && event.key === "logged-in"
&& event.newValue !== currentUser) {
$('.flash').removeClass('d-none');
}
});
Run Code Online (Sandbox Code Playgroud)
您可能想添加一些代码来区分登录和注销的用户(通过比较的值,这应该很容易currentUser)
| 归档时间: |
|
| 查看次数: |
1159 次 |
| 最近记录: |