router.afterEach((to,from) => { Vue.nextTick(() => { sa.quick("autoTrackSinglePage"); }); })
<template> <div class="detail" vkshop-event-scope="detail"> <topBanner title="商品詳情" :gobackShow="true"></topBanner> <div class="navmenu"> <div :class="{'navmenu-btn':true, orange: showPage == 'course'}" @click="showPage = 'course'" vkshop-event-name="showPage_course" vkshop-event-type="click">課程介紹</div> <div :class="{'navmenu-btn':true, orange: showPage == 'teacher'}" @click="showPage = 'teacher'" vkshop-event-name="showPage_teacher" vkshop-event-type="click">師資教學</div> </div> <course v-show="showPage == 'course'" :coursePack="coursePack"></course> <teacher v-show="showPage == 'teacher'"></teacher> <div class="bottom-banner"> <div class="btn" @click="callIM" vkshop-event-name="callIM" vkshop-event-type="click">諮詢</div> <div class="btn-yellow" @click="schedule" v-if="scheduleUrl" vkshop-event-name="schedule" vkshop-event-type="click">預定</div> <div :class="{ 'btn-primary': true, big: !scheduleUrl }" @click="createPackorder" vkshop-event-name="createPackorder" vkshop-event-type="click">馬上下單</div> </div> <personalCenter></personalCenter> </div> </template>
import sa from 'sa-sdk-javascript' let Log = {} /** * 發送 1 條統計事件,把這條統計事件分發到神策 * */ Log.push = function (args) { // debug('log.push', args); // if (isBrowser === false) { return; } if (args[1] == '') { sa.track(args[0]) } else { try { let paramObj = compileParam(args[1]) sa.track(args[0], paramObj) } catch (e) { } } // sa.track(args[0], args[3]) }; let compileParam = function (param) { if (param == '' || param == null || param == undefined) return param; let arr = param.split("&"); let obj = {} arr.forEach(function (v, i) { let arr1 = v.split("="); obj[arr1[0]] = arr1[1]; }) return obj; } /** * 生成1個統計事件監聽函數,要麼是focus、要麼是click,更多的事件須要的時候再支持 * * @param {String} _eventType 須要處理哪一種類型的事件 * @param {Boolean} isGaEnabled 透傳的參數 * @return Function */ var getEventHandler = function (_eventType) { return function (eventTarget) { // // 拿到事件發生的節點 // var eventTarget = e.target, var eventType = eventTarget.getAttribute('vkshop-event-type') || 'click', eventParam = eventTarget.getAttribute('vkshop-event-param') || '', eventName = eventTarget.getAttribute('vkshop-event-name').replace(/(^\s*)|(\s*$)/g, ''); if (eventName && eventType === _eventType) { // 判斷vkshop-event-name 是否爲空,而且類型匹配 // 獲取頁面層級屬性 var scopes = [eventName]; var event = getParents(eventTarget, 'vkshop-event-scope') if (event !== undefined) { var scope = event.getAttribute('vkshop-event-scope').replace(/(^\s*)|(\s*$)/g, '') if (scope) { // 判斷vkshop-event-scope 是否爲空 scopes.push(scope); } scopes.reverse(); // 最前面說明來源是h5 Log.push(['_h5_' + scopes.join('_'), eventParam]); } } }; }; /** * 原生獲取父元素 * @param {*} el * @param {*} attr 屬性,符合條件的屬性 */ function getParents(el, attr) { var parent = el.parentNode if (parent && parent.nodeName == 'BODY') { if (parent.hasAttribute(attr)) { return parent } else { return } } else { if (parent) { // list.push(parent) // 避免有多個vkshop-event-scope if (parent.hasAttribute(attr)) { return parent } else { return getParents(parent, attr) } } else { return } } } /** * 利用事件委託對全部須要自動發送統計事件的節點進行監聽,只能初始化一次 */ var isInitialized = false; Log.init = function () { var ndBody = document.querySelector('body'); var ndNoBubble = document.querySelectorAll('[vkshop-event-no-bubble]'); // 處理能夠冒泡的節點 ndBody.addEventListener('click', function (e) { // 處理選擇符(這樣很差,若是一個a標籤裏面有圖片和文字,點擊到其餘應該觸發到a標籤的) if (e.target.hasAttribute('vkshop-event-name')) { getEventHandler('click')(e.target) } else { var event = getParents(e.target, 'vkshop-event-name') if (event !== undefined) { getEventHandler('click')(event) } } }); // 處理沒法冒泡到頂層的結點點擊 if (ndNoBubble && ndNoBubble.length > 0) { ndNoBubble.addEventListener('click', getEventHandler('click')); } // } }; export default Log
只須要按照這個邏輯,在main.js引入log.js而後init便可javascript
// 神策埋點 const user_id = VueCookies.get('id') // 這個是必需要有惟一的id,能夠取用戶id sa.init({ server_url: 'your url', // 替換成本身的神策地址 heatmap: { //是否開啓點擊圖,默認 default 表示開啓,自動採集 $WebClick 事件,能夠設置 'not_collect' 表示關閉 clickmap:'not_collect', show_log: true, // 打印console,本身配置,能夠看到本身是否踩點成功,以及 //是否開啓觸達注意力圖,默認 default 表示開啓,自動採集 $WebStay 事件,能夠設置 'not_collect' 表示關閉 scroll_notice_map:'not_collect' } }); sa.login(user_id); if (window.$config.env == 'prod') { // 這個地方是看本身的需求加判斷添加 // 神策路由監控頁面跳轉 router.afterEach((to,from) => { Vue.nextTick(() => { sa.quick("autoTrackSinglePage"); }); }) // 點擊事件統計 Log.init() }