有没有办法识别JavaScript中的浏览器标签?

use*_*877 35 javascript browser tabs uniqueidentifier

我需要能够识别我在浏览器中的标签.我是否可以通过浏览器获取一些信息来识别标签?我不需要知道任何其他选项卡,我只需要我所在选项卡的ID.它可以是随机或顺序编号,或日期时间戳,只要它保持相同的标签的生命.

我有一个客户端应用程序,通过HTTP连接到远程服务器,如果我在多个选项卡中打开它,每个实例需要自己唯一的ID或应用程序失败,所以我只需要一些与之关联的唯一编号只要该选项卡存在的选项卡(即,当我浏览提供此应用程序的站点时,页面刷新后存活的内容).看起来像是在浏览器中可以使用的明智之举,比如window.tabId - 这就是我所需要的.我有一个严肃的开发块,因为我无法通过这个似乎不存在的简单,简单,简单的解决方案.必须有一种方法(跨浏览器解决方案).

有任何想法吗?

Mo *_*ami 32

SessionStorage是每个选项卡/窗口,因此您可以在sessionStorage中定义一个随机数,如果存在则首先获取它:

var tabID = sessionStorage.tabID ? sessionStorage.tabID : sessionStorage.tabID = Math.random();
Run Code Online (Sandbox Code Playgroud)

更新:
在某些情况下,您可能在多个选项卡中具有相同的sessionStorage(例如,当您复制选项卡时).在这种情况下,以下代码可能有助于:

var tabID = sessionStorage.tabID && sessionStorage.closedLastTab !== '2' ? sessionStorage.tabID : sessionStorage.tabID = Math.random();
sessionStorage.closedLastTab = '2';
$(window).on('unload beforeunload', function() {
      sessionStorage.closedLastTab = '1';
});
Run Code Online (Sandbox Code Playgroud)

  • 对于那些担心重复 id 的人 - 只需使用基于时间的前缀来随机生成 id。 (6认同)
  • 随机挑选数字不能确保它们是唯一的(即选择0到99之间的随机数,并且可能总是多次11次).为什么不在localStorage中输入序列号? (4认同)
  • @MaxWaterman,是的,随机数可能会发生冲突,但是 `Math.random` 返回双精度数,其大小为 64 位。所以情况并没有那么糟糕。在**一百万**次运行中,“Math.random”生成两个重复数字的概率约为 1%。请参阅此答案/sf/answers/1975464991/。在新版本的浏览器中,“Math.random”的质量似乎更好。现在f.ex。它是 Chrome 内部使用的 128 位生成器(https://v8.dev/blog/math-random)。(不确定它对碰撞概率有多大影响。) (3认同)
  • 此代码有很大帮助,但是当您复制窗口时数据存储仍然存在 (2认同)

jmo*_*eno 12

你必须使用html5,但sessionStorage结合随机guid似乎是你想要的.

  • @MaxWaterman:不同的浏览器,私有标签,更改时间......串口不再比随机保证.有各种各样的方法来创建一个尽可能好的guid - 碰撞的机会如此之小,以至于不值得打扰aboit. (3认同)

Ali*_*aka 8

这是一种tabId在页面加载后可用的方法-tabId即使在刷新后也保持相同。

这也解决了重复的标签的问题,因为tabId从清除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;
});
Run Code Online (Sandbox Code Playgroud)

访问tabId使用window.tabId.

beforeunload需要该事件以保持tabId刷新后具有相同的可用 id。

load事件需要:

  1. 生成初始tabId.
  2. tabId刷新后加载相同的内容- 如果存在。

* 我真的不知道为什么我应该做return null或返回。只是读到不返回可能会导致函数不起作用:(


sch*_*ebe 7

由于我没有找到像这样的简单Javascript函数windows.currentTabIndex,因此我写了一些Java代码来修复每个浏览器选项卡在加载时的ID。

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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

此代码保存最后一个标签的索引,localStorage以更新新标签的当前值,并保存该标签sessionStorage的ID!

我必须defineTabId()在应用程序的每一页中调用函数。由于我使用JSF模板进行开发,因此只能在一个地方定义它:-)


Tri*_*Nhu 5

您无法使用javascript获取标签页ID,但是当用户打开新标签页时,有什么解决方案可以像使用其他会话/ cookies一样为您提供帮助。

一些参考:

获取浏览器标签索引/ ID

从firefox扩展获取firefox选项卡的URL

如何在浏览器标签中区分会话?

在每个浏览器选项卡中获得唯一的会话

asp.net-会话-多个浏览器选项卡-不同的会话?