Chrome打开包含网址的标签

时间:2016-02-04 17:38:51

标签: javascript google-chrome-extension

我有一个回调函数,应该搜索给定网址的所有标签,如果它打开则导航到该标签,如果它没有打开则应该打开它。

我有以下查询检查url的选项卡

chrome.tabs.query({url: destination}, function (result) {
    //If it found no results then the page is not open
    if(result == null) {
        console.log(destination + " not found in tabs. Function will open Tab.")
        //Appropriate function...
    }
    //If it's open, the function will switch to the tab instead.
    else {
        //Use the tab ID of the first result
        var tabID = result[0].id;
        //Appropriate function using id to open tab
    }

问题是结果总是为null或未定义,并且永远不会返回数组(即使在目标==" http://*/*")我最初有if(result.length == 0) )但它会给出与类型相关的错误

我也尝试过使用

chrome.tabs.update(tabID, {
    selected: true
});

切换到标签,但这不起作用。我想这可能是因为我需要将它放在background.js页面中,但我无法从此页面调用它。

chrome.extension.getBackgroundPage().myFunction(); 

不起作用。

编辑:
您提到了导致空字符串的权限。这可能就是答案,但我确实在权限中设置了标签。这些是我在清单中的权限:

"permissions": [
    "storage",
    "notifications",
    "activeTab",
    "tabs",
    "bookmarks",
    "browsingData",
    "identity",
    "topSites",
    "history"
]

1 个答案:

答案 0 :(得分:1)

这基本上是关于 chrome.tabs.query 的问题。

此方法将对象作为第一个参数。可以使用以下模式之一将名为“url”的属性设置为字符串。结果将是一个包含所有标签的数组,其中url与模式匹配。

注意:除非您在清单中指定了“tabs”权限,或者与返回的url值匹配的域,否则任何返回的TabObjects的url属性都将为空字符串。

示例查询:

*:// * / * 将返回所有标签

http://*/* 将返回带有http协议的所有标签

http://www.google.com/* 将返回包含http协议和域名www.google.com的所有标签

虽然这些模式可能会提醒您正则表达式,但它们并不相同。此查询中的最后一个星号始终表示出现0次以上。

请注意,您无法使用模式*://*.google.com/*搜索google.com的所有子域。

我还要注意,您可以为要搜索的url属性提供一系列模式。

以下是一个例子:

chrome.tabs.query( { "url":[ 

    "*://music.google.com/*", // copy this from manifest.json is better idea
    "*://video.google.com/*" 

] }, function( tabs ){ 

    if( tabs.length ){ /* tabs[ 0 ].url is blank depending on permissions */ }

} )