如何存储每个浏览器标签唯一的ID?

时间:2015-07-28 20:37:27

标签: javascript iframe tabs

我在多个浏览器标签中运行我们的网络应用程序并使用log4javascript添加了客户端日志时调试问题。我现在正在尝试确定哪个日志行由哪个浏览器选项卡写入,因此我想为每个日志行添加唯一的选项卡ID。

这归结为我需要一种方法来识别浏览器标签是" new"并需要接收新的标签ID。已收到标签ID的标签应保留此ID。

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

  • 幸存标签重新加载
  • 在标签之间始终不同
  • 在托管在与嵌入页面不同的域中的iframe中工作

以下是我尝试的内容:

  1. 将标签ID存储在会话存储空间中,如果标签的会话存储空间尚未包含此ID,则生成新ID。

    在大多数情况下,这种方法效果很好。但是,在某些情况下,新选项卡会以其打开的选项卡的会话存储的完整副本开始。当通过单击引用新窗口目标的超链接打开新选项卡时,或者选项卡重复时,似乎就是这种情况。在这种情况下,我们无法区分两个选项卡,因此两个选项卡最终都使用相同的选项卡ID。

  2. 使用 jQuery.data()将标签ID附加到HTML元素,如果HTML元素的数据尚未包含此ID,则生成新ID。< / p>

    这是愚蠢的,因为它显然无法在标签重新加载中存活。

  3. 将标签ID存储在包含我们的应用程序的iframe的 window.name 中,如果window.name尚未包含此类ID,则生成新ID。

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

  4. 将标签ID存储在 window.top.name 中,如果window.top.name尚未包含此ID,则生成新ID。

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

  5. 在包含我们的应用程序的iframe中嵌入又一个iframe ,将该标签ID存储在该iframe的window.name中,并在内部iframe生成新ID时使用window.name尚未包含此类ID。

    这不起作用,因为即使我们在打开它时没有明确设置内部iframe的名称,iframe重新加载时iframe的名称也会重置为空字符串。这就是我们打开内部iframe的方式:

    <iframe id="iframe2" src="index.jsp"></iframe>

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

    如果没有,我想知道是否有任何其他方式可以让我确定标签是新的,因此需要接收新的标签ID。

1 个答案:

答案 0 :(得分:0)

为什么不尝试组合:页面的哈希+本地存储。页面的哈希是网址中#之后的部分。可以使用location.hash读取和更新该部分。您可以在网址中使用该部分进行追加,并在重新加载时保留标签的ID。

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