lazy-js-utils
Version:
A collection of lazy-loaded JavaScript utilities for efficient development
138 lines (132 loc) • 4.35 kB
JavaScript
const require_isBool = require('./isBool-B9jCuCG_.cjs');
//#region src/event/findElement.ts
function findElement(selector, all = false, currentNode = document) {
if (require_isBool.isNull(all)) return;
if (!require_isBool.isBool(all)) {
currentNode = all;
all = false;
}
if (require_isBool.isArray(selector)) return selector.reduce((result, c) => {
const item = all ? currentNode.querySelectorAll(c) : currentNode.querySelector(c);
if (!item) return result;
return result = all ? [...result, ...item] : [...result, item];
}, []);
return all ? currentNode.querySelectorAll(selector) : currentNode.querySelector(selector);
}
//#endregion
//#region src/utils/mount.ts
function mount(...args) {
const len = args.length;
const params = [...args];
const elements = params.slice(0, len - 1);
const callback = params.slice(-1)[0];
let isMounted = false;
let hasMounted = false;
update();
document.addEventListener("DOMContentLoaded", update);
setTimeout(() => document.removeEventListener("DOMContentLoaded", update));
function update() {
if (hasMounted) return;
elements.forEach((element, index) => require_isBool.isStr(element) && (elements[index] = findElement(element) || element));
if (!isMounted && elements.some(require_isBool.isStr)) return isMounted = true;
if (elements.some(require_isBool.isStr)) throw new Error(`${elements.filter(require_isBool.isStr).join(", ")} is not a HTMLElement`);
callback === null || callback === void 0 || callback(...elements);
hasMounted = true;
}
}
//#endregion
//#region src/utils/unmount.ts
/**
* 浏览器卸载时
* @description 浏览器卸载时
* @param { (ev: Event) => void } callback 回调
* @returns { (ev: Event) => void }
*/
function unmount(callback) {
const fn = window.onunload || function() {};
window.onunload = function(ev) {
callback === null || callback === void 0 || callback(ev);
fn.call(this, ev);
};
return callback;
}
//#endregion
//#region src/event/useMutationObserver.ts
/**
* 检测元素变化
* @param { Element | string | ParentNode | null } element 元素
* @param { MutationCallback } callback 默认 { childList: true }
* @param { boolean } [callback.childList] 是否监听孩子元素
* @param { boolean } [callback.attributes] 是否监听属性
* @param { boolean } [callback.characterData] 是否监听内容
* @param { boolean } [callback.subtree] 是否监听树节点
* @param { boolean } [callback.attributeOldValue] 是否监听旧属性
* @param { string[] } [callback.attributeFilter] 属性过滤
* @param options
* @returns
*/
function useMutationObserver(element, callback, options = { childList: true }) {
if (!element) return;
let stopped = false;
let stop;
mount(element, (element$1) => {
const mutationObserver = new MutationObserver(callback);
mutationObserver.observe(element$1, options);
stop = () => mutationObserver.disconnect();
if (stopped) stop();
});
unmount(() => stop === null || stop === void 0 ? void 0 : stop());
return () => {
if (!stop) return stopped = true;
stop === null || stop === void 0 || stop();
};
}
//#endregion
//#region src/event/createElement.ts
/**
* 创建dom元素
* @param { string } tag 创建的标签元素
* @param { Record<string, string> } [attributes] 属性 {}
* @param { string } [innerHTML] 插入的内容innerHTML
* @param { ElementCreationOptions } [options] 通过 customElements.define() 定义的自定义元素的标签名称
* @returns
*/
function createElement(tag, attributes, innerHTML, options) {
const el = document.createElement(tag, options);
if (!attributes) return el;
for (const key in attributes) el.setAttribute(key, attributes[key]);
if (innerHTML) el.innerHTML = innerHTML;
return el;
}
//#endregion
Object.defineProperty(exports, 'createElement', {
enumerable: true,
get: function () {
return createElement;
}
});
Object.defineProperty(exports, 'findElement', {
enumerable: true,
get: function () {
return findElement;
}
});
Object.defineProperty(exports, 'mount', {
enumerable: true,
get: function () {
return mount;
}
});
Object.defineProperty(exports, 'unmount', {
enumerable: true,
get: function () {
return unmount;
}
});
Object.defineProperty(exports, 'useMutationObserver', {
enumerable: true,
get: function () {
return useMutationObserver;
}
});
;