chrome.storage.local.get回调函数出错

时间:2013-12-08 14:10:40

标签: google-chrome-extension

我正在制作一个谷歌浏览器扩展程序,隐藏/显示某个域上的菜单栏,并记住每页是否应该隐藏它。为了永久保存,我使用了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);
});

1 个答案:

答案 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。