Chrome扩展程序:使用tabs.create回调函数停用标签页

时间:2018-08-11 19:03:24

标签: javascript google-chrome-extension

创建一组选项卡后,我想使用保存在存储中的名称重命名它们。我正在尝试使用chrome.tabs.create的回调函数将消息发送到内容脚本以重新命名选项卡。我可以创建标签,但无法重命名标签。

popup.js中,我有一个循环遍历所有选项卡,并在chrome.tab.create中调用background.js

popup.js的一部分

groupButton.onclick = function()
{
    /* opens the tabs */
    for (var j = 0; j < group["tabCount" + i]; j++)
    {
        chrome.extension.getBackgroundPage().createTab(group, i, j);
        // cannot use callback function because popup is immediately closed upon tab creation, have to use background script
        // chrome.tabs.create({"url": group["tabUrls" + i][j], "active": false});
    }
}

background.js

function createTab(group, i, j)
{
    chrome.tabs.create({"url": group["tabUrls" + i][j], "active": false}, function(tab)
    {
        var tabTitle = group["tabNames" + i][j];
        chrome.tabs.sendMessage(tab.id, {getTitle: tabTitle}, function(response){});
    })
}

content.js

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse)
{
    if (request.title || request.name || request.getTitle)
    {
        document.title = request.title || request.name || request.getTitle;
    }
})

1 个答案:

答案 0 :(得分:0)

我认为问题在于,createTab回调向该选项卡发送消息之前,您的内容脚本尚未完成在新选项卡中的加载,因此该内容脚本未收到该消息。

您可以让内容脚本在加载时从后台页面请求新标题,或者可以侦听新选项卡以完成加载,然后将消息发送到选项卡。后一种方法可能类似于:

var tabIdsToTitles = {};

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo) {
  if (tabIdsToTitles[tabId] && changeInfo.status === 'complete') {
    chrome.tabs.sendMessage(tabId, {getTitle: tabIdsToTitles[tabId]}, function(response){});
  }
});

function createTab(group, i, j)
{
    chrome.tabs.create({"url": group["tabUrls" + i][j], "active": false}, function(tab)
    {
        var tabTitle = group["tabNames" + i][j];
        tabIdsToTitles[tab.id] = tabTitle;
    })
}

在重现您的问题后,我测试了这种方法,并且有效。

您还可以为创建的每个选项卡添加一个侦听器,然后在该选项卡加载后将消息发送到该选项卡后将其删除,以免让该侦听器在对无关的选项卡进行更改时不必要地运行。