-
Notifications
You must be signed in to change notification settings - Fork 18
/
Copy pathuserBehaviour.min.js
5 lines (5 loc) · 5.3 KB
/
userBehaviour.min.js
1
2
3
4
5
/**
* @author Taha Al-Jody <[email protected]>
* https://github.com/TA3/web-user-behaviour
*/
var userBehaviour=function(){var e={userInfo:!0,clicks:!0,mouseMovement:!0,mouseMovementInterval:1,mouseScroll:!0,timeCount:!0,clearAfterProcess:!0,processTime:15,windowResize:!0,visibilitychange:!0,keyboardActivity:!0,pageNavigation:!0,formInteractions:!0,touchEvents:!0,audioVideoInteraction:!0,customEventRegistration:!0,processData:function(e){console.log(e)}},t={},n={processInterval:null,mouseInterval:null,mousePosition:[],eventListeners:{scroll:null,click:null,mouseMovement:null,windowResize:null,visibilitychange:null,keyboardActivity:null,touchStart:null},eventsFunctions:{scroll:()=>{i.mouseScroll.push([window.scrollX,window.scrollY,s()])},click:e=>{i.clicks.clickCount++;var t=[],n="";e.composedPath().forEach(((i,o)=>{o!==e.composedPath().length-1&&o!==e.composedPath().length-2&&(n=i.localName,""!==i.className&&i.classList.forEach((e=>{n+="."+e})),""!==i.id&&(n+="#"+i.id),t.push(n))})),t=t.reverse().join(">"),i.clicks.clickDetails.push([e.clientX,e.clientY,t,s()])},mouseMovement:e=>{n.mousePosition=[e.clientX,e.clientY,s()]},windowResize:e=>{i.windowSizes.push([window.innerWidth,window.innerHeight,s()])},visibilitychange:e=>{i.visibilitychanges.push([document.visibilityState,s()]),r()},keyboardActivity:e=>{i.keyboardActivities.push([e.key,s()])},pageNavigation:()=>{i.navigationHistory.push([location.href,s()])},formInteraction:e=>{e.preventDefault(),i.formInteractions.push([e.target.name,s()])},touchStart:e=>{i.touchEvents.push(["touchstart",e.touches[0].clientX,e.touches[0].clientY,s()])},mediaInteraction:e=>{i.mediaInteractions.push(["play",e.target.currentSrc,s()])}}},i={};function o(){i={userInfo:{windowSize:[window.innerWidth,window.innerHeight],appCodeName:navigator.appCodeName||"",appName:navigator.appName||"",vendor:navigator.vendor||"",platform:navigator.platform||"",userAgent:navigator.userAgent||""},time:{startTime:0,currentTime:0,stopTime:0},clicks:{clickCount:0,clickDetails:[]},mouseMovements:[],mouseScroll:[],keyboardActivities:[],navigationHistory:[],formInteractions:[],touchEvents:[],mediaInteractions:[],windowSizes:[],visibilitychanges:[]}}function s(){return Date.now()}function r(){t.processData(c()),t.clearAfterProcess&&o()}function c(){return!1===t.userInfo&&void 0!==userBehaviour.showResult().userInfo&&delete userBehaviour.showResult().userInfo,void 0!==t.timeCount&&t.timeCount&&(i.time.currentTime=s()),i}return o(),{showConfig:function(){return Object.keys(t).length!==Object.keys(e).length?e:t},config:function(n){t={},Object.keys(e).forEach((i=>{t[i]=i in n?n[i]:e[i]}))},start:function(){var o;Object.keys(t).length!==Object.keys(e).length&&(console.log("no config provided. using default.."),t=e),void 0!==t.timeCount&&t.timeCount&&(i.time.startTime=s()),t.mouseMovement&&(n.eventListeners.mouseMovement=window.addEventListener("mousemove",n.eventsFunctions.mouseMovement),n.mouseInterval=setInterval((()=>{n.mousePosition&&n.mousePosition.length&&(!i.mouseMovements.length||n.mousePosition[0]!==i.mouseMovements[i.mouseMovements.length-1][0]&&n.mousePosition[1]!==i.mouseMovements[i.mouseMovements.length-1][1])&&i.mouseMovements.push(n.mousePosition)}),1e3*e.mouseMovementInterval)),t.clicks&&(n.eventListeners.click=window.addEventListener("click",n.eventsFunctions.click)),t.mouseScroll&&(n.eventListeners.scroll=window.addEventListener("scroll",n.eventsFunctions.scroll)),!1!==t.windowResize&&(n.eventListeners.windowResize=window.addEventListener("resize",n.eventsFunctions.windowResize)),!1!==t.visibilitychange&&(n.eventListeners.visibilitychange=window.addEventListener("visibilitychange",n.eventsFunctions.visibilitychange)),t.keyboardActivity&&(n.eventListeners.keyboardActivity=window.addEventListener("keydown",n.eventsFunctions.keyboardActivity)),t.pageNavigation&&(window.history.pushState=(o=window.history.pushState,function(){var e=o.apply(this,arguments);return window.dispatchEvent(new Event("pushstate")),window.dispatchEvent(new Event("locationchange")),e}),window.addEventListener("popstate",n.eventsFunctions.pageNavigation),window.addEventListener("pushstate",n.eventsFunctions.pageNavigation),window.addEventListener("locationchange",n.eventsFunctions.pageNavigation)),t.formInteractions&&document.querySelectorAll("form").forEach((e=>e.addEventListener("submit",n.eventsFunctions.formInteraction))),t.touchEvents&&(n.eventListeners.touchStart=window.addEventListener("touchstart",n.eventsFunctions.touchStart)),t.audioVideoInteraction&&document.querySelectorAll("video").forEach((e=>{e.addEventListener("play",n.eventsFunctions.mediaInteraction)})),!1!==t.processTime&&(n.processInterval=setInterval((()=>{r()}),1e3*t.processTime))},stop:function(){!1!==t.processTime&&clearInterval(n.processInterval),clearInterval(n.mouseInterval),window.removeEventListener("scroll",n.eventsFunctions.scroll),window.removeEventListener("click",n.eventsFunctions.click),window.removeEventListener("mousemove",n.eventsFunctions.mouseMovement),window.removeEventListener("resize",n.eventsFunctions.windowResize),window.removeEventListener("visibilitychange",n.eventsFunctions.visibilitychange),window.removeEventListener("keydown",n.eventsFunctions.keyboardActivity),window.removeEventListener("touchstart",n.eventsFunctions.touchStart),i.time.stopTime=s(),r()},showResult:c,processResults:r,registerCustomEvent:(e,t)=>{window.addEventListener(e,t)}}}();