@yqg/multiple-click
Version:
Monitor user's multiple click behavior and report
71 lines (70 loc) • 2.89 kB
JavaScript
export const trackingHandlerFactory = ({ interval, continuousCount, range, uploadTrackingInfo, filter, excludeRules, }) => {
const triggerQueue = [];
const appendTriggerItem = (item) => {
triggerQueue.push(item);
let delIndex = -1;
for (let i = 0, len = triggerQueue.length - 1; i < len; i++) {
const { timeStamp: t1 } = triggerQueue[i];
const { timeStamp: t2 } = triggerQueue[i + 1];
if (t2 - t1 > interval) {
delIndex = i;
}
}
triggerQueue.splice(0, delIndex + 1);
for (let i = 0, len = triggerQueue.length; i < len; i++) {
if (triggerQueue.length < continuousCount) {
return;
}
for (let j = i + 1; j < triggerQueue.length; j++) {
const { pageX: x1, pageY: y1 } = triggerQueue[i];
const { pageX: x2, pageY: y2 } = triggerQueue[j];
if (Math.sqrt(Math.pow((x1 - x2), 2) + Math.pow((y1 - y2), 2)) <= range * 2) {
continue;
}
const delItem = triggerQueue.shift();
if (delItem === triggerQueue[i]) {
break;
}
}
}
};
const trackingHandler = (event) => {
try {
const { target, timeStamp, pageX, pageY } = event;
if (!target || !(target instanceof Element) || target === document.body || filter(event)) {
return;
}
if (excludeRules.length) {
const pathname = new URL(location.href).pathname;
const isMatch = !!excludeRules.find(({ selector, shallow, page }) => {
if (page.length && page.indexOf(pathname) === -1) {
return false;
}
return shallow ? target.matches(selector) : target.closest(selector);
});
if (isMatch) {
return;
}
}
const triggerItem = {
timeStamp,
target,
pageX,
pageY,
};
appendTriggerItem(triggerItem);
if (triggerQueue.length >= continuousCount) {
const elementText = (target === null || target === void 0 ? void 0 : target.innerText) || (target === null || target === void 0 ? void 0 : target.value);
const isSelectionReport = elementText && window.getSelection().toString().includes(elementText);
if (!isSelectionReport) {
uploadTrackingInfo(event);
}
triggerQueue.length = 0;
}
}
catch (error) {
console.error('多次点击上报监听器异常:', error);
}
};
return trackingHandler;
};