最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

小程序從手動埋點(diǎn)到自動埋點(diǎn)的實(shí)現(xiàn)方法

 更新時間:2019年01月24日 14:11:47   作者:蟹老板愛寫代碼  
這篇文章主要介紹了小程序從手動埋點(diǎn)到自動埋點(diǎn)的實(shí)現(xiàn)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

前言

小程序由于封閉性較強(qiáng),要像web應(yīng)用一樣實(shí)現(xiàn)靈活的數(shù)據(jù)收集,會有一定難度。目前開源的埋點(diǎn)SDK,一般采用手動埋點(diǎn)的方式,這種方式有較強(qiáng)的侵入型,為了解決這個問題就有了該文章。

手動埋點(diǎn)

以騰訊移動分析的SDK為例,如果要記錄埋點(diǎn)信息,只要插入一句代碼即可

// 例如,記錄搜索行為
search(keyword) {
  if (keyword) {
    ...業(yè)務(wù)代碼
  }
  mta.Event.stat("ico_search", {"query":keyword});
}

示例代碼看起來是比較簡潔的,但是埋點(diǎn)需要收集的數(shù)據(jù)往往不是單一的,復(fù)雜的埋點(diǎn)代碼插入業(yè)務(wù)代碼,會 影響代碼的閱讀體驗(yàn) ,而且 埋點(diǎn)代碼散落在各個地方,不方便管理 。

由于手動埋點(diǎn)必須插入到函數(shù)中,有時候我們?yōu)榱双@取頁面某一元素點(diǎn)擊信息,產(chǎn)生了一種叫無業(yè)務(wù)相關(guān)埋點(diǎn),簡單來說就是你的函數(shù)定義,就只有埋點(diǎn)代碼,當(dāng)這種埋點(diǎn)頻繁出現(xiàn), 代碼會被嚴(yán)重污染 。

// wxml
<view bindtap="track">這只是一個展示view</view>
//js 
track() {
 mta.Event.stat("eleClick", {"name":xxxxx});
}

另外,由于PM會頻繁調(diào)整埋點(diǎn)信息,而 埋點(diǎn)是一個繁瑣又無聊的工作 ,基于Don't Repeat Yourself 原則,手動埋帶要不得。

總結(jié)以上,手動埋點(diǎn)有下列問題

  • 影響代碼的閱讀體驗(yàn)
  • 埋點(diǎn)代碼散落在各個地方,不方便管理
  • 代碼會被污染
  • 埋點(diǎn)是一個繁瑣又無聊的工作

自動埋點(diǎn)

實(shí)現(xiàn)思路:監(jiān)聽用戶點(diǎn)擊-->讀取埋點(diǎn)配置JOSN,判斷是否需要上報(bào)--> 上報(bào)數(shù)據(jù)

1、小程序監(jiān)聽用戶點(diǎn)擊行為

web應(yīng)用監(jiān)聽用戶點(diǎn)擊行為是比較容易,但是小程序沒有提供Dom的事件監(jiān)聽,不過我們可以通過事件冒泡的方式捕獲。

// web監(jiān)聽頁面點(diǎn)擊
document.addEventListener('click',(e) => {console.log(e)})

// 小程序監(jiān)聽頁面點(diǎn)擊,用戶的點(diǎn)擊行為都會執(zhí)行elementTracker方法
<view catchtap='elementTracker'>
 <view class='buy-now'>
   <button bindtap='buy' animation="{{scaleAnim}}">立即購票</button>
 </view>
</view>

2、判斷點(diǎn)擊位置是否落在監(jiān)聽元素中

假設(shè)需要監(jiān)聽用戶是否點(diǎn)擊class為buy-now元素,可以通過獲取buy-now元素長寬,定位和點(diǎn)擊位置坐標(biāo)判斷是否出現(xiàn)重疊,以判斷是否被點(diǎn)擊。

/**
 * 判斷點(diǎn)擊是否落在目標(biāo)元素
 * @param {Object} clickInfo 用戶點(diǎn)擊坐標(biāo)
 * @param {Object} boundingClientRect 目標(biāo)元素信息
 * @param {Object} scrollOffset 頁面位置信息
 * @returns {Boolean}
 */
export const isClickTrackArea = function (clickInfo, boundingClientRect, scrollOffset) {
  if (!boundingClientRect) return false;
  const { x, y } = clickInfo.detail; // 點(diǎn)擊的x y坐標(biāo)
  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;
};

3、通過配置表聲明埋點(diǎn)

為了解決代碼入侵問題,可以將所有埋點(diǎn)信息統(tǒng)一管理,通過配置表的方式,除了方便管理,以后還可以做到動態(tài)配置,在服務(wù)端配置完畢下發(fā)到客戶端。

const tracks = {
 path: 'pages/film/detail',
 elementTracks: [
  {
   element: '.buy-now', // 聲明需要監(jiān)聽的元素
   dataKeys: ['film.filmId'], // 聲明需要獲取Data下的哪些數(shù)據(jù)
  },
 ]
};

4、對頁面函數(shù)埋點(diǎn)

有些場景我們除了對頁面元素點(diǎn)擊埋點(diǎn),還要對頁面函數(shù)進(jìn)行埋點(diǎn),例如用戶下拉刷新的時候,可以對原方法進(jìn)行包裝,插入埋點(diǎn)代碼。

rewritePage() {
  const originPage = Page;
  Page = (page) => {
   Object.keys(page).forEach((methodName) => {
    // 執(zhí)行埋點(diǎn)邏輯
    typeof page[methodName] === 'function' && this.recordPageFn(page, methodName);
   });
   // 執(zhí)行原Page對象
   return originPage(page);
  };
 }

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • javascript實(shí)現(xiàn)復(fù)選框選中屬性

    javascript實(shí)現(xiàn)復(fù)選框選中屬性

    本文給大家介紹的是一篇國外網(wǎng)友寫的博客,講解的是關(guān)于實(shí)現(xiàn)復(fù)選框選中屬性的問題,感覺非常不錯,翻譯過來推薦給大家,希望小伙伴們能夠喜歡。
    2015-03-03
  • JavaScript的面向?qū)ο?一)

    JavaScript的面向?qū)ο?一)

    JavaScript的面向?qū)ο?一)...
    2006-11-11
  • JavaScript 的繼承

    JavaScript 的繼承

    大家都知道,C#中使用的是傳統(tǒng)的類繼承是很簡單,但在JS中,可就沒這么簡單了,因?yàn)樗褂玫氖窃?prototype )繼承,實(shí)現(xiàn)起來相對復(fù)雜了一點(diǎn)。
    2011-10-10
  • 詳解webpack babel的配置

    詳解webpack babel的配置

    本篇文章主要介紹了詳解webpack babel的配置,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • cropper.js和exif.js實(shí)現(xiàn)頭像上傳縮放裁剪旋轉(zhuǎn)

    cropper.js和exif.js實(shí)現(xiàn)頭像上傳縮放裁剪旋轉(zhuǎn)

    這篇文章主要為大家詳細(xì)介紹了cropper.js和exif.js實(shí)現(xiàn)頭像上傳縮放裁剪旋轉(zhuǎn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 使用JSX實(shí)現(xiàn)Carousel輪播組件的方法(前端組件化)

    使用JSX實(shí)現(xiàn)Carousel輪播組件的方法(前端組件化)

    做這個輪播圖的組件,我們先從一個最簡單的 DOM 操作入手。使用 DOM 操作把整個輪播圖的功能先實(shí)現(xiàn)出來,然后在一步一步去考慮怎么把它設(shè)計(jì)成一個組件系統(tǒng)
    2021-04-04
  • BootStrap入門學(xué)習(xí)第一篇

    BootStrap入門學(xué)習(xí)第一篇

    這篇文章主要為大家詳細(xì)介紹了BootStrap入門學(xué)習(xí)第一篇,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • JavaScript中子對象訪問父對象的方式詳解

    JavaScript中子對象訪問父對象的方式詳解

    js中雖然沒有傳統(tǒng)面向?qū)ο蟮木幊陶Z言里子類訪問父類的特殊語法,但是我們可以根據(jù)需要造一個,接下來本文給大家分享在JavaScript中子對象訪問父對象的方式,需要的朋友可以參考下
    2016-09-09
  • JavaScript自定義分頁樣式

    JavaScript自定義分頁樣式

    這篇文章主要為大家詳細(xì)介紹了JavaScript自定義分頁樣式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • uniapp中常用的幾種提示彈框

    uniapp中常用的幾種提示彈框

    在前端開發(fā)中,為了優(yōu)化用戶的交互體驗(yàn),常需要用到彈窗來進(jìn)行提示,引導(dǎo)用戶操作,下面這篇文章主要給大家介紹了關(guān)于uniapp中常用的幾種提示彈框的相關(guān)資料,需要的朋友可以參考下
    2022-09-09

最新評論

建昌县| 宜兰县| 桃江县| 万州区| 勐海县| 安平县| 杭锦旗| 甘洛县| 道真| 昭觉县| 吴桥县| 砀山县| 日土县| 伊川县| 济阳县| 肥乡县| 六枝特区| 韶关市| 英吉沙县| 金昌市| 通辽市| 沈丘县| 息烽县| 建宁县| 婺源县| 平利县| 永善县| 泸西县| 田东县| 南澳县| 九江县| 山阳县| 苏尼特右旗| 柘荣县| 虹口区| 崇州市| 日照市| 家居| 达孜县| 彰化市| 沁源县|