【问题标题】:How to identify every separate browser window that is currently open?如何识别当前打开的每个单独的浏览器窗口?
【发布时间】:2013-11-02 15:28:43
【问题描述】:

如何使用 javascript 唯一标识当前为所有主要浏览器打开的每个单独的浏览器窗口?让我解释一下我需要知道的内容,让我们考虑以下场景:

我有 3 个当前打开的浏览器窗口 [任何现代浏览器,即 Chrome、Firefox 等],每个窗口都包含多个选项卡。

  • 窗口 #1:3 个选项卡 [选项卡 A、选项卡 B 和选项卡 C]
  • 窗口 #2:2 个选项卡 [Tab D 和 Tab E]
  • 窗口 #3:4 个选项卡 [Tab F、Tab G、Tab H 和 Tab I]

如何唯一标识每个浏览器窗口 [即为每个浏览器窗口捕获唯一的 ID/值,而不是选项卡的窗口]?所以,最后我将有 3 个 ID [所有窗口],而不是 9 个 ID [所有选项卡]。我可以通过创建使用 jQuery [crossrider] 的浏览器插件或扩展来识别窗口中的所有选项卡,但找不到唯一识别每个窗口的方法。

这可以通过 JavaScript/JQuery 实现吗?如果是这样,怎么做?如果不是,为什么?

我在 javascript 中尝试了“window.name”,但这给了我 9 个 ID,而不是 3 个 ID。

【问题讨论】:

  • 我不太清楚你为什么要识别窗口,用例是什么?现代浏览器通常将选项卡视为窗口(过去是“许多打开的窗口”现在是“许多打开的选项卡”)并将它们实现为单独的进程。所以真的,你只需要标签标识,从你的 cmets 中,我可以看到你已经设法获得。 [免责声明] 我是 Crossrider 的员工
  • 感谢您的帮助。我想在用户单击按钮时将用户的浏览会话 [当前打开的窗口和选项卡] 保存到云/服务器,以便用户可以离开/关闭他/她的浏览器/计算机,再次返回并开始浏览他/她的位置离开了。例如,当 Chrome 崩溃时,它会记住用户的最后一次会话,并按照崩溃前的打开方式重新打开所有窗口和选项卡,这样用户就不必再次重新打开它们。在这种情况下,我不想在 1 个窗口中保存/打开 9 个选项卡,而是在窗口 #1 中保存/打开 3 个选项卡,在窗口 #2 中保存/打开 2 个选项卡,在窗口 #3 中保存/打开 4 个选项卡。
  • 有很多扩展/插件的场景窗口跟踪非常重要,我认为Crossrider应该更新它的API以支持浏览器窗口识别
  • 我喜欢 crossrider,因为它确实简化了开发人员的开发工作。有没有办法我也可以帮助创建一些 crossrider 插件[类似于人们之前创建 jQuery 插件的方式]?为 crossrider 创建插件的方法是什么?这样,任何开发人员都可以创建一个插件来扩展 crossrider API 以满足他/她的独特项目需求。
  • 有谁知道你是否可以通过使用纯 javascript 或 jQuery 来做到这一点?

标签: javascript jquery browser window crossrider


【解决方案1】:

据我所知,目前的 Crosssrider API 无法做到这一点!

您必须切换回非跨浏览器插件实现,
这样您就可以为每个目标浏览器实现单独的扩展。

例如在Chrome扩展中,使用chrome.windows.getAll函数

chrome.windows.getAll(object getInfo, function callback)

获取所有可以计数和识别的窗口实例。 例如:

chrome.windows.getAll({populate : true}, function (window_list) {
    var count = window_list.length; // You now have their count
    for(var i=0; i<count; i++) {
        var myWindow = window_list[i];
        // Do whatever you want here !
    }
});

并且不要忘记清单中的选项卡权限!

{
  ...
  "permissions": ["tabs"],
  ...
}


对于 Firefox 插件,使用nsIWindowMediator 类,调用其getEnumerator 方法

var windowMediator = Components.classes["@mozilla.org/appshell/window-mediator;1"]
                     .getService(Components.interfaces.nsIWindowMediator); 
var enumerator = windowMediator.getEnumerator(null); // returns an iterator of all windows
var count = 0;
while (enumerator.hasMoreElements()) {
    var myWindow = enumerator.getNext();
    count++; 
    // Do whatever you want here !
}
// You now have their count


对于 Safari 扩展,您可以使用 safari.application.browserWindows 获取所有打开的窗口的数组,例如

var count = safari.application.browserWindows.length; // You now have their count
for(var i=0; i<count; i++) {
    var myWindow = safari.application.browserWindows[i];
    // Do whatever you want here !
}

【讨论】:

  • 您可以使用纯 javascript 或 jQuery 获取/设置浏览器窗口 [即 window.name] 的任何值吗?真的只是为了识别窗口或区分它们吗?
  • 感谢您的帮助。有趣的是,你没有提到 IE ... ;-)
  • 您只能获取/设置每个窗口 API 中可用字段的值作为可获取/可设置字段(请注意,有些是只读的),因此您必须检查每个文档中的窗口对象和首先检查该字段(适合您的应用程序逻辑)是否可访问以及它是否可获取/可设置(我上面的答案中提供了 API 文档的链接)
  • 我没有提到 IE,因为有很多替代方法可以实现 IE 扩展,无论是通过本机代码、通过 C++、通过 Win32 API,还是通过像 Add-in-Express 这样的框架。所以这取决于你将如何实现它...... PS。如果这回答了您的问题,请将解决方案标记为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-25
  • 1970-01-01
  • 2016-08-30
  • 2014-08-29
  • 1970-01-01
  • 1970-01-01
  • 2012-10-20
相关资源
最近更新 更多