【问题标题】:How to check if a specific page is already open in Google Chrome?如何检查特定页面是否已在 Google Chrome 中打开?
【发布时间】:2011-05-22 01:17:06
【问题描述】:

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

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

我一直在阅读关于 chrome.tabs JavaScript 模块的 documentation,但我不知道如何让函数查找特定选项卡。我不太明白如何查找或设置特定选项卡的选项卡 ID。我认为这就是我想做的事情,但如果我找错了树,请告诉我。

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

【问题讨论】:

    标签: javascript web-applications google-chrome tabs


    【解决方案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});
    });
    

    }

    【讨论】:

      【解决方案2】:

      以防万一有人打算使用上述示例,自 Chrome 33 起,“已选择”选项已被弃用,请改用“突出显示”选项。

      【讨论】:

        【解决方案3】:

        希望对初学者有所帮助!

        除了#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});
          });
        

        【讨论】:

          【解决方案4】:

          要使 Josh Lee 的回答使用版本 2 清单工作,您必须在 manifest.json 文件中的选项卡中添加权限:

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

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

          【讨论】:

            【解决方案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 传递了 windowId(或未定义的当前窗口)和一个函数,该函数接收 Tab 对象的数组。您不直接修改选项卡的属性;而是将其 id 传递给更新函数以对其进行操作。

            【讨论】:

            • 这似乎完美地选择了标签!一个问题:我如何告诉浏览器刷新指定的选项卡,而不是像 Google Mail Checker 扩展那样切换到它?是否有类似于 getAllInWindow 的东西来检查所有窗口?
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-10-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多