在调试器中查找扩展时,我的chrome.tabs.query代码似乎无法执行。我正在尝试使用chrome.storage API来记录访问nytimes.com上文章的次数,因为我在开头添加了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。
答案 0 :(得分: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
电话更新存储空间中的值。对于那个,回调是可选的。
答案 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);
这假设只有一个页面与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
});
});