diff --git a/packages/analytics/src/events/_keys.ts b/packages/analytics/src/events/_keys.ts index 5ca686b6be7d8d85135e93915be25c8c2cc03440..ed4df7df5800a2fc10931b46b7279907feedad3d 100644 --- a/packages/analytics/src/events/_keys.ts +++ b/packages/analytics/src/events/_keys.ts @@ -4,4 +4,5 @@ export const OpenEventKeys = { LCP: '$LCP', INP: '$INP', PageClick: '$PageClick', + PageScroll: '$PageScroll', }; diff --git a/packages/analytics/src/events/page-scroll.ts b/packages/analytics/src/events/page-scroll.ts new file mode 100644 index 0000000000000000000000000000000000000000..53689948e67ce299bde24001ef68b50cd71c3020 --- /dev/null +++ b/packages/analytics/src/events/page-scroll.ts @@ -0,0 +1,39 @@ +import { EventContent } from '../types'; +import { OpenEventKeys } from './_keys'; + +function handleScroll() { + const scrollTop = window.scrollY; // 当前滚动位置 + const windowHeight = window.innerHeight; // 窗口高度 + const documentHeight = document.documentElement.scrollHeight; // 文档总高度 + + // 计算滚动深度百分比,保留两位小数 + const scrollDepth = (((scrollTop + windowHeight) / documentHeight) * 100).toFixed(2); + return { + $url: window.location.href, + $scrollTop: scrollTop, + $windowHeight: windowHeight, + $documentHeight: documentHeight, + $scrollDepth: `${scrollDepth}%`, + }; +} + +export default { + event: OpenEventKeys.PageScroll, + collector: (onCollect: (data: EventContent, e: Event) => void, options?: { delay: Millisecond }) => { + const { delay = 800 } = options || {}; + let debounceId = 0; + window.addEventListener( + 'scroll', + (e) => { + clearTimeout(debounceId); + debounceId = globalThis.setTimeout(async () => { + const data = handleScroll(); + onCollect?.(data, e); + }, delay); + }, + { + capture: true, + } + ); + }, +}; diff --git a/packages/analytics/test/main.ts b/packages/analytics/test/main.ts index 2ccd9bcbad58e590b458ea8a06838b3bfec779ae..0e1b765b1bb8c9aa51faa6c170c04794c1888edd 100644 --- a/packages/analytics/test/main.ts +++ b/packages/analytics/test/main.ts @@ -58,6 +58,21 @@ oa.report( } ); +oa.report( + OpenEventKeys.PageScroll, + (e: Event) => { + return { + scrollDepth: '200%', // 覆盖默认值 + isTrusted: e.isTrusted, + }; + }, + { + eventOptions: { + delay: 1000, // 指定点击防抖时间,不传默认800 + }, + } +); + btn1?.addEventListener('click', () => { // window.open('/'); console.log('btn1 clicked'); diff --git a/packages/demo/src/view/TheText.vue b/packages/demo/src/view/TheText.vue index 5254eeef6cd1c3a9f23cbb2bd4be3381714ba7ac..b7bc8bf9eea35721146c1f9f5d443d81d6beb783 100644 --- a/packages/demo/src/view/TheText.vue +++ b/packages/demo/src/view/TheText.vue @@ -1,6 +1,20 @@ - +