0

デバッガーで拡張機能を検索すると、chrome.tabs.queryコードが実行されないようです。nytimes.comの記事にアクセスした回数をログに記録するためにchrome.storageAPIを試していますが、最初にchrome.storageコードを追加したため、デバッガーがchrome.tabs.queryに入らないようです。働き。

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までしか上がることができませんでした。

4

2 に答える 2

1

chrome.tabs.queryタブの状態をすぐに照会する場合にのみ使用してください。

サイトにアクセスした頻度を監視するには、などのchrome.tabsイベントchrome.tabs.onUpdatedの1つを使用します。二重カウントを回避するには、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であるため、ゲッターを使用して実際の値を読み取ることはできません。さらに、値は読み取り後に魔法のようにストレージに保存されません。

カウンターの保管には、以上をお勧めlocalStoragechrome.storageます。これは同期APIであり、少量のデータ(カウンターなど)を格納するのに適しています。保存できるのは文字列のみなので、以下を読んだ後は必ず値を数値にキャストしてください。

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

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

これは、1つのページのみがnyt変数と相互作用していることを前提としています。変数が複数のページ(オプション+バックグラウンドページなど)で使用(読み取り/書き込み)される場合、ローカル変数に依存することはできず、書き込む前に最新の値を読み取る必要があります。

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
    });
});
于 2013-02-28T12:16:51.643 に答える
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ストレージにある値を呼び出しで更新することを忘れないでください。その場合、コールバックはオプションです。

于 2013-02-28T03:54:02.013 に答える