Как проверить, открыта ли уже конкретная страница в Google Chrome?

По сути, у меня есть упакованное веб-приложение, которое я хотел бы проверить при загрузке, есть ли какие-либо другие открытые экземпляры веб-приложения, и, если да, переключиться на открытый экземпляр, а не создавать другой один.

Кроме того, для страницы параметров я хотел бы, чтобы она могла проверить, открыто ли приложение, и, если да, обновить страницу приложения, если страница параметров была изменена.

Я прочитал документацию о JavaScript chrome.tabs. модуль, но я не могу понять, как заставить функцию искать определенную вкладку. Я не совсем понимаю, как искать или устанавливать идентификатор вкладки для конкретной вкладки. Я думаю, что это способ делать то, что я хочу, но если я лаю не по тому дереву, пожалуйста, дайте мне знать.

Если кто-нибудь здесь может объяснить это лучше для меня, я был бы очень благодарен.


person 木川 炎星    schedule 08.12.2010    source источник


Ответы (5)


Загляните внутрь расширения Google Mail Checker, в котором есть следующие функции:

function goToInbox() {
  chrome.tabs.getAllInWindow(undefined, function(tabs) {
    for (var i = 0, tab; tab = tabs[i]; i++) {
      if (tab.url && isGmailUrl(tab.url)) {
        chrome.tabs.update(tab.id, {selected: true});
        return;
      }
    }
    chrome.tabs.create({url: getGmailUrl()});
  });
}

В частности, вы передаете getAllInWindow идентификатор окна (или undefined для текущего окна) и функцию, которая получает массив объектов Tab. Вы не изменяете свойства вкладки напрямую; скорее вы передаете его идентификатор функции обновления, чтобы манипулировать им.

person Josh Lee    schedule 08.12.2010
comment
Кажется, вкладка идеально выбрана! Вопрос: как сказать браузеру обновить указанную вкладку, а не переключаться на нее, как это делает расширение Google Mail Checker? И есть ли что-то похожее на getAllInWindow, которое проверяет все окна? - person 木川 炎星; 08.12.2010

Чтобы ответ Джоша Ли работал с использованием манифеста версии 2, вы должны добавить разрешение на вкладки в файле manifest.json:

...
"permissions": [
    "tabs"
]
...

Я понятия не имею, как такая конструкция добавляет «безопасности» в Интернет ...

person Bernard    schedule 17.11.2012

Надеюсь, это поможет новичкам!

С дополнением к ответу #Josh Lee.

function openMyTab(mURL) {          

    if(!mURL){
       console.log("No url passed");
       return;
    }
  chrome.tabs.getAllInWindow(undefined, function(tabs) {
    for (var i = 0;i<tabs.length; i++) {

// remove (tabs[i].url.indexOf(mURL)!=-1) and 
// use tabs[i].url===url if you want exact match below

      if (tabs[i].url && (tabs[i].url.indexOf(mURL)!=-1)) {

        console.log("URL Match found",tabs[i].url);

        chrome.tabs.update(tabs[i].id, {url:url,selected: true});

        return;
      }
    }
     console.log("URL not found. Creating new tab");

    chrome.tabs.create({url: url});
  });
person Rafique Mohammed    schedule 16.11.2015

Эти ответы, хотя и полезны, но довольно старые и устаревшие. «getAllInWindow» и «selected» теперь устарели. Мой код также обновил вкладку, как и просили изначально. Мне нужно было проверить только внутренние страницы расширения, поэтому вот как выглядит мой код:

function goToInternalPage(targetURL) {
chrome.tabs.query({}, function(tabs) {
    for (let i = 0, tab; tab = tabs[i]; i++) {
        if (tab.url===("chrome-extension://"+ chrome.runtime.id + targetURL)) {
            chrome.tabs.reload(tab.id, {}, function(){});
            chrome.tabs.update(tab.id, {active: true});
            return;
        }
    }
    chrome.tabs.create({url: targetURL});
});

}

Общий вариант будет выглядеть так:

function goToURL(targetURL) {
chrome.tabs.query({}, function(tabs) {
    for (let i = 0, tab; tab = tabs[i]; i++) {
        if (tab.url===targetURL) {
            chrome.tabs.reload(tab.id, {}, function(){});
            chrome.tabs.update(tab.id, {active: true});
            return;
        }
    }
    chrome.tabs.create({url: targetURL});
});

}

person Gergely Szabo    schedule 02.03.2019

На всякий случай, если кто-то планирует использовать приведенные выше примеры, опция «выбрано» устарела с Chrome 33, вместо этого используйте опцию «выделено».

person Paresh    schedule 07.06.2017