Javascript 如何存储每个浏览器选项卡上唯一的ID?

Javascript 如何存储每个浏览器选项卡上唯一的ID?,javascript,iframe,tabs,Javascript,Iframe,Tabs,我正在调试在多个浏览器选项卡中运行web应用程序的问题,并使用log4javascript添加了一个客户端日志。我现在试图确定哪个日志行是由哪个浏览器选项卡写入的,所以我想为每个日志行添加一个唯一的选项卡ID 归根结底,我需要一种方法来识别浏览器选项卡是“新”的,并且需要接收新的选项卡ID。已经接收到选项卡ID的选项卡应该保留此ID 但我还没有找到一种方法来存储这样一个ID: 重新加载选项卡后仍然有效 标签之间总是不同的 在iframe中工作,iframe托管在与嵌入页面不同的域中 以下是我

我正在调试在多个浏览器选项卡中运行web应用程序的问题,并使用log4javascript添加了一个客户端日志。我现在试图确定哪个日志行是由哪个浏览器选项卡写入的,所以我想为每个日志行添加一个唯一的选项卡ID

归根结底,我需要一种方法来识别浏览器选项卡是“新”的,并且需要接收新的选项卡ID。已经接收到选项卡ID的选项卡应该保留此ID

但我还没有找到一种方法来存储这样一个ID:

  • 重新加载选项卡后仍然有效
  • 标签之间总是不同的
  • 在iframe中工作,iframe托管在与嵌入页面不同的域中
以下是我尝试过的:

  • 将选项卡ID存储在会话存储中,如果选项卡的会话存储尚未包含此类ID,则生成新ID

    这在大多数情况下都非常有效。但是,在某些情况下,一个新选项卡开始时,它的会话存储的完整副本已从中打开。当通过单击引用新窗口目标的超链接打开新选项卡时,或者如果该选项卡重复,则可能出现这种情况。在这种情况下,我们无法区分两个选项卡,因此两个选项卡最终使用相同的选项卡ID

  • 使用jQuery.data()将选项卡ID附加到HTML元素,如果HTML元素的数据尚未包含此类ID,则生成新ID

    这是愚蠢的,因为它显然无法在重新加载选项卡后生存

  • 将选项卡ID存储在包含我们的应用程序的iframe的window.name中,如果window.name尚未包含这样的ID,则生成一个新ID

    这不起作用,因为生成HTML iframe标记(我们无法更改)的嵌入应用程序设置了iframe名称,因此每次重新加载选项卡后,选项卡ID都会丢失

  • 将选项卡ID存储在window.top.name中,如果window.top.name尚未包含此类ID,则生成一个新ID

    这不起作用,因为由于跨站点安全限制,我们无法设置window.top.name(嵌入应用程序托管在不同于iframe内容的域中)

  • 在包含我们的应用程序的iframe中嵌入另一个iframe,将选项卡ID存储在该iframe的window.name中,如果内部iframe的window.name尚未包含这样的ID,则生成一个新ID

    这不起作用,因为即使我们在打开内部iframe时没有显式设置其名称,但在重新加载选项卡时,iframe的名称会重置为空字符串。以下是打开内部iframe的方式:

  • 我理解前四个选项为什么不起作用。我不确定为什么第五个选项不起作用,并怀疑我可能会犯一个小错误


    如果没有,我想知道是否有其他方法可以让我确定一个选项卡是新的,因此需要接收一个新的选项卡ID。为什么不尝试一种组合:页面的哈希+本地存储。页面的散列是url中
    后面的部分。可以使用
    location.hash
    读取和更新该部分。您可以在url中使用该部分来附加和保留选项卡的id,即使在重新加载时也是如此

    然后,您可以使用
    localStorage
    跟踪已使用的ID。如果加载的选项卡没有哈希值,它将生成一个哈希值,将其保存到
    localStorage
    ,并将该值用作id。如果该选项卡带有哈希值(如重新加载后),页面将检查是否记录了该值。如果没有,它就使用它。否则,它会生成另一个。

    此答案可能会帮助您: