2010-12-20 113 views
2

我試圖訪問我的瀏覽器歷史鉻,使用瀏覽器操作與彈出頁面。鉻訪問瀏覽器歷史

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'); 

我得到234個歷史記錄和0次訪問。我怎麼能有一堆頁面沒有訪問? 我在做什麼錯?

+0

什麼是* *去錯了嗎?什麼不行? – 2010-12-20 01:12:09

+0

首先,你的前兩行需要終止分號 – Yahel 2010-12-20 01:15:33

+0

我得到234個歷史記錄和0次訪問。我期待着比歷史更多的訪問。 – lowerkey 2010-12-20 01:15:36

回答

1

問題是,這在webkit(chrome,safari e.a)中不起作用。它的缺席(遍歷訪問)修復了一個安全漏洞,它將訪問過的鏈接暴露給任何網站。隨着一些隨機猜測,有可能跟蹤和分析訪問者,這被認爲是隱私泄露。

+0

Mozilla錯誤可以在這裏閱讀:http://hacks.mozilla.org/2010/03/privacy-related-changes-coming-to-css-vistited/這也將在下一個firefox版本中實現。 – xiffy 2010-12-20 01:24:25

+0

那麼如何編寫我的自定義歷史記錄頁面。這不支持在網站上運行,它應該以擴展模式運行。因此它需要清單中的「歷史」權限,因此應該由用戶決定。 – lowerkey 2010-12-20 01:25:15

+0

mozilla bug描述了css:visited,history.getVisits是否展現出相同的行爲? – lowerkey 2010-12-20 01:28:04

1

有一個名爲ClickHint的擴展,它提供了有關訪問過的網站和頁面的統計信息,包括訪問次數和每個頁面花費的時間。據我所知,這需要一個從這一點來看的方法:它在你安裝了擴展之後編譯統計數據,並且只在啓用時加以考慮。也許這種方法也適用於你。

+0

感謝您的信息。我特別喜歡getVisits函數,它會告訴我歷史頁面是如何鏈接到彼此的(用戶是否點擊了一個鏈接來訪問頁面)。ClickHint是否提供了這個功能? – lowerkey 2010-12-20 05:00:04

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'); 
}); 

這不是最漂亮的代碼,但它的工作原理,你可以重構它看起來更好。

我不確定你可以訪問chrome.history在一個彈出頁面(讓我知道當你測試它),但它肯定會從背景頁面工作,你可以將結果傳遞給彈出窗口。

0
chrome.history.search({ 
'text': '',    // Return every history item.... 
'startTime': oneWeekAgo // that was accessed less than one week ago. 
    }, 
    function(historyItems) { 
     console.log(historyItems); 
     document.write(JSON.stringify(historyItems)) 
    }); 

這將只是給visitCount