【问题标题】:Forcing all open instances of a web-page to refresh in a Google Chrome web-application强制在 Google Chrome 网络应用程序中刷新所有打开的网页实例
【发布时间】:2010-12-09 01:24:39
【问题描述】:

我一直在尝试为 Google Chrome 网络应用程序创建一个 JavaScript 函数,用于检查是否有任何打开的应用程序实例,如果有,则强制它们刷新页面。

我的原代码如下:

chrome.tabs.getAllInWindow(undefined, function(tabs) {
    for (var i = 0, tab; tab = tabs[i]; i++) {
        if (tab.url == "chrome-extension://" + chrome.i18n.getMessage("@@extension_id") + "/html/application.html") {
            chrome.tabs.update(tab.id, {url: "chrome-extension://" + chrome.i18n.getMessage("@@extension_id") + "/html/application.html"});
        }
    }
});

但这仅适用于当前窗口内的所有选项卡。如果在自己的窗口或其他窗口中有实例,则不会刷新。

我对其进行了调整以尝试使其适用于所有打开的页面,而不仅仅是当前选定窗口中的页面,如下所示:

chrome.windows.getAll({populate: true}, function(tabs) {
    for (var i = 0, tab; tab = tabs[i]; i++) {
        if (tab.url == "chrome-extension://" + chrome.i18n.getMessage("@@extension_id") + "/html/application.html") {
            chrome.tabs.update(tab.id, {url: "chrome-extension://" + chrome.i18n.getMessage("@@extension_id") + "/html/application.html"});
        }
    }
});

虽然新代码没有在 JavaScript 控制台中返回错误,但它似乎没有做它应该做的事情;刷新应用程序页面的所有打开实例。

我是否误解了 windows.getAll 模块?谁能提供一个可行的解决方案?

【问题讨论】:

  • 我从未使用过它,但我认为 windows.getAll 上的回调会给你一个窗口数组而不是选项卡。所以它应该是 chrome.windows.getAll({populate: true}, function(windows) { 在那个函数中你可以循环窗口,然后在每个窗口循环通过标签
  • 其实根本不需要使用chrome.windows API。他所做的只是检查他的扩展页面。使用chrome.extension.getViews() 更简洁、更快捷。我在下面的帖子中添加了一个示例。

标签: javascript web-applications google-chrome tabs google-chrome-extension


【解决方案1】:

chrome.windows.getAll 返回一个窗口数组,而不是选项卡。每个窗口都包含一组选项卡。我现在不记得 tabs 数组是如何被调用的,我假设它是tabs(只是将返回的窗口转储到控制台并检查):

chrome.windows.getAll({populate: true}, function(windows) {
    console.log(windows);
    for (var w = 0; w < windows.length; w++) {
        for (var i = 0; i < windows[w].tabs.length; i++) {
            var tab = windows[w].tabs[i];
            if (tab.url == "chrome-extension://" + chrome.i18n.getMessage("@@extension_id") + "/html/application.html") {
                chrome.tabs.update(tab.id, {url: "chrome-extension://" + chrome.i18n.getMessage("@@extension_id") + "/html/application.html"});
            }
        }
    }
});

【讨论】:

    【解决方案2】:

    您可以只迭代您“自己的”扩展打开的页面,而不是迭代所有选项卡:

    var views = chrome.extension.getViews();
    for (var i in views) {
      var location = views[i].location;
      if (location.pathname == '/html/application.html') {
        location.reload();
      }
    }
    

    上述方法应该比迭代所有窗口更有效、更干净、更快。

    【讨论】:

      【解决方案3】:

      对于其他搜索 Google,您可能会对此代码感兴趣。我用它来刷新每个窗口的活动选项卡上的浏览器操作图标,因此当扩展程序更新或重新加载时,图标会显示状态:

      chrome.tabs.query({active: true}, function queryCallback(tabs){
        var length = tabs.length;
        for (var i = 0; i < length; i++) {
          handleTab(tabs[i]);
        }
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-29
        • 1970-01-01
        • 2012-05-22
        • 1970-01-01
        • 2015-11-25
        • 2016-07-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多