2021-06-15 17:17:20 +08:00

103 lines
2.5 KiB
TypeScript

/**
* 定义基础配置
* 官方文档 https://tongji.baidu.com/open/api/more?p=guide_overview
*/
class BAIDU {
siteId: string
isDebug: boolean
constructor(siteId: string = '', isDebug: boolean = false) {
this.siteId = siteId
this.isDebug = isDebug
}
/**
* 初始化
*/
init() {
window._hmt = window._hmt ? window._hmt : []
const SCRIPT = document.createElement('script')
SCRIPT['async'] = true
SCRIPT['src'] = `https://hm.baidu.com/hm.js?${this.siteId}`
document.querySelector('head')?.appendChild(SCRIPT)
if (this.isDebug) {
console.log(
`[vue-baidu-analytics] siteId load done.\nsiteId: ${this.siteId}`
)
}
}
/**
* 设置要响应的站点
*/
setAccount() {
window._hmt.push(['_setAccount', this.siteId])
}
/**
* 提交PV、UV
*/
trackPageview(pageUrl: string) {
// 如果页面链接没传或者无效链接,则默认为根域名
if (!pageUrl || typeof pageUrl !== 'string') {
pageUrl = '/'
}
// 如果页面链接带上了域名,则需要过滤掉
if (pageUrl.startsWith('http')) {
const PAGE_CUT = pageUrl.split('/')
const HOST_NAME = `${PAGE_CUT[0]}//${PAGE_CUT[2]}`
pageUrl = pageUrl.replace(HOST_NAME, '')
}
// 设置响应 id 并提交数据
this.setAccount()
window._hmt.push(['_trackPageview', pageUrl])
if (this.isDebug) {
console.log(
`[vue-baidu-analytics] track pv done.\nsiteId: ${this.siteId}\npageUrl: ${pageUrl}`
)
}
}
/**
* 提交点击事件
*/
trackEvent(category: string, action: string, label: string, value: number) {
// 前两个是必填项
if (
typeof category !== 'string' ||
typeof action !== 'string' ||
!category ||
!action
) {
throw new Error(
'[vue-baidu-analytics] Missing necessary category and operation information, and must be of type string.'
)
}
// 重置一些无效的默认值
if (!label || typeof label !== 'string') {
label = ''
}
if (!Number(value)) {
value = 1
}
// 设置响应id并提交数据
this.setAccount()
window._hmt.push(['_trackEvent', category, action, label, value])
if (this.isDebug) {
console.log(
`[vue-baidu-analytics] track event done.\nsiteId: ${this.siteId}\ncategory: ${category}\naction: ${action}\nlabel: ${label}\nvalue: ${value}`
)
}
}
}
export default BAIDU