如何在Google Chrome中检查特定页面是否已经打开?

10

基本上,我有一个打包的Web应用程序,我希望能够在加载时检查是否有任何其他实例的Web应用程序正在运行,并且如果有,则切换到已经打开的实例而不是创建另一个实例。

此外,对于选项页面,我希望它能够检查应用程序是否已经打开,如果是,则在选项页面更改后刷新应用程序页面。

我一直在阅读关于chrome.tabs JavaScript模块的文档,但我不知道如何使函数查找特定选项卡。我不太明白如何查找或设置特定选项卡的选项卡ID。我认为这是实现我想要的功能的方法,但如果我走错了路,请告诉我。

如果这里有人可以更好地为我解释,我将不胜感激。

5个回答

8

浏览 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()});
  });
}

特别是,你要传递windowId(或未定义的当前窗口)和一个函数给getAllInWindow,该函数接收Tab对象数组。你不直接修改选项卡的属性;相反,你将其id传递给update函数以便操作它。


1
那似乎完美地选择了选项卡!一个问题:我如何告诉浏览器刷新指定的选项卡,而不是像Google Mail Checker扩展那样切换到它?还有类似于getAllInWindow的东西可以检查所有窗口吗? - 木川 炎星

4
要让Josh Lee的答案在使用version 2清单时生效,您需要在manifest.json文件中为选项卡添加权限:
...
"permissions": [
    "tabs"
]
...

我不知道这种结构如何增加网络安全...

1
希望对初学者有所帮助!除了 #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});
  });

1

这些答案虽然有帮助,但已经相当陈旧和过时了。"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});
});

}


0

如果有人计划使用上面的示例,请注意,“selected”选项已经从Chrome 33起被弃用,而应改用“highlighted”选项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接