UNPKG

@yqg/multiple-click

Version:

Monitor user's multiple click behavior and report

122 lines (121 loc) 3.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.htmlTreeAsString = exports.castArray = exports.isArray = exports.pick = exports.getCountry = exports.getOsType = exports.unbindHandler = exports.bindHandler = void 0; const constant_1 = require("./constant"); const bindHandler = (handler) => { document.addEventListener('click', handler, { capture: true }); }; exports.bindHandler = bindHandler; const unbindHandler = (handler) => { document.removeEventListener('click', handler, { capture: true }); }; exports.unbindHandler = unbindHandler; const getOsType = () => { const ua = navigator.userAgent; if (ua.indexOf('Win') !== -1) { return 'Windows'; } if (ua.indexOf('iPhone') !== -1) { return 'IOS'; } if (ua.indexOf('Mac') !== -1) { return 'MacOS'; } if (ua.indexOf('Android') !== -1) { return 'Android'; } if (ua.indexOf('Linux') !== -1) { return 'Linux'; } return null; }; exports.getOsType = getOsType; const getCountry = () => { var _a; let lang = (_a = navigator.userAgent.match(/Language\/([a-z]{2})(?:\s|$)/)) === null || _a === void 0 ? void 0 : _a[1]; if (!lang) { lang = navigator.language.split('-')[0]; } const localeMap = { zh: 'CN', id: 'IDN', pt: 'BRA', hi: 'INDIA', fil: 'PHI', es: 'MEX', th: 'THA', pl: 'POL', }; return localeMap[lang] || 'CN'; }; exports.getCountry = getCountry; const pick = (obj, keys) => { const ret = {}; keys.forEach(key => { if (obj.hasOwnProperty(key)) { ret[key] = obj[key]; } }); return ret; }; exports.pick = pick; const isArray = (arr) => Object.prototype.toString.call(arr) === '[object Array]'; exports.isArray = isArray; const castArray = (origin) => (0, exports.isArray)(origin) ? origin : [origin]; exports.castArray = castArray; const htmlElementAsString = (elem) => { if (!elem || !elem.tagName) { return ''; } const out = []; out.push(elem.tagName.toLowerCase()); if (elem.id) { out.push(`#${elem.id}`); } const className = elem.className; if (className && Object.prototype.toString.call(className) === '[object String]') { const classes = className.split(/\s+/); for (const c of classes) { out.push(`.${c}`); } } const allowedAttrs = ['aria-label', 'type', 'name', 'title', 'alt']; for (const k of allowedAttrs) { const attr = elem.getAttribute(k); if (attr) { out.push(`[${k}="${attr}"]`); } } return out.join(''); }; const htmlTreeAsString = (el) => { if (!el) { return '<unknown>'; } try { const separator = ' > '; const sepLength = separator.length; const maxTraverseHeight = constant_1.SELECTOR_MAX_TRAVERSE_HEIGHT; const maxStringLength = constant_1.SELECTOR_MAX_STRING_LENGTH; const out = []; let height = 0; let len = 0; let currentElem = el; let nextStr; while (currentElem && height++ < maxTraverseHeight) { nextStr = htmlElementAsString(currentElem); if (nextStr === 'html' || (height > 1 && len + out.length * sepLength + nextStr.length >= maxStringLength)) { break; } out.push(nextStr); len += nextStr.length; currentElem = currentElem.parentNode; } return out.reverse().join(separator); } catch (err) { return '<unknown>'; } }; exports.htmlTreeAsString = htmlTreeAsString;