UNPKG

web-event-tracking

Version:
639 lines (600 loc) 18.6 kB
/* eslint-disable no-cond-assign */ /* eslint-disable no-unused-expressions */ (function() { var packageName = "brw"; if (!window[packageName]) { window[packageName] = {}; window[packageName]["browserInfo"] = {}; } var MAX_360_CHROME_VERSION = 69; // 以360极速浏览器的最大内核版本为准 function getIOSVersion(ua) { if (/cpu (?:iphone )?os (\d+_\d+)/.test(ua)) { return parseFloat(RegExp.$1.replace("_", ".")); } else { return 2; } } var browser360 = { result: "Chrome", details: { Chrome: 5, Chromium: 0, _360SE: 0, _360EE: 0 }, sorted: ["Chrome", "360SE", "360EE", "Chromium"], check: function() { var init = { Chrome: 5, Chromium: 0, _360SE: 0, _360EE: 0 }; var plugins = window.navigator.plugins; var webstore = window.chrome.webstore; var webstoreLen = Object.keys(webstore).length; var pluginsLen = plugins.length; if ( (window.clientInformation.languages || (init._360SE += 8), /zh/i.test(navigator.language) && ((init._360SE += 3), (init._360EE += 3)), window.clientInformation.languages) ) { var lanLen = window.clientInformation.languages.length; if (lanLen >= 3) { init.Chrome += 10; init.Chromium += 6; } else if (lanLen === 2) { init.Chrome += 3; init.Chromium += 6; init._360EE += 6; } else if (lanLen === 1) { init.Chrome += 4; init.Chromium += 4; } } var pluginFrom; var maybe360 = 0; for (var r in plugins) { if ((pluginFrom = /^(.+) PDF Viewer$/.exec(plugins[r].name))) { if (pluginFrom[1] === "Chrome") { init.Chrome += 6; init._360SE += 6; maybe360 = 1; } else if (pluginFrom[1] === "Chromium") { init.Chromium += 10; init._360EE += 6; maybe360 = 1; } } else if (plugins[r].filename === "np-mswmp.dll") { init._360SE += 20; init._360EE += 20; } } maybe360 || (init.Chromium += 9); if (webstoreLen <= 1) { init._360SE += 7; } else { init._360SE += 4; init.Chromium += 3; if (pluginsLen >= 30) { init._360EE += 7; init._360SE += 7; init.Chrome += 7; } else if (pluginsLen < 30 && pluginsLen > 10) { init._360EE += 3; init._360SE += 3; init.Chrome += 3; } else { init.Chromium += 6; } } var m = {}; m.Chrome = init.Chrome; m.Chromium = init.Chromium; m["360SE"] = init._360SE; m["360EE"] = init._360EE; var s = []; for (var u in m) { s.push([u, m[u]]); } s.sort(function(e, i) { return i[1] - e[1]; }); this.sorted = s; this.details = init; this.result = s[0][0] || ""; return this.result.toLowerCase(); } }; /** * 获取国内加壳浏览器类型 */ function _getShellerType() { var brwType = ""; var appVersion = window.navigator.appVersion; var external = window.external; if (external && "SEVersion" in external) { // 搜狗浏览器 brwType = "sougou"; } else if (external && "LiebaoGetVersion" in external) { // 猎豹浏览器 brwType = "liebao"; } else if (/QQBrowser/.test(appVersion)) { // qq浏览器 brwType = "qq"; } else if (/Maxthon/.test(appVersion)) { // 遨游浏览器 brwType = "maxthon"; } else if (/TaoBrowser/.test(appVersion)) { // 淘宝浏览器 brwType = "taobao"; } else if (/BIDUBrowser/.test(appVersion)) { // 百度浏览器 brwType = "baidu"; } else if (/UBrowser/.test(appVersion)) { // UC浏览器 brwType = "uc"; } return brwType; } /** * 获取 Chromium 内核浏览器类型 * @link http://www.adtchrome.com/js/help.js * @link https://ext.chrome.360.cn/webstore * @link https://ext.se.360.cn * @return {String} * 360ee 360极速浏览器 * 360se 360安全浏览器 * sougou 搜狗浏览器 * liebao 猎豹浏览器 * chrome 谷歌浏览器 * '' 无法判断 */ function _getChromiumType(version) { if (window.scrollMaxX !== undefined) return ""; var chromeBrowserType = _getShellerType(); if (chromeBrowserType !== "") { return chromeBrowserType; } if ( window.navigator.vendor && window.navigator.vendor.indexOf("Opera") === 0 ) { return "opera"; } var p = navigator.platform.toLowerCase(); if (p.indexOf("mac") === 0 || p.indexOf("linux") === 0) { return "chrome"; } if (parseInt(version) > MAX_360_CHROME_VERSION) { return "chrome"; } return browser360.check(); } var client = (function() { var browser = {}; var ua = navigator.userAgent.toLowerCase(); var s; if ((s = ua.match(/rv:([\d.]+)/))) { browser.name = "ie"; browser["ie"] = s[1]; if (ua.indexOf("wow") > -1) { browser["type"] = _getShellerType() ? _getShellerType() : "360"; } else { browser["type"] = "IE"; } } else if ((s = ua.match(/msie ([\d.]+)/))) { browser.name = "ie"; browser["ie"] = s[1]; if (ua.indexOf("wow") > -1) { browser["type"] = _getShellerType() ? _getShellerType() : "360"; } else { browser["type"] = "IE"; } } else if ((s = ua.match(/edge\/([\d.]+)/))) { browser.name = "edge"; browser["edge"] = s[1]; browser["type"] = "edge"; } else if ((s = ua.match(/firefox\/([\d.]+)/))) { browser.name = "firefox"; browser["firefox"] = s[1]; browser["type"] = "firefox"; } else if ((s = ua.match(/chrome\/([\d.]+)/))) { browser.name = "chrome"; browser["chrome"] = s[1]; var type = _getChromiumType(browser["chrome"]); if (type) { browser["type"] = type; } } else if ((s = ua.match(/opera.([\d.]+)/))) { browser.name = "opera"; browser["opera"] = s[1]; browser["type"] = "opera"; } else if ((s = ua.match(/version\/([\d.]+).*safari/))) { browser.name = "safari"; browser["safari"] = s[1]; browser["type"] = "safari"; } else { browser.name = "unknown"; browser["unknow"] = 0; } var system = {}; if (ua.indexOf("iphone") > -1) { system.name = "iphone"; system.iphone = getIOSVersion(ua); } else if (ua.indexOf("ipod") > -1) { system.name = "ipod"; system.ipod = getIOSVersion(ua); } else if (ua.indexOf("ipad") > -1) { system.name = "ipad"; system.ipad = getIOSVersion(ua); } else if (ua.indexOf("nokia") > -1) { system.name = "nokia"; system.nokia = true; } else if (/android (\d+(\.\d+)?)/.test(ua)) { system.name = "android"; system.android = parseFloat(RegExp.$1); } else if (ua.indexOf("win") > -1) { system.name = "win"; if (/win(?:dows )?([^do]{2})\s?(\d+\.\d+)?/.test(ua)) { if (RegExp["$1"] === "nt") { switch (RegExp["$2"]) { case "5.0": system.win = "2000"; break; case "5.1": system.win = "XP"; break; case "6.0": system.win = "Vista"; break; case "6.1": system.win = "7"; break; case "6.2": system.win = "8"; break; case "6.3": system.win = "8.1"; break; case "10.0": system.win = "10"; break; default: system.win = "NT"; break; } } else if (RegExp["$1"] === "9x") { system.win = "ME"; } else { system.win = RegExp["$1"]; } } } else if (ua.indexOf("mac") > -1) { system.name = "mac"; } else if (ua.indexOf("linux") > -1) { system.name = "linux"; } var str = system.name + (system[system.name] || "") + "|" + browser.name + browser[browser.name]; var isMobile = system.android || system.iphone || system.ios || system.ipad || system.ipod || system.nokia; return { browser: browser, system: system, isMobile: isMobile, string: str }; })(); window[packageName]["browserInfo"] = client; })(); var tracking = { trackingServerUrl: 'http://tracking.abc.com/', // 埋点服务器接口url appid: 'b1651f4562174c06', token: 'kgfk8i987kgfkjhwer\u1234', distinctIdKey: "distinctId", // cookie中用来存用户ID的key sourceKey: "source", // url中用来标记来源渠道的key defaultSource: "message", // 默认来源渠道 interval: null, // 发送间隔, 单位毫秒 intervalId: null, phone: null, events: [], setConfig: function(config) { Object.assign(this, config); }, click: function(e) { var position = [e.pageX, e.pageY]; var id = e.target.id; var className = e.target.className; var nodeName = e.target.nodeName; var targetEle = { nodeName: nodeName, id: id, className: className }; var pageWidth = document.documentElement.offsetWidth; var pageHeight = document.documentElement.offsetHeight; var screenWidth = window.screen.width; var screenHeight = window.screen.height; var screenAvailWidth = window.screen.availWidth; var screenAvailHeight = window.screen.availHeight; var windowInnerWidth = window.innerWidth; var windowInnerHeight = window.innerHeight; var currentUrl = window.location.href; tracking.addEvent({ event: "click", pageWidth: pageWidth, pageHeight: pageHeight, screenWidth: screenWidth, screenHeight: screenHeight, screenAvailWidth: screenAvailWidth, screenAvailHeight: screenAvailHeight, windowInnerWidth: windowInnerWidth, windowInnerHeight: windowInnerHeight, position: position, targetEle: targetEle, currentUrl: currentUrl }); }, toThirdPartyPayment: function(thirdPartyPayment) { this.addEvent({ event: "toThirdPartyPayment", thirdPartyPayment: thirdPartyPayment // 第三方支付类别(微信、支付宝等) }); }, toExternalUrl: function() { this.addEvent({ event: "toExternalUrl", // 跳转至某外链 externalUrl: "http://www.bcd.com" // 某外链 }); }, setPhone: function(phone) { this.phone = phone; }, // 设置手机号 submitRightCaptcha: function() { this.addEvent({ event: "submitRightCaptcha" }); }, // 验证码输入正确 submitWrongCaptcha: function() { this.addEvent({ event: "submitWrongCaptcha" }); }, // 验证码输入错误 switchCaptcha: function() { this.addEvent({ event: "switchCaptcha" }); }, // 切换验证码 getEnv: function() { return window.brw.browserInfo || {}; }, // 获取环境信息(系统及浏览器信息) /** * [通过参数名获取url中的参数值] * 示例URL:http://htmlJsTest/getrequest.html?uid=admin&rid=1&fid=2&name=小明 * @param {[string]} queryName [参数名] * @return {[string]} [参数值] */ getQueryValue: function(queryName) { var query = decodeURI(window.location.search.substring(1)); var vars = query.split("&"); for (var i = 0; i < vars.length; i++) { var pair = vars[i].split("="); if (pair[0] === queryName) { return pair[1]; } } return null; }, getSource: function() { var source = this.getQueryValue(this.SOURCE); if (!source) return this.defaultSource; return source; }, getTime: function() { return new Date().getTime(); }, getDistinctId: function() { var distinctId = this.getCookie(tracking.distinctIdKey); if (distinctId) return distinctId; distinctId = this.uuid(); this.setCookie(tracking.distinctIdKey, distinctId); return distinctId; }, uuid: function() { var s = []; var hexDigits = "0123456789abcdef"; for (var i = 0; i < 36; i++) { s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1); } s[14] = "4"; // bits 12-15 of the time_hi_and_version field to 0010 s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01 s[8] = s[13] = s[18] = s[23] = "-"; var uuid = s.join(""); return uuid; }, setCookie: function(cname, cvalue) { document.cookie = cname + "=" + cvalue + ";" + document.cookie; }, getCookie: function(cname) { var name = cname + "="; var decodedCookie = decodeURIComponent(document.cookie); var ca = decodedCookie.split(";"); for (var i = 0; i < ca.length; i++) { var c = ca[i]; while (c.charAt(0) === " ") { c = c.substring(1); } if (c.indexOf(name) === 0) { return c.substring(name.length, c.length); } } return ""; }, getCommonParams: function() { var distinctId = this.getDistinctId(); var env = this.getEnv(); var time = this.getTime(); var source = this.getSource(); var commonParams = { distinctId: distinctId, source: source, time: time, env: env }; if (tracking.phone) commonParams.phone = tracking.phone; return commonParams; }, addEvent: function(eventParams) { var commonParams = this.getCommonParams(); var event = Object.assign(commonParams, eventParams); this.events.push(JSON.stringify(event)); }, trackingPost: function() { if (!tracking.events || tracking.events.length === 0) return; var params = { appid: tracking.appid, token: tracking.token, events: JSON.parse(JSON.stringify(tracking.events)) }; tracking.post( tracking.trackingServerUrl, { "Content-Type": "application/json" // 'Access-Control-Allow-Origin': '*' }, JSON.stringify(params) ); tracking.events = []; }, post: function(url, headers, params, callback) { const xhr = new XMLHttpRequest(); xhr.open("post", url); xhr.onreadystatechange = () => { if (xhr.readyState === 4) { if (xhr.status === 200) { var responseText = xhr.responseText; // 返回结果 if (!responseText) return; var res = JSON.parse(responseText); if (res.code === "200") { if (callback) callback(res); } else { console.log(res.msg); } } else { console.log(xhr.statusText); } } }; xhr.onerror = function(e) { console.log(xhr.statusText); }; Object.keys(headers).forEach(key => { xhr.setRequestHeader(key, headers[key]); }); xhr.send(params); } }; (function(history) { var pushState = history.pushState; history.pushState = function() { if (typeof history.onpushstate === "function") { history.onpushstate(arguments); } return pushState.apply(history, arguments); }; var replaceState = history.replaceState; history.replaceState = function() { if (typeof history.onreplacestate === "function") { history.onreplacestate(arguments); } return replaceState.apply(history, arguments); }; })(window.history); window.history.onpushstate = function(args) { var currentUrl = window.location.href; var targetUrl = args[2]; tracking.addEvent({ event: "pushState", currentUrl: currentUrl, targetUrl: targetUrl }); }; window.history.onreplacestate = function(args) { var currentUrl = window.location.href; var targetUrl = args[2]; tracking.addEvent({ event: "replaceState", currentUrl: currentUrl, targetUrl: targetUrl }); }; function onhashchange(e) { var currentUrl = e.newUrl; var sourceUrl = e.oldUrl; tracking.addEvent({ event: "hashChange", sourceUrl: sourceUrl, currentUrl: currentUrl }); } function onpopstate(e) { var currentUrl = e.target.location.href; tracking.addEvent({ event: "popState", currentUrl: currentUrl }); } function onunload(e) { var currentUrl = e.target.location.href; tracking.addEvent({ event: "unload", currentUrl: currentUrl }); clearInterval(tracking.intervalId); tracking.intervalId = null; tracking.trackingPost(); window.history.onpushstate = null; window.history.onreplacestate = null; window.removeEventListener("load", onload, false); window.removeEventListener("beforeunload", onbeforeunload, false); window.removeEventListener("unload", onunload, false); window.removeEventListener("popstate", onpopstate, false); window.removeEventListener("hashchange", onhashchange, false); window.removeEventListener("click", tracking.click, false); window.tracking = null; tracking = null; } function onbeforeunload(e) { var currentUrl = e.target.location.href; tracking.addEvent({ event: "beforeUnload", currentUrl: currentUrl }); } function onload(e) { var currentUrl = e.target.location.href; tracking.addEvent({ event: "load", currentUrl: currentUrl }); tracking.intervalId = setInterval(tracking.trackingPost, tracking.interval); } window.addEventListener("load", onload, false); window.addEventListener("beforeunload", onbeforeunload, false); window.addEventListener("unload", onunload, false); window.addEventListener("popstate", onpopstate, false); window.addEventListener("hashchange", onhashchange, false); window.addEventListener("click", tracking.click, false); // window.onclick = tracking.click window.tracking = tracking;