Any way to identify browser tab in JavaScript?

后端 未结 9 552
孤独总比滥情好
孤独总比滥情好 2020-11-27 05:17

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

相关标签:
9条回答
  • 2020-11-27 05:38

    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 :-)

    0 讨论(0)
  • 2020-11-27 05:39

    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+.

    0 讨论(0)
  • 2020-11-27 05:41

    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

    0 讨论(0)
  • 2020-11-27 05:45

    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?

    0 讨论(0)
  • 2020-11-27 05:49

    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:

    1. Generate the initial tabId.
    2. Load the same 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 :(

    0 讨论(0)
  • 2020-11-27 05:51

    At least for chrome, there's an official answer since 2013: chrome.tabs API.

    0 讨论(0)
提交回复
热议问题