0

我的chrome.tabs.query代碼在調試器中查找我的擴展時似乎沒有執行。我正在嘗試使用chrome.storage API來記錄訪問nytimes.com文章的次數,並且由於我在開始時添加了chrome.storage代碼,因此調試器似乎不會進入chrome.tabs.query功能。自chrome.storage加入後代碼看起來沒有執行

var nytCount = chrome.storage.local.get["nyt"]; 

// if nytCount doesn't exist in chrome local storage, set to 0 
if (nytCount === undefined) 
{ 
    nytCount = 0; 
} 


/* 
* Below is adapted from user Rob W at Stack Overflow (http://stackoverflow.com/questions/10413911/how-to-get-the-currently-opened-tabs-url-in-my-page-action-popup/10417327#10417327) 
* 
// Gets URL from currently active window (this should all be onload I suspect)*/ 
chrome.tabs.query({ 
    // Select active tabs 
    active: true, 
    // In the current window        
    windowId: chrome.windows.WINDOW_ID_CURRENT 
}, function(array_of_Tabs) { 
    // Since there can only be one active tab in one active window, the array has only one element 
    var tab = array_of_Tabs[0]; 
    var title = tab.title; 

    if (title.indexOf("NYTimes.com") !== -1) 
    { 
     nytCount++; 
    } 

    // rest of if conditions for those sites that have identifiers in tab titles 
}); 

alert(nytCount); 

任何想法?在我將nytCount初始化爲0之前,它工作得很好,但是當然它的值只能在下一次代碼重新初始化之前上升到1。

回答

1

chrome.tabs.query只應在您要立即查詢標籤狀態時使用。

要監視您訪問網站的頻率,請使用chrome.tabs events之一,例如chrome.tabs.onUpdated。爲避免重複計算,您應該檢查changeInfo.status屬性是否「完整」。

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) { 
    var url = changeInfo.url; // String or undefined 
    if (changeInfo.status == 'complete' && url && url.indexOf("nytimes.com") !== -1) { 
     // TODO: increase counter by one 
    } 
}); 

您的下一個問題是如何使用chrome.storage。它是一個異步API,因此您不能使用getter來讀取實際值。此外,這些值在閱讀後不會神奇地保存在存儲器中。

對於儲存櫃檯,我推薦localStorage超過chrome.storage。它是一個同步API,非常適合存儲少量數據(如計數器)。只有字符串可以存儲,所以要確保你投的價值爲數字閱讀後:

var nytCount = +localStorage.getItem('nyt') || 0; 

// Whenever you want to increase the counter: 
localStorage.setItem('nyt', ++nytCount); 

這假定只有一個頁面與紐約時報變量相互作用。當使用變量(讀/寫)由多個頁面(例如期權+背景頁),你不能依賴於一個局部變量,並具有讀取寫入前的最新值:

localStorage.setItem('nyt', (+localStorage.getItem('nyt') || 0) + 1); 

如果你想採取異步路由(chrome.storage),您可以讀取負載值(並推遲/排隊chrome.tabs.onUpdated事件),或總是讀+寫上更新計數器:

chrome.storage.local.get('nyt', function(items) { 
    var nyt = items.nyt || 0; 
    chrome.storage.local.set({ 
     nyt: nyt + 1 
    }, function() { 
     // Only here, you can be certain that the value has been saved 
     // Usually less than one millisecond 
    }); 
}); 
+0

謝謝,羅布 - 你很有幫助! 「+」是什麼意思在「var nytCount = + localStorage.getItem('nyt')|| 0;」? – Zhankfor 2013-02-28 18:29:24

+1

@Zhankfor它「將」值轉換爲數字。 'localStorage.getItem('nyt')'可以返回'null'。 +0會返回0.它也可能包含一個無效的值,比如一個字符串。在這種情況下,一元'+'運算符會返回'NaN'。 '0'和'NaN'都是錯誤的,所以當OR運算符進入時,右邊的表達式被計算出來,它是0.最終的結果是有效的字符串被轉換爲數字,無效的數字被替換爲零。 – 2013-02-28 18:32:40

+0

再次感謝。我已經使用了你的代碼,但是調試器似乎並不想在「chrome.storage.local.get('nyt',函數(items)」)之後進入花括號。現在看起來像這樣: 'var nytCount = + localStorage。getItem('nyt')|| 0; console.log(nytCount); chrome.tabs.onUpdated.addListener(功能(tabId,changeInfo,標籤) { 變種URL = changeInfo.url; //字符串或未定義 如果(changeInfo.status == '完成' && URL &&網址。的indexOf( 「NYTimes.com」)== -1){ localStorage.setItem( '紐約時報',++ nytCount);} !' (抱歉它是如此凌亂) – Zhankfor 2013-02-28 18:44:12

1

那麼我看到的主要問題是,chrome.storage.local.get調用是異步的,並有一個所需的回調。嘗試將其更改爲這樣的事情:

var nytCount = 0; 
chrome.storage.local.get("nyt", function(items) { 
    doStuff(items.nyt); 
    // items.nyt is the value you want out of this 
}); 

function doStuff(nyt){ 
    nytCount = nyt; 
    if(nytCount == undefined) 
    nytCount = 0; 
    //put the rest of your code in here 
    //so that it all runs after you get the number out of storage 
} 

不要忘了更新你與chrome.storage.local.set調用存儲具有的價值。對於那個回調是可選的。