我正在制作一个谷歌浏览器扩展程序,隐藏/显示某个域上的菜单栏,并记住每页是否应该隐藏它。为了永久保存,我使用了chrome.storage.local API,但现在我收到了这些奇怪的错误。
对storage.get的响应出错:错误:参数1的值无效。 Property'tabId':属性是必需的。 在updateBar(chrome-extension://hoeijlfnppcfdokpgeafimggcbclpfhb/background.js:11:23) at checkForValidUrl(chrome-extension://hoeijlfnppcfdokpgeafimggcbclpfhb/background.js:5:3) 扩展:: sendRequest将:26
奇怪的是,我从不在存储get中请求tabId,而我的回调函数也不需要tabId。似乎这些回调函数的嵌套可能会出错。即使有错误,扩展似乎也很好......
这是我的背景页面:
function checkForValidUrl(tabId, changeInfo, tab) {
if (tab.url.indexOf('http://www.au.dk') > -1) {
// ... show the page action.
chrome.pageAction.show(tabId);
updateBar(false, tab);
}
}
function updateBar(toggle, tab){
chrome.storage.local.get(tab.url, function(res){
var obj = {};
//toggle the visibility if necessary
if(toggle){
console.log(res[tab.url]);
obj[tab.url] = !res[tab.url];
chrome.storage.local.set(obj);
}
else
obj[tab.url] = res[tab.url];
//send request to content page and update pageAction icon
if(obj[tab.url]){
console.log(res[tab.url]);
chrome.tabs.sendRequest(tab.id,{req:"hide"}, function(){});
chrome.pageAction.setIcon({path:"iconShown.png"});
}
else{
chrome.tabs.sendRequest(tab.id,{req:"show"}, function(){});
chrome.pageAction.setIcon({path:"iconHidden.png"});
}
if(res[tab.url] == undefined){
obj[tab.url] = false;
chrome.storage.local.set(obj);
}
});
}
// Listen for any changes to the URL of any tab.
chrome.tabs.onUpdated.addListener(checkForValidUrl);
chrome.pageAction.onClicked.addListener(function(tab) {
updateBar(true, tab);
});
答案 0 :(得分:0)
首先,您使用的是已弃用的 chrome.tabs.sendRequest
,而不是推荐的 chrome.tabs.sendMessage
。
其次,您可能没有意识到单个标签导航操作会触发多个 chrome.tabs.onUpdated
事件。 (例如,当状态是加载时,一个状态完成时,一个 favicon 加载时等)。
在这方面,只有在选项卡加载完成后才能执行检查更有意义(并有助于避免未行为的行为和不必要的工作量):
function checkForValidUrl(tabId, changeInfo, tab) {
if (changeInfo.status !== 'complete') {
/* `.status` is either 'undefined' (meaning the tab's status
* has not changed - maybe it was just the favicon)
* or it equals "loading"
return;
}
if (tab.url.indexOf('http://www.au.dk') > -1) {
...
}
}
最后,关于 chrome.tabs.Tab
的id
属性,请注意:
[...] 在某些情况下,可能无法为Tab分配ID ,例如在使用会话API查询外部选项卡时,在这种情况下可能会出现会话ID。