我正在解决我们的Web应用在多个浏览器标签中运行时出现的问题,并使用log4javascript添加了客户端日志。现在,我想确定哪个日志行是由哪个浏览器标签编写的,因此我想将唯一的标签ID添加到每个日志行中。
这归结为我需要一种方法来确定浏览器标签是“新”的并且需要接收新的标签ID。已经收到标签ID的选项卡应保留此ID。
但是,我还没有找到以方式存储此类ID,使其:
- 在选项卡重新加载之后仍然有效 - 在标签之间始终不同 - 在托管在与嵌入页面不同的域中的iframe内部工作
以下是我尝试过的方法:
1. 将选项卡ID存储在session storage中,并在选项卡的会话存储中尚未包含此类ID时生成新ID。 在大多数情况下,这很有效。但是,在某些情况下,新选项卡从打开它的选项卡的会话存储中完整复制启动。当通过引用新窗口目标的超链接或复制选项卡时,似乎就是这种情况。在这种情况下,我们无法区分两个选项卡,因此两个选项卡最终使用相同的选项卡ID。
2. 使用jQuery.data()将选项卡ID附加到HTML元素并在HTML元素的数据尚未包含此类ID时生成新ID。 这很愚蠢,因为它显然无法在选项卡重新加载时生效。
3. 在包含我们的应用程序的iframe的window.name中存储选项卡ID,并在window.name尚未包含此类ID时生成新ID。 这不起作用,因为生成HTML iframe标记的嵌入式应用程序(我们不能更改)设置了iframe名称,因此每次重新加载选项卡后都会丢失选项卡ID。
4. 将选项卡ID存储在window.top.name中,并在window.top.name尚未包含此类ID时生成新ID。 这不起作用,因为由于跨站点安全限制(嵌入式应用程序托管在与iframe内容不同的域中),我们无法设置window.top.name。
5. 在包含我们的应用程序的iframe内部嵌入另一个iframe,将选项卡ID存储在该iframe的window.name中,并在内部iframe的window.name尚未包含此类ID时生成新ID。 这不起作用,因为即使我们在打开它时没有明确设置内部iframe的名称,但是在选项卡重新加载时,iframe的名称也将重置为空字符串。以下是我们打开内部iframe的方式: 我理解为什么前四个选项没有起作用。我不确定为什么第五个选项也不起作用,怀疑可能是由于我的小错误。
如果不是这样,我想知道是否有其他的方法可以确定一个标签页是新的,因此需要获得一个新的标签页ID。
这归结为我需要一种方法来确定浏览器标签是“新”的并且需要接收新的标签ID。已经收到标签ID的选项卡应保留此ID。
但是,我还没有找到以方式存储此类ID,使其:
- 在选项卡重新加载之后仍然有效 - 在标签之间始终不同 - 在托管在与嵌入页面不同的域中的iframe内部工作
以下是我尝试过的方法:
1. 将选项卡ID存储在session storage中,并在选项卡的会话存储中尚未包含此类ID时生成新ID。 在大多数情况下,这很有效。但是,在某些情况下,新选项卡从打开它的选项卡的会话存储中完整复制启动。当通过引用新窗口目标的超链接或复制选项卡时,似乎就是这种情况。在这种情况下,我们无法区分两个选项卡,因此两个选项卡最终使用相同的选项卡ID。
2. 使用jQuery.data()将选项卡ID附加到HTML元素并在HTML元素的数据尚未包含此类ID时生成新ID。 这很愚蠢,因为它显然无法在选项卡重新加载时生效。
3. 在包含我们的应用程序的iframe的window.name中存储选项卡ID,并在window.name尚未包含此类ID时生成新ID。 这不起作用,因为生成HTML iframe标记的嵌入式应用程序(我们不能更改)设置了iframe名称,因此每次重新加载选项卡后都会丢失选项卡ID。
4. 将选项卡ID存储在window.top.name中,并在window.top.name尚未包含此类ID时生成新ID。 这不起作用,因为由于跨站点安全限制(嵌入式应用程序托管在与iframe内容不同的域中),我们无法设置window.top.name。
5. 在包含我们的应用程序的iframe内部嵌入另一个iframe,将选项卡ID存储在该iframe的window.name中,并在内部iframe的window.name尚未包含此类ID时生成新ID。 这不起作用,因为即使我们在打开它时没有明确设置内部iframe的名称,但是在选项卡重新加载时,iframe的名称也将重置为空字符串。以下是我们打开内部iframe的方式: 我理解为什么前四个选项没有起作用。我不确定为什么第五个选项也不起作用,怀疑可能是由于我的小错误。
如果不是这样,我想知道是否有其他的方法可以确定一个标签页是新的,因此需要获得一个新的标签页ID。