joe*_*lpt 7 javascript guid google-chrome google-chrome-extension
我正在尝试确定某种方法来为Chrome标签创建符合以下条件的唯一ID:
我已经做了一些相当激进的研究来找到一个全面的解决方案,但似乎没有什么可以做到的.以下是我尝试的方法,增加功效的顺序:
[location.href, document.referrer, history.length].关于最后一种方法,构造的密钥在所有选项卡中是唯一的,这些选项卡共享公共URL,引用者和历史记录长度.对于浏览器重新启动/会话恢复和关闭/撤消关闭之间的给定选项卡,这些值将保持不变.虽然这个密钥"非常"独特,但有些情况下它很模糊:例如,向http://www.google.com打开的3个新标签都会有相同的密钥(这种事情发生得很漂亮)经常在实践中).
"在会话存储中放置GUID"方法还可以用于在当前浏览器会话期间用于关闭/撤消关闭和重复选项卡情况的相同构造密钥的多个选项卡之间消除歧义.但这并不能解决浏览器重启之间的模糊问题.
通过观察Chrome在哪些窗口中打开哪些选项卡,以及根据预期的"兄弟"选项卡(在前一个浏览器中记录)存在哪个选项卡属于哪个窗口,可以在会话恢复期间部分缓解这种最后的歧义.会话).正如您可能想象的那样,实施此解决方案非常复杂且相当狡猾.并且它只能消除Chrome恢复到不同窗口的相同键控选项卡之间的歧义.这使得相同键控的选项卡可以恢复到同一个窗口,这是不可调和的模糊不清.
有没有更好的办法?在浏览器重启(会话恢复)和关闭/撤消关闭之间存在的保证唯一的浏览器生成的每标签GUID将是理想的,但到目前为止我还没有找到这样的东西.
这里的问题完成了大部分发现工作,并且已接受的答案基本上完成了它,但是对于希望实现需要持久选项卡 ID 的东西的人们来说,仍然存在很大的实现差距。我试图将其提炼为实际的实现。
回顾一下:通过维护在本地持久存储中存储以下变量组合的选项卡寄存器,可以根据问题的要求(几乎)唯一且一致地标识选项卡:
Tab.idTab.index[location.href, document.referrer, history.length]可以使用以下事件组合的侦听器来跟踪这些变量并将其存储在注册表中:
onUpdatedonCreatedonMovedonDetachedonAttachedonRemovedonReplaced仍然有一些方法可以欺骗这种方法,但实际上它们可能非常罕见 - 大多数是边缘情况。
因为看起来我不是唯一需要解决这个问题的人,所以我将我的实现构建为一个库,目的是让它可以在任何 Chrome 扩展中使用。它已获得 MIT 许可,并可在 GitHub 上用于分叉和拉取请求(事实上,欢迎任何反馈 - 肯定有可能的改进)。
如果我正确理解你的问题,你的第五种方法应该可以解决问题,但要符合这两个标准:
chrome.tabs.windowId(选项卡所在窗口的 ID)chrome.tabs.index(选项卡在其窗口内的从零开始的索引)所有这些值都需要存储在您的扩展中。chrome.tabs.onUpdated()除此之外,当选项卡被拖动、在所有者窗口之间移动等时,您还必须连接您的扩展并进行相应更新。
| 归档时间: |
|
| 查看次数: |
4090 次 |
| 最近记录: |