Принудительное обновление всех открытых экземпляров веб-страницы в веб-приложении Google Chrome - PullRequest
2 голосов
/ 09 декабря 2010

Я пытался создать функцию JavaScript для веб-приложения Google Chrome, которая проверяет, есть ли какие-либо открытые экземпляры приложения, и, если таковые имеются, заставляет их обновить страницу.

Мой оригинальный код выглядит следующим образом:

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?Кто-нибудь может предложить рабочее решение?

Ответы [ 3 ]

1 голос
/ 09 декабря 2010

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"});
            }
        }
    }
});
0 голосов
/ 11 июня 2012

Для других поисковых систем Google этот код может вас заинтересовать. Я использовал его, чтобы обновить значок действия браузера на активной вкладке каждого окна, поэтому, когда расширение обновляется или перезагружается, значок имеет статус:

chrome.tabs.query({active: true}, function queryCallback(tabs){
  var length = tabs.length;
  for (var i = 0; i < length; i++) {
    handleTab(tabs[i]);
  }
});
0 голосов
/ 09 декабря 2010

Вместо того, чтобы перебирать все вкладки, вы можете просто перебирать открытые страницы своих "собственных" расширений:

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

Вышеупомянутое должно работать, чище и быстрее, чем перебирать все окна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...