Files
nodecrypt/web/util.dom.js
T
2025-05-20 18:08:31 +08:00

125 lines
3.2 KiB
JavaScript

// util.dom.js
// DOM操作工具库
/**
* 获取DOM元素
* @param {string} selector - CSS选择器
* @param {Element} [parent=document] - 父元素,默认为document
* @returns {Element|null} 找到的元素或null
*/
export function $(selector, parent = document) {
return parent.querySelector(selector);
}
/**
* 获取DOM元素集合
* @param {string} selector - CSS选择器
* @param {Element} [parent=document] - 父元素,默认为document
* @returns {NodeList} 找到的元素列表
*/
export function $$(selector, parent = document) {
return parent.querySelectorAll(selector);
}
/**
* 通过ID获取元素
* @param {string} id - 元素ID
* @returns {Element|null} 找到的元素或null
*/
export function $id(id) {
return document.getElementById(id);
}
/**
* 创建DOM元素
* @param {string} tag - 标签名称
* @param {Object} [attrs={}] - 元素属性
* @param {string|Element} [content=''] - 内容或子元素
* @returns {Element} 创建的元素
*/
export function createElement(tag, attrs = {}, content = '') {
const el = document.createElement(tag);
// 设置属性
Object.entries(attrs).forEach(([key, value]) => {
if (key === 'class' || key === 'className') {
el.className = value;
} else if (key === 'style' && typeof value === 'object') {
Object.assign(el.style, value);
} else if (key.startsWith('on') && typeof value === 'function') {
el.addEventListener(key.slice(2).toLowerCase(), value);
} else {
el.setAttribute(key, value);
}
});
// 添加内容
if (typeof content === 'string') {
el.innerHTML = content;
} else if (content instanceof Element) {
el.appendChild(content);
}
return el;
}
/**
* 设置元素样式
* @param {Element} el - 目标元素
* @param {Object} styles - 样式对象
*/
export function setStyles(el, styles) {
Object.assign(el.style, styles);
}
/**
* 添加事件监听器
* @param {string|Element} target - 目标元素或选择器
* @param {string} event - 事件名称
* @param {Function} handler - 处理函数
* @param {Object} [options] - 事件选项
*/
export function on(target, event, handler, options) {
const el = typeof target === 'string' ? $(target) : target;
if (el) el.addEventListener(event, handler, options);
}
/**
* 移除事件监听器
* @param {string|Element} target - 目标元素或选择器
* @param {string} event - 事件名称
* @param {Function} handler - 处理函数
*/
export function off(target, event, handler) {
const el = typeof target === 'string' ? $(target) : target;
if (el) el.removeEventListener(event, handler);
}
/**
* 向元素添加类
* @param {Element} el - 目标元素
* @param {...string} classNames - 类名
*/
export function addClass(el, ...classNames) {
el.classList.add(...classNames);
}
/**
* 从元素移除类
* @param {Element} el - 目标元素
* @param {...string} classNames - 类名
*/
export function removeClass(el, ...classNames) {
el.classList.remove(...classNames);
}
/**
* 切换元素的类
* @param {Element} el - 目标元素
* @param {string} className - 类名
* @param {boolean} [force] - 强制添加或移除
*/
export function toggleClass(el, className, force) {
el.classList.toggle(className, force);
}