2

Ich habe versucht, eine JavaScript-Funktion für eine Google Chrome-Webanwendung zu erstellen, die überprüft, ob geöffnete Instanzen der Webanwendung vorhanden sind Anwendung, und wenn dies der Fall ist, zwingt sie die Seite zu aktualisieren.Erzwingen, dass alle geöffneten Instanzen einer Webseite in einer Google Chrome-Webanwendung aktualisiert werden

Mein ursprünglicher Code ist wie folgt:

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"}); 
     } 
    } 
}); 

Das funktioniert aber nur für alle innerhalb des aktuellen Fenstertabs. Wenn sich Instanzen in ihrem eigenen Fenster oder in einem anderen Fenster befinden, werden sie nicht aktualisiert.

Ich passte es in einem Versuch, es für alle offenen Seiten funktioniert, und nicht nur die in der aktuell gewählten Fenster wie folgt:

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"}); 
     } 
    } 
}); 

Während der neue Code keinen Fehler in der JavaScript-Rück Konsole, scheint es nicht zu tun, was es tun soll; Aktualisieren Sie alle geöffneten Instanzen der Anwendungsseite.

Habe ich das windows.getAll-Modul falsch verstanden? Kann jemand eine funktionierende Lösung anbieten?

+0

Ich habe es nie benutzt, aber ich denke, den Rückruf Auf Windows.getAll gibt Ihnen ein Array von Windows nicht Tabs. So sollte es 'chrome.windows.getAll ({populate: true}, Funktion (Windows) {' in dieser Funktion können Sie durch Fenster und dann in jedem Fenster Schleife durch Tabs – Adam

+0

Eigentlich müssen Sie nicht die chrome.windows verwenden Alles was er gerade tut, ist das Überprüfen seiner Erweiterungsseiten. Es ist sauberer und schneller, 'chrome.extension.getViews()' zu verwenden. Ich habe ein Beispiel in meinem Post unten hinzugefügt. –

Antwort

0

Statt Iterieren alle Registerkarten, können Sie einfach Ihre „eigene iterieren "Erweiterungen geöffneten Seiten:

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

Die oben sollte funktionieren, sauberer und schneller als alle Fenster laufen.

1

chrome.windows.getAll gibt ein Array von Fenstern zurück, nicht Registerkarten. Jedes Fenster enthält ein Array von Registerkarten. Ich erinnere mich jetzt nicht, wie Tabs Array genannt wird, ich gehe davon aus es tabs ist (nur Dump zurück Fenster in die Konsole und prüfen):

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

Für andere Google-Suche könnte dieser Code für Sie von Interesse sein. Ich benutzen es, ein Browser Aktionssymbol auf dem aktiven Registerkarte jeden Fenster zu aktualisieren, so dass, wenn die Verlängerung Updates oder neu geladen, das Symbol, um einen Status vorhanden ist:

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