Web曝光埋點(diǎn)實(shí)現(xiàn)原理

主要用到的API

MutationObserver

MutationObserver 主要提供了DOM節(jié)點(diǎn)增減以及屬性變化檢測(cè)的能力。從下圖可看出大部分瀏覽器對(duì)該API支持良好。

兼容性.png

demo源代碼:https://stackblitz.com/edit/js-ew1sn1?file=index.js

在demo中,當(dāng)點(diǎn)擊 add domremove dom 按鈕時(shí),改變了DOM的結(jié)構(gòu),當(dāng)點(diǎn)擊 change target attribute 按鈕時(shí),改變了DOM的屬性值,都會(huì)觸發(fā) callback。callback 中可以獲取到 mutation 對(duì)象,比較主要的字段:

  • type:改變的類型,childList、attributes
  • addedNodes:增加的DOM
  • removedNodes:移除的DOM
  • target:DOM

IntersectionObserver

IntersectionObserver 主要用來檢測(cè)被監(jiān)聽的目標(biāo)元素可見部分與root元素的交叉狀況,比如獲取相交區(qū)域的比例值,后面做曝光埋點(diǎn)的判斷需要用到。還可以獲取其它信息,https://developer.mozilla.org/zh-CN/docs/Web/API/IntersectionObserverEntry

從下圖可看出有些瀏覽器不支持該API,所以需要引入polyfill,https://github.com/w3c/IntersectionObserver/tree/main/polyfill

兼容性.png

demo源代碼:https://stackblitz.com/edit/js-ozzzjw?file=index.js

見demo源代碼中的options

let options = {
  root: null,
  rootMargin: '0px',
  threshold: [0, 0.5, 1] // 當(dāng)監(jiān)聽對(duì)象的任何閾值被越過時(shí),都會(huì)生成一個(gè)通知(Notification)。
};

demo中的root是瀏覽器窗口,被監(jiān)聽的目標(biāo)元素是橫向的藍(lán)色塊和縱向的藍(lán)色塊。當(dāng)被監(jiān)聽的目標(biāo)元素可見部分與root元素交叉比例越過0 0.5 1時(shí),會(huì)log對(duì)應(yīng)的信息。

requestIdleCallback

使用 requestIdleCallback 方法,瀏覽器會(huì)在空閑時(shí)執(zhí)行傳入的函數(shù)。后面埋點(diǎn)我們使用這個(gè)方法,避免埋點(diǎn)影響主業(yè)務(wù)。

曝光埋點(diǎn)實(shí)現(xiàn)

demo源代碼:https://stackblitz.com/edit/react-hfq33n?file=src%2FApp.js

說明:

  1. 當(dāng)模塊露出大于等于50%時(shí),會(huì)曝光埋點(diǎn),demo中用log代替
  2. 當(dāng)模塊到可視范圍之外,在進(jìn)入可視范圍露出大于等于50%時(shí),會(huì)再次曝光埋點(diǎn)
  3. demo中,模塊藍(lán)邊表示未曝光埋點(diǎn),綠邊表示已曝光埋點(diǎn)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容