埋点上报的数据怎么避免重复发送?
我在做用户行为埋点的时候,发现同一个点击事件有时候会上报多次,比如快速连点按钮,或者组件重复渲染导致监听器被多次绑定。这样后台收到的数据就不准了。
我试过在事件回调里加个标志位防止重复提交,但感觉不太可靠。有没有更稳妥的做法?比如用防抖或者在上报前做去重?
function trackClick(elementId) {
// 每次点击都直接上报
sendBeacon('/log', { event: 'click', element: elementId });
}
document.getElementById('btn').addEventListener('click', () => {
trackClick('submit-btn');
});
方案一:防抖(最简单)
把连续点击合并成一次,等用户停下来再发:
这个适合"连续快速点击只算一次"的场景。
方案二:带唯一ID的去重(更靠谱)
用请求ID + 已发送队列来彻底避免重复:
方案三:结合防抖 + 唯一ID(最稳妥)
另外,组件重复渲染导致监听器多次绑定这个问题,最好从根源解决:
事件委托的好处是无论组件渲染几次,监听器始终只有一个绑定在document或者父容器上,不会重复。
你要是用WordPress的话,可以在插件里把这段逻辑封装一下,用wp_enqueue_script加载,前端直接调用就行。