@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.
97 lines (94 loc) • 2.59 kB
JavaScript
// 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,
};
export { domObserver as DomObserver, domObserver as default, domObserver };