摘要:列表頁曝光埋點(diǎn)實(shí)現(xiàn)以商品為例要求商品一半以上出現(xiàn)在視窗中時(shí)上報(bào)該行的商品快速滑動過去的商品不上報(bào)滑動過程中如果一行商品一直未消失在視野中一半以上,不能重復(fù)上報(bào)滑出視野的商品,再次滑入視野時(shí)需要再次上報(bào)分析需要以下信息商品所在行的高度固定值商
列表頁曝光埋點(diǎn)實(shí)現(xiàn)
以商品為例要求
商品一半以上出現(xiàn)在視窗中時(shí) 上報(bào)該行的商品
快速滑動過去的商品不上報(bào)
滑動過程中如果一行商品一直未消失在視野中(一半以上),不能重復(fù)上報(bào)
滑出視野的商品,再次滑入視野時(shí)需要再次上報(bào)
分析實(shí)現(xiàn)需要以下信息
商品所在行的高度rowHeight(固定值)
商品的可視區(qū)域的高度contentHeight(半固定值,不考慮瀏覽器的resize)
可視區(qū)域距離視窗頂部的高度headHeight(固定值)
content的滾動高度(與scroll事件相關(guān),考慮到滑動快時(shí)不觸發(fā)上報(bào),需要throttle)
/** * 滾動事件處理 * @param {number} headHeight content區(qū)域距離頂部的高度 * @param {number} rowHeight 每一行的高度 * @returns {Function} */ export function handleScroll(headHeight, rowHeight) { let lastActive = [] let deactived = [] /** * @param {number} contentTop 區(qū)域的top值 * @return {Array} 當(dāng)前活躍的的行 */ return function(contentTop) { let topDiff = contentTop - headHeight // 可視區(qū)域高度 let visibleHeight = window.innerHeight - (topDiff <= 0 ? headHeight : contentTop) /** * 當(dāng)前能顯示的行數(shù) * 顯露一半就需要上報(bào) 則使用四舍五入 */ let rowCount = Math.round(visibleHeight / rowHeight) /** * 獲取當(dāng)前顯示的下標(biāo) */ let index = topDiff > 0 ? 0 : Math.round(-topDiff / rowHeight) let _active = Array.from({ length: rowCount }).reduce( (pre, cur, i) => pre.concat(index + i), [] ) /** * 之前上報(bào)過,未從屏幕上消失過的 不上報(bào) * 之前上報(bào)過,從屏幕中消失又出現(xiàn)的 上報(bào) */ let active = _active.filter( v => !lastActive.includes(v) || deactived.includes(v) ) /** * 收集非活躍狀態(tài)的行,只收集滾上去的元素,active下面的行屬于待活躍狀態(tài),由于和行的總數(shù)相關(guān)(商品的總行數(shù)知道與否不影響上報(bào)),會額外增加不必要的工作 所以此處不做考慮 */ deactived = Array.from({ length: index }).map((val, i) => i) /** * 上次活躍的行,用來避免重復(fù)上報(bào) */ lastActive = [].concat(deactived).concat(_active) return { lastActive, active, deactived } } }圖示 使用
let target = document.getElementById("wrapper") let onScroll = handleScroll(100, 420) let _scroll = _.throttle(function(){ let row = onScroll(target.getBoundingClientRect().y) // 此時(shí)row.active就是需要上報(bào)的行的下標(biāo),active可能為空數(shù)組 ... }, 1000) target.addEventListener("scroll", _scroll)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/99456.html
摘要:列表頁曝光埋點(diǎn)實(shí)現(xiàn)以商品為例要求商品一半以上出現(xiàn)在視窗中時(shí)上報(bào)該行的商品快速滑動過去的商品不上報(bào)滑動過程中如果一行商品一直未消失在視野中一半以上,不能重復(fù)上報(bào)滑出視野的商品,再次滑入視野時(shí)需要再次上報(bào)分析需要以下信息商品所在行的高度固定值商 列表頁曝光埋點(diǎn)實(shí)現(xiàn) 以商品為例 要求 商品一半以上出現(xiàn)在視窗中時(shí) 上報(bào)該行的商品 快速滑動過去的商品不上報(bào) 滑動過程中如果一行商品一直未消失在視...
獲取用戶的交互習(xí)慣及喜好,進(jìn)一步提升轉(zhuǎn)化率,可以在之前的埋點(diǎn)方案實(shí)現(xiàn)中,都是在具體的按鈕或者圖片被點(diǎn)擊或者被曝光時(shí)主動通過事件去上報(bào)埋點(diǎn)。但這種方法適合在埋點(diǎn)比較少時(shí)還行的項(xiàng)目,遇見項(xiàng)目中需要大量埋點(diǎn)時(shí),添加的代碼就太多了,就會埋點(diǎn)邏輯與業(yè)務(wù)邏輯的高耦合。 由此需要換種方式。我先給大家普及下埋點(diǎn)上報(bào)方式都有哪些? 手動埋點(diǎn) 可視化埋點(diǎn) 無痕埋點(diǎn) 手動埋點(diǎn),顧名思義就是純手動寫代碼,調(diào)...
摘要:進(jìn)行數(shù)據(jù)上報(bào)的時(shí)候,經(jīng)常會遇到列表數(shù)據(jù)曝光上報(bào)的問題,只對在當(dāng)前可視范圍內(nèi)的數(shù)據(jù)內(nèi)容進(jìn)行曝光上報(bào),而對于未在可視范圍內(nèi)的數(shù)據(jù)不進(jìn)行曝光上報(bào),等待用戶滾動頁面或者區(qū)域使元素出現(xiàn)在可視范圍內(nèi)時(shí)才進(jìn)行曝光上報(bào)。 進(jìn)行數(shù)據(jù)上報(bào)的時(shí)候,經(jīng)常會遇到列表數(shù)據(jù)曝光上報(bào)的問題,只對在當(dāng)前可視范圍內(nèi)的數(shù)據(jù)內(nèi)容進(jìn)行曝光上報(bào),而對于未在可視范圍內(nèi)的數(shù)據(jù)不進(jìn)行曝光上報(bào),等待用戶滾動頁面或者區(qū)域使元素出現(xiàn)在可視范...
摘要:一埋點(diǎn)架構(gòu)設(shè)計(jì)埋點(diǎn)的核心邏輯抽象將生產(chǎn)的用戶數(shù)據(jù)組織發(fā)送給服務(wù)器。普通埋點(diǎn)定義頁面進(jìn)入,頁面離開,頁面元素點(diǎn)擊,頁面元素曝光。無埋點(diǎn)進(jìn)入退出都使用,如何區(qū)分增加了一個(gè)字段,用表示頁面進(jìn)入退出。如何修改字節(jié)碼庫基礎(chǔ)使用。 一、埋點(diǎn)架構(gòu)設(shè)計(jì) 埋點(diǎn)的核心邏輯抽象:將APP生產(chǎn)的用戶數(shù)據(jù)組織發(fā)送給服務(wù)器。showImg(https://segmentfault.com/img/bVba4Lw?...
閱讀 2436·2021-11-23 09:51
閱讀 2465·2021-11-11 17:21
閱讀 3107·2021-09-04 16:45
閱讀 2390·2021-08-09 13:42
閱讀 2227·2019-08-29 18:39
閱讀 2894·2019-08-29 14:12
閱讀 1296·2019-08-29 13:49
閱讀 3372·2019-08-29 11:17