DurationTracker 使用文档
简介
DurationTracker 是一个用于统计页面元素曝光时长或页面总浏览时长的 JS 插件。支持自动监听元素进入/离开可视区、页面切换、最小化、关闭、bfcache 等,适合前端埋点、曝光统计等需求。另外还自己封装了请求。
安装
Using npm:
npm i --save duration-tracker
快速开始
import { DurationTracker, sendTrackingRequest } from 'duration-tracker';
const tracker = new DurationTracker({
el: document.querySelectorAll('li'),
threshold: 0.5,
interval: 5000,
takeValueType: 'round',
resetStayTimeKey: "browse_duration_second",
resetIdKey: "id",
reportType: ['expose', 'totalTime'],
callback: function(data, extra) {
sendTrackingRequest('url', data).then(res => { ... })
}
});
参数说明
DurationTracker(Object),返回当前实例
| el | 监听的元素集合 | NodeList/Array/Element | 可选 |
| threshold | 可见比例阈值(0~1) | Number | 0.5 |
| interval | 上报间隔(ms) | Number | 5000 |
| takeValueType | 时长取整方式(ceil/floor/round) | String | 'round' |
| resetStayTimeKey | 上报时长字段名 | String | 'stay_time' |
| resetIdKey | 元素唯一标识字段名 | String | 'id' |
| reportType | 上报类型数组('expose'/'totalTime') | Array | ['expose'] |
| callback | 上报回调函数 | Function | null |
sendTrackingRequest(url, data, [fetchType]),返回Promise对象
| url | 接口 | String | - 必要 |
| data | 入参 | Object | - 必要 |
| fetchType | 请求类型 | String | - 可选,beacon:sendBeacon类型,fetch:fetch类型; |
回调参数
DurationTracker.callback
data:上报的统计数据(数组或对象,视 reportType 而定)
extra:附加信息,包括 baseInfo(设备、浏览器、页面等)、pageStatus(show/hide)
sendTrackingRequest.promise
promise:返回接口结果。如果是sendBeacon,只能返回true/false。如果是fetch,则返回接口结果。
常用方法
-
tracker.destroyWatch()
停止监听和上报。停止瞬间会返回当前统计的数据。
-
tracker.restartWatch(newElements)
重新启动监听。[newElements],可选,传入新监听的元素;不传则监听已有元素。
-
tracker.updatedDomWatch(newElements)
更新监听元素(如分页/懒加载后)。元素有变更时,请调用此方法。newElements,必传,监听的所有元素。
-
tracker.runReport()
立即上报一次。
设备、系统、浏览器信息
插件会自动采集以下信息并在回调 extra.baseInfo 中返回:
- 设备类型(device_type)
- 操作系统及版本(os, os_version)
- 浏览器及版本(browser, browser_version)
- 页面URL、referrer、屏幕分辨率、网络类型等
事件兼容性
- 自动兼容页面切换、最小化、关闭、bfcache 场景,保证数据完整上报。
- 内部已做防抖/节流处理,避免重复上报。
- sendTrackingRequest支持优先使用sendBeacon,如入不支持则降级为fetch,所以建议不配置[fetchType]
示例
const tracker = new DurationTracker({
el: [...document.querySelectorAll('li'), document.geElementById('xxx')],
reportType: ['expose', 'totalTime'],
callback: function(data, extra) {
sendTrackingRequest('url', data).then(res => { ... })
}
});
<ul>
<li data-id="1"></li>
<li data-id="2"></li>
</ul>
注意事项
- 如有分页/懒加载,需在新元素渲染后调用
updatedDomWatch 方法。
- 销毁监听后如需恢复,调用
restartWatch。
- 支持多实例并行使用。
- 建议用 Navigator.sendBeacon进行接口上报,此方法在关闭页面后仍会把数据发送完成。插件内部封装了 Navigator.sendBeacon和fetch的请求sendTrackingRequest。