前端埋点(tracking)实现多种方式

1.前端埋点是用来跟踪用户行为、事件或页面加载情况的一种技术。

2.第一种方式 静态的tracking.js

   2-1 src=》directives=》tracking.js

// 这个是埋点接口 引入对应的路径即可
import { tracking as trackingApi } from "@/api/tracking";  
import { version } from "../../../package.json";
import store from "@/store";

function tracking(el, bind, vnode) {
  const { value } = bind;
  const { matched, fullPath, meta, params } = vnode.context.$route;
  const names = {
    sysName: "",
    sysTitle: "",
    modName: "",
    modTitle: "",
    pageName: "",
    pageTitle: "",
    actionTitle: "",
  };

  el.addEventListener("click", async () => {
    // const attrName = 'data-title';
    // console.log(el.innerText, el.getAttribute(attrName), el, 333333333)
    let permissionRoutes = store.state.globalState.globalState.permissionRoutes;
    let permissionOperations = store.state.globalState.globalState.permissionOperations;
    let sysGather = [];
    let menuGather = [];
    let authorityGather = [];
    let pageTime = sessionStorage.getItem("pageTime");
    permissionRoutes.forEach((sys) => {
      sysGather.push(sys);
      if (sys.children.length && sys.children.length > 0) {
        sys.children.forEach((menu) => {
          menuGather.push(menu);
          if (menu.children && menu.children.length > 0) {
            menu.children.forEach((auth) => {
              authorityGather.push(auth);
            });
          }
        });
      }
    });
    console.log(sysGather, menuGather, authorityGather, permissionOperations);
    console.log(meta);
    let modTitle = menuGather.find((e) => {
      return e.authorityExplain === meta.modName;
    });
    let actionTitle = permissionOperations.find((e) => {
      return e.authorityExplain === value;
    });
    let pageRef = sessionStorage.getItem("pageRef");
    names.modTitle = modTitle ? modTitle.menuName : "";
    names.actionTitle = actionTitle ? actionTitle.authorityName : "";
    pageTime = Number(new Date().getTime()) - pageTime;

    console.log("---------------");
    console.log(modTitle);
    console.log(menuGather);
    console.log(meta);
    console.log("---------------");

    // const initTime = date()
    // const nameKeys = Object.keys(names);
    // matched.forEach((route, index) => {
    //   const name = nameKeys[index];
    //   names[name] = route.name || '';
    // });
    names.modName = meta.modName || "";
    const clientWidth = document.body.clientWidth;
    const clientHeight = document.body.clientHeight;
    const browser = getBrowserInfo().toString().split("/")[0];
    const browserVersion = getBrowserInfo().toString().split("/")[1];
    try {
      const data = {
        appVersion: version,
        platform: "website",
        appOs: "js",
        resolution: `${clientWidth} * ${clientHeight}`,
        browVersion: `${browser} ${browserVersion}`,
        pageUrl: fullPath,
        pageRef: pageRef || "",
        sysName: "DiscernmentSystem",
        sysTitle: "业务洞察",
        modName: names.modName || "",
        modTitle: names.modTitle,
        pageName: meta.pageName || "",
        pageTitle: meta.title || "",
        actionName: value || "",
        actionTitle: value.actionTitle,
        pageTime: pageTime || "",
        actionType: "button",
        source: process.env.VUE_APP_ENV,
        accountId: params.caseId ? params.caseId : "",
      };
      // const result = await trackingApi(data);
      console.log("dsdsdsdd");
      // if (!result.success) {
      // }
    } catch (error) {
      console.log(error);
    }
  });
}

// 获取浏览器信息
function getBrowserInfo() {
  const agent = navigator.userAgent.toLowerCase();
  const regStrIe = /msie [\d.]+;/gi;
  const regStrFf = /firefox\/[\d.]+/gi;
  const regStrChrome = /chrome\/[\d.]+/gi;
  const regStrSaf = /safari\/[\d.]+/gi;
  // IE
  if (agent.indexOf("msie") > 0) {
    return agent.match(regStrIe);
  }
  // firefox
  if (agent.indexOf("firefox") > 0) {
    return agent.match(regStrFf);
  }
  // Chrome
  if (agent.indexOf("chrome") > 0) {
    return agent.match(regStrChrome);
  }
  // Safari
  if (agent.indexOf("safari") > 0 && agent.indexOf("chrome") < 0) {
    return agent.match(regStrSaf);
  }
}

export default {
  inserted(el, bind, vnode) {
    tracking(el, bind, vnode);
  },
};

  2-2 src==>main.js

import tracking from "@/directives/tracking";
Vue.use(tracking);

   2-3 具体使用

 <el-button v-tracking="'insight-manageBoard'">管控板</el-button>
 注意事项:
 1.v-tracking格式:双引号里面是单引号 "''"
 2.actionName为v-tracking的值 这个可以根据实际去命名
   actionTitle为当前元素的el 比如这个就是管控版
 3.如果actionTitle不是写死的 是根据某些条件去更改的 那么就需要为动态 
   这就是接下来说的动态的tracking.js

3.第二种方式 动态的tracking.js

   3-1 src=》directives=》tracking.js

import { tracking as trackingApi } from "@/api/tracking";
import { version } from "../../../package.json";
import store from "@/store";
function tracking(el, bind, vnode) {
  const { value } = bind;
  const { matched, fullPath, meta, params } = vnode.context.$route;
  const names = {
    sysName: "",
    sysTitle: "",
    modName: "",
    modTitle: "",
    pageName: "",
    pageTitle: "",
    actionTitle: "",
  };

  el.addEventListener("click", async () => {
    // const attrName = 'data-title';
    // console.log(el.innerText, el.getAttribute(attrName), el, 333333333)
    let permissionRoutes = store.state.globalState.globalState.permissionRoutes;
    let permissionOperations = store.state.globalState.globalState.permissionOperations;
    let sysGather = [];
    let menuGather = [];
    let authorityGather = [];
    let pageTime = sessionStorage.getItem("pageTime");
    permissionRoutes.forEach((sys) => {
      sysGather.push(sys);
      if (sys.children.length && sys.children.length > 0) {
        sys.children.forEach((menu) => {
          menuGather.push(menu);
          if (menu.children && menu.children.length > 0) {
            menu.children.forEach((auth) => {
              authorityGather.push(auth);
            });
          }
        });
      }
    });
    console.log(sysGather, menuGather, authorityGather, permissionOperations);
    console.log(meta);
    let modTitle = menuGather.find((e) => {
      return e.authorityExplain === meta.modName;
    });
    let actionTitle = permissionOperations.find((e) => {
      return e.authorityExplain === value;
    });
    let pageRef = sessionStorage.getItem("pageRef");
    names.modTitle = modTitle ? modTitle.menuName : "";
    names.actionTitle = actionTitle ? actionTitle.authorityName : "";
    pageTime = Number(new Date().getTime()) - pageTime;

    console.log("---------------");
    console.log(modTitle);
    console.log(menuGather);
    console.log(meta);
    console.log("---------------");

    // const initTime = date()
    // const nameKeys = Object.keys(names);
    // matched.forEach((route, index) => {
    //   const name = nameKeys[index];
    //   names[name] = route.name || '';
    // });
    names.modName = meta.modName || "";
    const clientWidth = document.body.clientWidth;
    const clientHeight = document.body.clientHeight;
    const browser = getBrowserInfo().toString().split("/")[0];
    const browserVersion = getBrowserInfo().toString().split("/")[1];
    try {
      const data = {
        appVersion: version,
        platform: "website",
        appOs: "js",
        resolution: `${clientWidth} * ${clientHeight}`,
        browVersion: `${browser} ${browserVersion}`,
        pageUrl: fullPath,
        pageRef: pageRef || "",
        sysName: "DiscernmentSystem",
        sysTitle: "业务洞察",
        modName: names.modName || "",
        modTitle: names.modTitle,
        pageName: meta.pageName || "",
        pageTitle: meta.title || "",
        actionName: value.actionName,
        actionTitle: value.actionTitle,
        pageTime: pageTime || "",
        actionType: "button",
        source: process.env.VUE_APP_ENV,
        accountId: params.caseId ? params.caseId : "",
      };
      // const result = await trackingApi(data);
      console.log("dsdsdsdd");
      // if (!result.success) {
      // }
    } catch (error) {
      console.log(error);
    }
  });
}

// 获取浏览器信息
function getBrowserInfo() {
  const agent = navigator.userAgent.toLowerCase();
  const regStrIe = /msie [\d.]+;/gi;
  const regStrFf = /firefox\/[\d.]+/gi;
  const regStrChrome = /chrome\/[\d.]+/gi;
  const regStrSaf = /safari\/[\d.]+/gi;
  // IE
  if (agent.indexOf("msie") > 0) {
    return agent.match(regStrIe);
  }
  // firefox
  if (agent.indexOf("firefox") > 0) {
    return agent.match(regStrFf);
  }
  // Chrome
  if (agent.indexOf("chrome") > 0) {
    return agent.match(regStrChrome);
  }
  // Safari
  if (agent.indexOf("safari") > 0 && agent.indexOf("chrome") < 0) {
    return agent.match(regStrSaf);
  }
}

export default {
  inserted(el, bind, vnode) {
    tracking(el, bind, vnode);
  },
};

   3-2 src=>main.js

import tracking from "@/directives/tracking";
Vue.use(tracking);

   3-3 具体使用

 <el-button label="teamCompetitiveness" v-tracking="teamTrackingData">团队竞争力</el-button>
 1.data中定义
   teamTrackingData:{
     actionName: "teamCompetitiveness",
     actionTitle: "团队竞争力",
   }   
 2.这样就可以根据某些特定条件写成动态的了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值