UNPKG

@randyd45/web-behavior-tracker

Version:

A framework-agnostic package for tracking user behavior on web forms

92 lines 3.32 kB
import { TrackingUtils } from './utils.js'; /** * Handles input events including typing, deleting, and autocomplete detection */ export class InputEventHandler { constructor(options) { this.lastInputValues = new Map(); this.lastInputTimes = new Map(); this.options = options; } /** * Handles input events and determines if they are input, delete, or autocomplete */ handleInputEvent(event, onEventCreated) { if (!this.options.trackInputChanges) return; const target = event.target; if (!target) return; // Get the current value let elementValue = null; if (target instanceof HTMLInputElement) { if (target.type === 'checkbox') { elementValue = target.checked; } else if (target.type === 'radio') { elementValue = target.checked ? target.value : null; } else { elementValue = target.value; } } else if (target instanceof HTMLSelectElement) { if (target.multiple) { elementValue = Array.from(target.selectedOptions).map(option => option.value); } else { elementValue = target.value; } } else if (target instanceof HTMLTextAreaElement) { elementValue = target.value; } // For custom elements, try to get value from data attributes or aria attributes if (elementValue === null) { elementValue = target.getAttribute('data-value') || target.getAttribute('aria-valuetext') || target.getAttribute('value') || target.textContent || ''; } const elementId = target.id || ''; const currentValue = String(elementValue || ''); const previousValue = this.lastInputValues.get(elementId) || ''; const currentTime = Date.now(); const lastInputTime = this.lastInputTimes.get(elementId) || 0; // Determine the type of input event let eventType = 'input'; if (currentValue.length < previousValue.length) { eventType = 'delete'; } else if (TrackingUtils.isAutocompleteEvent(currentValue, previousValue, currentTime, lastInputTime, target)) { eventType = 'autocomplete'; } // Create the behavior event const behaviorEvent = TrackingUtils.createBehaviorEvent(eventType, target, elementValue); onEventCreated(behaviorEvent); // Update the last known value and time for this element this.lastInputValues.set(elementId, currentValue); this.lastInputTimes.set(elementId, currentTime); } /** * Clears stored input values and times */ clear() { this.lastInputValues.clear(); this.lastInputTimes.clear(); } /** * Gets the last known value for an element */ getLastValue(elementId) { return this.lastInputValues.get(elementId) || ''; } /** * Gets the last input time for an element */ getLastInputTime(elementId) { return this.lastInputTimes.get(elementId) || 0; } } //# sourceMappingURL=InputEventHandler.js.map