4.3 历史
历史用于记录用户访问过页面的信息。与书签一样,历史也是浏览器很早就具有的功能,对用户来说也是一个很重要的功能。Chrome提供了history
接口,允许扩展对用户的历史进行管理。
要使用history
接口,需要在Manifest中声明history
权限:
"permissions": [
"history"
]
管理历史的方法包括search
、getVisits
、addUrl
、deleteUrl
、deleteRange
和deleteAll
。其中search
和getVisits
用于读取历史,addUrl
用于添加历史,deleteUrl
、deleteRange
和deleteAll
用于删除历史。
读取历史。Chrome提供了search
和getVisits
两种方法读取历史。通过search
方法可以读取匹配指定文字,指定时间区间,指定条目的历史结果。
chrome.history.search({
text: 'Google',
startTime: new Date().getTime()-24*3600*1000,
endTime: new Date().getTime(),
maxResults: 20
}, function(historyItemArray){
console.log(historyItemArray);
});
上述代码会返回最近24小时内匹配“Google”的20条历史结果。startTime
和endTime
都是距1970年1月1日的毫秒数。返回结果是包含多个historyItem
对象的数组,historyItem
对象包含6个属性,分别是id
、url
、title
、lastVisitTime
、visitCount
和typedCount
,其中typedCount
是用户通过在地址栏键入访问此历史的次数。若不指定text
属性,则返回全部历史结果。
getVisits
方法可以获取指定URL的访问结果。必须指定完整的URL,返回的结果会绝对匹配指定的URL,也就是说,如果指定'http://www.google.com/'
,返回的结果不会包含'http://www.google.com/a/'
的内容。不要忘记http://
,这也是不可省略的。
chrome.history.getVisits(
url: 'http://www.google.com/'
}, function(visitItemArray){
console.log(visitItemArray);
});
返回的结果是包含多个visitItem
对象的数组,visitItem
对象包含5个属性,分别是id
、visitId
、visitTime
、referringVisitId
和transition
。其中id
为与指定URL匹配的对象的id
,对于匹配同一URL的对象拥有相同的id
,visitId
是这个访问结果的id
,visitId
是唯一的。visitTime
同样是毫秒数。transition
是此访问记录打开的方式,具体解释如下。
Chrome对每一个访问记录都详细地归类了打开方式,用transition
属性记录。打开方式一共分为11种,这看起来确实会让人有一些头疼。比较常见的有四种,分别为link
、typed
、reload
和form_submit
。link
是用户通过超级链接打开的方式,typed
是用户通过在地址栏中输入网址打开的方式,reload
是用户通过刷新(包括恢复关闭的标签)打开的方式,form_submit
是通过提交表单打开的方式(通过脚本提交表单的情况不算此方式)。
与浏览器UI和设置相关的有两种,分别为auto_bookmark
和auto_toplevel
。auto_bookmark
是通过浏览器UI中的建议打开的方式——比如通过菜单等。auto_toplevel
为浏览器设置中默认打开的方式,比如浏览器的主页,或者是通过命令行启动时附带的参数。
嵌入式框架相关的有两个,auto_subframe
和manual_subframe
,其中auto_subframe
为自动加载的嵌入式框架打开的方式,很多广告都是这样的打开方式——很多用户并不知道其实那些广告是在一个独立的页面中。manual_subframe
则是用户手动加载的嵌入式框架打开的方式,比如用户操作商品菜单查看不同款式商品页面,就是手动加载嵌入式框架。
最后还有三种是和omnibox搜索建议相关的,分别为generated
、keyword
和keyword_generated
。generated
为通过omnibox给出搜索建议打开的方式,所打开的页面通常为搜索引擎的结果界面。keyword
和keyword_generated
都是通过用户在地址栏中输入的关键字生成的URL访问的方式,但其URL并不是默认搜索引擎生成的(否则就是generated
了)。
添加历史。addUrl
方法可以将特定的url以当前时间为访问时间,添加至历史中。
chrome.history.addUrl({
url: 'http://twitter.com'
}, function(){
console.log('Twitter has been added to history.');
});
删除历史。deleteUrl
可以删除指定URL的历史,deleteRange
可以删除指定时间段的历史,deleteAll
可以删除全部历史。
chrome.history.deleteUrl({
url: 'http://www.google.com'
}, function(){
console.log('Google has been deleted from history.');
});
chrome.history.deleteRange({
startTime: new Date().getTime()-24*3600*1000,
endTime: new Date().getTime()
}, function(){
console.log('History in past 24 hours has been deleted.');
});
chrome.history.deleteAll(function(){
console.log('All history has been deleted.');
});
Chrome提供两个事件,onVisited
和onVisitRemoved
,分别监听用户访问历史和历史被删除的事件。
chrome.history.onVisited.addListener(function(historyItem){
console.log(historyItem);
});
chrome.history.onVisitRemoved.addListener(function(removedObject){
console.log(removedObject);
});
对于onVisitRemoved
事件,返回的removedObject
结果包含两个属性,allHistory
和urls
。其中urls
属性包含所有被删除历史的URL。allHistory
为布尔型,如果所有历史均被删除,allHistory
的值为ture
,同时urls
的值会为一个空数组。
历史和cookies一样都是用户的敏感数据,进行操作时应让用户有知情权,尤其是要将用户历史数据与第三方共享时(包括开发者自己的服务器),一定要先得到用户的同意,并且要让用户得知哪些数据会被使用。