I need to be able to identify what tab I am in within the browser. Isn\'t there some bit of information I can get from the browser to identify the tab? I don\'t need to kn
Since I don't have find no simple Javascript function as windows.currentTabIndex
, I have written some lines of Javascript to fix an ID on each browser tabs when they are loaded.
function defineTabID()
{
var iPageTabID = sessionStorage.getItem("tabID");
// if it is the first time that this page is loaded
if (iPageTabID == null)
{
var iLocalTabID = localStorage.getItem("tabID");
// if tabID is not yet defined in localStorage it is initialized to 1
// else tabId counter is increment by 1
var iPageTabID = (iLocalTabID == null) ? 1 : Number(iLocalTabID) + 1;
// new computed value are saved in localStorage and in sessionStorage
localStorage.setItem("tabID",iPageTabID);
sessionStorage.setItem("tabID",iPageTabID);
}
}
This code save last tab's index in localStorage
to update current value for new tabs and in sessionStorage
to fix page's id !
I must call defineTabId()
function in each pages of my application. Since I develop using a JSF templates, this is only defined in only one place :-)
One of the possible solutions is using "window.name" property, but I do not want to use it because somebody else can use it.
I found one more possible solution: using sessionStorage. It supported by FF3.5+, Chrome4+, Safari4+, Opera10.5+, and IE8+.
For anyone on here using React, I made a sneaky little hook:
import {useEffect, useMemo} from 'react'
import uniqid from 'uniqid'
export const TAB_ID_KEY = 'tabId'
export default () => {
const id = useMemo(uniqid, [])
useEffect(() => {
if (typeof Storage !== 'undefined') {
sessionStorage.setItem(TAB_ID_KEY, id)
}
}, [id])
return id
}
Put this on your base App/Page component, or somewhere that you know will always be mounted.
It'll run the effect after mounting and set a unique id for the current tab in session storage, which is storage specific to the tab.
Duplicating the tab will get you a new id for the new tab, since the component will mount again and the effect will run, overwriting the previous tab's id
You can not get tab id with javascript, how ever there is some solution that can help you with like using different session / cookies when user open new tab.
Some reference:
Get Browser Tab Index/Id
get urls of firefox tabs from firefox extension
How to differ sessions in browser-tabs?
Get a unique session in each browser tab
asp.net - session - multiple browser tabs - different sessions?
Here's a way to have the tabId
available after the page was loaded - having the same tabId
even after refresh.
This also solves the issue of duplicate tabs, as the tabId
is cleared from the sessionStorage
.
window.addEventListener("beforeunload", function (e)
{
window.sessionStorage.tabId = window.tabId;
return null;
});
window.addEventListener("load", function (e)
{
if (window.sessionStorage.tabId)
{
window.tabId = window.sessionStorage.tabId;
window.sessionStorage.removeItem("tabId");
}
else
{
window.tabId = Math.floor(Math.random() * 1000000);
}
return null;
});
Access the tabId
using window.tabId
.
The beforeunload
event is needed in order to persist the tabId
to have the same id available after refresh.
The load
event is needed to:
tabId
.tabId
after refresh - if exists.* I don't really know why I should do return null
or return at all. Just read that not returning may cause the function to not work :(
At least for chrome, there's an official answer since 2013: chrome.tabs API.