chrome访问浏览器历史记录

low*_*key 2 javascript google-chrome-extension

我正在尝试使用带弹出页面的浏览器操作访问Chrome中的浏览器历史记录.

var histories = [];
var visits = [];

chrome.history.search({'text':'', 'maxResults':0}, function(historyItems){
    for(var h in historyItems){
        histories.push({'id': h.id, 'url':h.url});
    }
});

for(var h in histories){
    chrome.history.getVisits({'url': h.url, function(visitItems){
        for(var v in visitItems){
            var id = v.id;
            var visitId = v.visitId;
            var visitTime = v.visitTime;
            var referringVisitId = v.referringVisitId;
            var transition = v.transition;
            visits.push({'id': v.id, 'visitId': v.visitId, 'visitTime': v.visitTime, 'referringVisitId': v.referringVisitId, 'transition':v.transition});
        }
    });
}

console.log(histories.length + ' histories');
console.log(visits.length + ' visits');
Run Code Online (Sandbox Code Playgroud)

结果我得到234个历史记录和0次访问.我怎么能有一堆没有访问的页面?我究竟做错了什么?

小智 7

您的代码不起作用的原因是对chrome.history的调用的异步性质.

您实际上是在尝试迭代历史[],然后返回chrome.history.search.这意味着那时的历史[]仍然是一个空数组.最终的console.log确实打印出超过0个历史记录吗?无论如何,这是一个竞争条件.

你需要做的是从chrome.history.search中调用回调函数中的chrome.history.getVisits.

这是一种方法:

var histories = [];
var visits = [];

chrome.history.search({text:'', maxResults:0}, function(historyItems) {
    var historiesProcessed = 0;
    for (var i = 0; i < historyItems.length; i++) {
        histories.push(historyItems[i]);
        chrome.history.getVisits({url: historyItems[i].url}, function(visitItems) {
            for (var i = 0; i < visitItems.length; i++) {
                visits.push(visitItems[i]);
            }
            historiesProcessed++;
            if (historiesProcessed === historyItems.length) {
                console.log(visits.length + ' visits');
            }
        });
    }
    console.log(histories.length + ' histories');
});
Run Code Online (Sandbox Code Playgroud)

这不是最漂亮的代码,但它可以工作,你可以重构它看起来更好.

我不确定你是否可以在弹出页面中访问chrome.history(在测试时让我知道),但它肯定会在后台页面中运行,你可以将结果传递给弹出窗口.