前言
小程序由于封閉性較強,要像web應用一樣實現靈活的數據收集,會有一定難度。目前開源的埋點SDK,一般采用手動埋點的方式,這種方式有較強的侵入型,為了解決這個問題就有了該文章。
手動埋點
以騰訊移動分析的SDK為例,如果要記錄埋點信息,只要插入一句代碼即可
// 例如,記錄搜索行為search(keyword) { if (keyword) { ...業務代碼 } mta.Event.stat("ico_search", {"query":keyword});}示例代碼看起來是比較簡潔的,但是埋點需要收集的數據往往不是單一的,復雜的埋點代碼插入業務代碼,會 影響代碼的閱讀體驗 ,而且 埋點代碼散落在各個地方,不方便管理 。
由于手動埋點必須插入到函數中,有時候我們為了獲取頁面某一元素點擊信息,產生了一種叫無業務相關埋點,簡單來說就是你的函數定義,就只有埋點代碼,當這種埋點頻繁出現, 代碼會被嚴重污染 。
// wxml<view bindtap="track">這只是一個展示view</view>
//js track() { mta.Event.stat("eleClick", {"name":xxxxx});}另外,由于PM會頻繁調整埋點信息,而 埋點是一個繁瑣又無聊的工作 ,基于Don't Repeat Yourself 原則,手動埋帶要不得。
總結以上,手動埋點有下列問題
影響代碼的閱讀體驗 埋點代碼散落在各個地方,不方便管理 代碼會被污染 埋點是一個繁瑣又無聊的工作自動埋點
實現思路:監聽用戶點擊-->讀取埋點配置JOSN,判斷是否需要上報--> 上報數據
1、小程序監聽用戶點擊行為
web應用監聽用戶點擊行為是比較容易,但是小程序沒有提供Dom的事件監聽,不過我們可以通過事件冒泡的方式捕獲。
// web監聽頁面點擊document.addEventListener('click',(e) => {console.log(e)})// 小程序監聽頁面點擊,用戶的點擊行為都會執行elementTracker方法<view catchtap='elementTracker'> <view class='buy-now'> <button bindtap='buy' animation="{{scaleAnim}}">立即購票</button> </view></view>2、判斷點擊位置是否落在監聽元素中
假設需要監聽用戶是否點擊class為buy-now元素,可以通過獲取buy-now元素長寬,定位和點擊位置坐標判斷是否出現重疊,以判斷是否被點擊。
/** * 判斷點擊是否落在目標元素 * @param {Object} clickInfo 用戶點擊坐標 * @param {Object} boundingClientRect 目標元素信息 * @param {Object} scrollOffset 頁面位置信息 * @returns {Boolean} */export const isClickTrackArea = function (clickInfo, boundingClientRect, scrollOffset) { if (!boundingClientRect) return false; const { x, y } = clickInfo.detail; // 點擊的x y坐標 const { left, right, top, height } = boundingClientRect; const { scrollTop } = scrollOffset; if (left < x && x < right && scrollTop + top < y && y < scrollTop + top + height) { return true; } return false;};
新聞熱點
疑難解答
圖片精選