@yqg/multiple-click
Version:
Monitor user's multiple click behavior and report
122 lines (121 loc) • 3.7 kB
JavaScript
;
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;