创建一组选项卡后,我想使用保存在存储中的名称重命名它们。我正在尝试使用chrome.tabs.create
的回调函数将消息发送到内容脚本以重新命名选项卡。我可以创建标签,但无法重命名标签。
在popup.js
中,我有一个循环遍历所有选项卡,并在chrome.tab.create
中调用background.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});
}
}
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){});
})
}
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse)
{
if (request.title || request.name || request.getTitle)
{
document.title = request.title || request.name || request.getTitle;
}
})
答案 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;
})
}
在重现您的问题后,我测试了这种方法,并且有效。
您还可以为创建的每个选项卡添加一个侦听器,然后在该选项卡加载后将消息发送到该选项卡后将其删除,以免让该侦听器在对无关的选项卡进行更改时不必要地运行。