我正在寻找一种方法来为Chrome标签页建立唯一的ID,以满足以下条件:
- 唯一地识别每个标签页
- 对于给定的标签页,在浏览器重启(会话恢复的标签页)时保持不变
- 如果一个标签页被关闭然后通过撤销关闭标签页(Ctrl+Shift+T)重新打开,则保持不变
- 如果一个标签页被复制,则保持不同
我已经进行了一些积极的研究,以找到一个全面的解决方案,但似乎没有任何一种方法能够完全实现这一目标。以下是我尝试过的方法,按照有效性递增的顺序列出:
- 使用Chrome提供的tab.id:不能在浏览器会话或关闭/撤消关闭之间保持持久。
- 在cookie中放置GUID:每个标签页不是唯一的,只针对域名/URL是唯一的。
- 在localStorage中放置GUID:在浏览器重启和关闭/撤消关闭之间保持持久,但每个标签页不是唯一的,仅针对域名是唯一的。
- 在sessionStorage中放置GUID:每个标签页都是唯一的,在关闭/撤消关闭之间保持不变,对于复制的标签页也是唯一的,但在浏览器会话之间被清除。
- 使用可识别的网页文档属性作为唯一键:这是迄今为止我找到的最佳方法。可以通过内容脚本从以下值构建一个键:
[location.href, document.referrer, history.length]
。
关于最后一种方法,构建的键在所有共享公共URL、引用和历史记录长度的选项卡中是唯一的。这些值将在浏览器重启/会话恢复和关闭/撤销关闭时保持不变。虽然这个键是"相当"唯一的,但存在模糊性的情况:例如,打开3个指向http://www.google.com的新标签页将共有相同的键(这种情况在实践中经常发生)。
"将 GUID 存储在 sessionStorage" 方法可以用于在当前浏览器会话期间进一步消除针对关闭/撤销关闭和重复选项卡情况所构造的相同 key 的多个选项卡之间的歧义。但这并不能解决浏览器重新启动时的歧义问题。
在会话恢复期间,观察 Chrome 在哪些窗口中打开了哪些选项卡,并根据预期的“兄弟”选项卡的存在来推断给定模棱两可的键中哪个选项卡属于哪个窗口,可以在某种程度上减轻此类问题的影响(这些信息在上一个浏览器会话期间记录)。你可以想象,实现这个解决方案是相当复杂和不可靠的。而且它只能区分 Chrome 恢复到不同窗口的具有相同键的选项卡。这意味着恢复到同一窗口的具有相同键的选项卡仍然无法消除歧义。
是否有更好的方法?理想情况下,可以保证唯一、由浏览器生成、在浏览器重新启动(会话恢复)和关闭/撤销关闭之间持久存在的每个选项卡 GUID 将是最理想的,但到目前为止我还没有找到类似的东西。
chrome.window.onCreated
和chrome.window.onRemoved
事件监听器,你可以轻松地在所有窗口上模拟一个索引(顺序 ID)。 - Silviu-Marian