UNPKG

@knighttower/utility

Version:

UtilityJs is a utility library that provides a collection of utility functions for various tasks. The library is designed to be easy to use and covers the most common use cases.

103 lines (98 loc) 2.7 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); // Author Knighttower // MIT License // [2022] [Knighttower] https://github.com/knighttower /** * @module DomObserver * Detect DOM changes * @name DomObserver * @param {window} selector * @param {Function} * @return DomObserver * @example DomObserver.addOnNodeChange('elementIdentifier', () => { console.log('Node changed') }) * @example DomObserver.removeOnNodeChange('elementIdentifier') */ /** * Holds memory of registered functions * @private */ const executeOnNodeChanged = {}; let observer; /** * When node change * @param {String} id * @param {Function} callback Callback when any node changes/ add/deleted/modified * @memberof DomObserver * @usage domObserver.addOnNodeChange('elementIdentifier', () => { console.log('Node changed') }) * @return {Void} */ const addOnNodeChange = (id, callback) => { if (callback) { executeOnNodeChanged[id] = callback; } }; /** * Remove from node change * @param {String} id * @memberof DomObserver * @usage domObserver.removeOnNodeChange('elementIdentifier') * @return {Void} */ const removeOnNodeChange = (id) => { if (id) { delete executeOnNodeChanged[id]; } }; /** * Deep cleanup * @return {Void} */ const cleanup = () => { Object.keys(executeOnNodeChanged).forEach((key) => delete executeOnNodeChanged[key]); }; /** * Observer * @private * @return {MutationObserver} */ const start = () => { if (typeof window !== 'undefined' && !observer) { const callback = (mutationList) => { for (const mutation of mutationList) { if (mutation.type === 'childList') { for (const id in executeOnNodeChanged) { executeOnNodeChanged[id](); } } } }; const config = { childList: true, subtree: true, }; observer = new MutationObserver(callback); if (document.body) { return observer.observe(document.body, config); } document.addEventListener('DOMContentLoaded', (event) => { return observer.observe(document.body, config); }); } }; /** * @exports domObserver * @type {Object} * @usage domObserver.addOnNodeChange('elementIdentifier', () => { console.log('Node changed') }) * @usage domObserver.removeOnNodeChange('elementIdentifier') * @usage domObserver.cleanup() */ const domObserver = { start, addOnNodeChange, removeOnNodeChange, cleanup, }; exports.DomObserver = domObserver; exports.default = domObserver; exports.domObserver = domObserver;