UNPKG

quad-tap

Version:

A pure JavaScript implementation of the Quad-Tap overlay interaction for videos with advanced video player API integration

123 lines (107 loc) 3.45 kB
/** * Events Helper Functions * Utility functions for event handling */ /** * Create a debounced function * @param {Function} func - The function to debounce * @param {number} wait - The debounce wait time in milliseconds * @returns {Function} The debounced function */ export function debounce(func, wait) { let timeout; return function executedFunction(...args) { const later = () => { clearTimeout(timeout); func(...args); }; clearTimeout(timeout); timeout = setTimeout(later, wait); }; } /** * Create a throttled function * @param {Function} func - The function to throttle * @param {number} limit - The throttle limit in milliseconds * @returns {Function} The throttled function */ export function throttle(func, limit) { let inThrottle; return function executedFunction(...args) { if (!inThrottle) { func(...args); inThrottle = true; setTimeout(() => { inThrottle = false; }, limit); } }; } /** * Add event listeners to multiple elements * @param {Array|NodeList} elements - The elements to add listeners to * @param {string} event - The event type * @param {Function} handler - The event handler * @param {Object} options - Event listener options */ export function addEventListenerToAll(elements, event, handler, options = {}) { if (!elements) return; // Convert to array if it's a NodeList const elementsArray = Array.isArray(elements) ? elements : Array.from(elements); elementsArray.forEach(element => { element.addEventListener(event, handler, options); }); } /** * Remove event listeners from multiple elements * @param {Array|NodeList} elements - The elements to remove listeners from * @param {string} event - The event type * @param {Function} handler - The event handler * @param {Object} options - Event listener options */ export function removeEventListenerFromAll(elements, event, handler, options = {}) { if (!elements) return; // Convert to array if it's a NodeList const elementsArray = Array.isArray(elements) ? elements : Array.from(elements); elementsArray.forEach(element => { element.removeEventListener(event, handler, options); }); } /** * Create a custom event * @param {string} name - The event name * @param {Object} detail - The event detail * @returns {CustomEvent} The custom event */ export function createCustomEvent(name, detail = {}) { return new CustomEvent(name, { bubbles: true, cancelable: true, detail }); } /** * Dispatch a custom event * @param {HTMLElement} element - The element to dispatch the event on * @param {string} name - The event name * @param {Object} detail - The event detail * @returns {boolean} Whether the event was canceled */ export function dispatchCustomEvent(element, name, detail = {}) { const event = createCustomEvent(name, detail); return element.dispatchEvent(event); } /** * Add a one-time event listener * @param {HTMLElement} element - The element to add the listener to * @param {string} event - The event type * @param {Function} handler - The event handler * @param {Object} options - Event listener options */ export function addOneTimeEventListener(element, event, handler, options = {}) { const onceHandler = function(e) { handler(e); element.removeEventListener(event, onceHandler, options); }; element.addEventListener(event, onceHandler, options); }