tracker-mn
Version:
a practicing for tracker
2 lines (1 loc) • 1.69 kB
JavaScript
var o=["click","dblclick","contextmenu","mousedown","mouseup","mouseenter","mouseout","mouseover"];var i=a=>{let e=history[a];return function(...t){let s=e.apply(this,t),r=new Event(a);return window.dispatchEvent(r),s}};var n=class{constructor(e){this.data=Object.assign(this.initDef(),e),this.installTracker()}setUserId(e){this.data.uuid=e}setExtra(e){this.data.extra=e}sendTracker(e){this.reportTracker(e)}initDef(){return window.history.pushState=i("pushState"),window.history.replaceState=i("replaceState"),{sdkVersion:"1.0.0",historyTracker:!1,hashTracker:!1,domTracker:!1,jsError:!1}}targetKeyReport(){for(let e of o)window.addEventListener(e,t=>{let r=t.target.getAttribute("target-key");r&&this.reportTracker({event:e,targetKey:r})})}captureEvents(e,t,s){for(let r of e)window.addEventListener(r,()=>{this.reportTracker({event:r,targetKey:t,data:s})})}installTracker(){let{historyTracker:e,hashTracker:t,domTracker:s,jsError:r}=this.data;e&&this.captureEvents(["pushState","replaceState","popstate"],"history-pv"),t&&this.captureEvents(["hashchange"],"hash-pv"),s&&this.targetKeyReport(),r&&this.jsError()}jsError(){this.errorEvent(),this.promiseReject()}errorEvent(){window.addEventListener("error",e=>{this.reportTracker({targetKey:"message",event:"error",message:e.message})})}promiseReject(){window.addEventListener("unhandledrejection",e=>{e.promise.catch(t=>{this.reportTracker({targetKey:"message",event:"promiseReject",message:t.message})})})}reportTracker(e){let t=Object.assign(this.data,e,{time:new Date().getTime()}),s={type:"application/x-www-form-urlencoded"},r=new Blob([JSON.stringify(t)],s);navigator.sendBeacon(this.data.requestUrl,r)}};export{n as Tracker};