【问题标题】:Is there a way to uniquely identify tabs for the lifetime of the tab?有没有办法在选项卡的生命周期内唯一标识选项卡?
【发布时间】:2012-12-06 13:55:25
【问题描述】:

我正在考虑使用 tabid 来执行此操作,但当我在 tab 中浏览时,它似乎经常发生变化。 API reference 指出 tabid 在“浏览器会话”中是唯一的。我认为这意味着在浏览器进程的生命周期内,但现在似乎更有可能的是,只有在与特定网站的会话期间才能保证唯一性。是否有另一种方法可以在其整个生命周期中唯一标识一个标签?

【问题讨论】:

  • 之前有人问过这个问题,但还没有人回答:stackoverflow.com/questions/12658370/…
  • @KonradDzwinel,您链接的问题与 OP 的问题不同。这个问题是关于单个浏览器会话中的 tabID 身份,而链接的问题是关于在会话之间保留身份。因此,对于当前的这个问题,在大多数情况下,Chrome_RenderWidgetHostHWND 的句柄在导航期间保持不变,即使在不同站点之间跳转后也是如此。所以可以制作一个 NPAPI 插件,通过这个句柄跟踪标签。

标签: google-chrome google-chrome-extension


【解决方案1】:

由于预渲染和其他因素,标签可以被“替换”。这意味着即使您保持选项卡打开,tabId 也可以更改。 chrome.webNavigation.onTabReplaced 可用于捕获此类事件。请参阅https://developer.chrome.com/extensions/webNavigation.html#event-onTabReplaced 了解更多信息。

为了证明这一点,请按照以下步骤操作可能有帮助:

  1. 确保您已经为您的扩展请求了“tabs”和“webNavigation”请求,并且您的扩展没有使用非持久性背景页面(在 manifest.json 中没有 background.persistent = true)。还要确保 Google 是您的默认搜索引擎并启用即时搜索。
  2. 打开一些网站(不是 Google 搜索)。
  3. 在扩展后台页面的开发者工具中执行chrome.tabs.query({}, function(tabs){console.log(tabs)})。查看现有选项卡及其 ID。
  4. 在 DevTools 中执行 chrome.webNavigation.onTabReplaced.addListener(function(details){console.log(details);
  5. 在该选项卡的多功能框中输入内容以触发 Google Instant 并单击页面正文。您应该会在 DevTools 的控制台中看到触发的 onTabReplaced 事件以及新旧选项卡 ID。
  6. 再次执行chrome.tabs.query({}, function(tabs){console.log(tabs)}),你会发现标签ID实际上“改变了”。

【讨论】:

  • 在实际情况下,Tab ID 可以视为选项卡的常量。您所说的临时 ID 不会暴露给 chrome.tabs API - 请参阅 developer.chrome.com/extensions/webNavigation.html#tab_ids
  • @RobW “一旦这样的选项卡被换入,就会触发一个 onTabReplaced 事件,并且可以通过这些 API 访问它们。”据我了解,这可能会使现有选项卡“更改”其选项卡 ID。但是,我目前无法重现该事件的实例。
猜你喜欢
  • 2010-10-30
  • 2020-04-11
  • 2018-09-03
  • 1970-01-01
  • 2012-02-15
  • 2012-05-15
  • 1970-01-01
  • 2011-10-24
  • 2013-12-11
相关资源
最近更新 更多