@yqg/multiple-click
Version:
Monitor user's multiple click behavior and report
111 lines (110 loc) • 3.25 kB
JavaScript
import { SELECTOR_MAX_STRING_LENGTH, SELECTOR_MAX_TRAVERSE_HEIGHT } from './constant';
export const bindHandler = (handler) => {
document.addEventListener('click', handler, { capture: true });
};
export const unbindHandler = (handler) => {
document.removeEventListener('click', handler, { capture: true });
};
export 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;
};
export 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';
};
export const pick = (obj, keys) => {
const ret = {};
keys.forEach(key => {
if (obj.hasOwnProperty(key)) {
ret[key] = obj[key];
}
});
return ret;
};
export const isArray = (arr) => Object.prototype.toString.call(arr) === '[object Array]';
export const castArray = (origin) => isArray(origin) ? origin : [origin];
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('');
};
export const htmlTreeAsString = (el) => {
if (!el) {
return '<unknown>';
}
try {
const separator = ' > ';
const sepLength = separator.length;
const maxTraverseHeight = SELECTOR_MAX_TRAVERSE_HEIGHT;
const maxStringLength = 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>';
}
};