本页导航
article
DOM操作与全局JS注册指南
AI摘要
本文详细介绍了Hugo项目中DOM操作的实用技巧,包括选择器使用、事件监听、元素操作等,并重点讲解了如何将JavaScript函数和对象注册为全局变量,支持模块化开发。这些内容帮助开发者高效构建交互式网页,确保代码结构清晰且易于维护。
DOM操作
基本DOM选择器
项目中常用的DOM选择器方法:
// 通过ID选择元素
const navbar = document.getElementById("topnav");
const mybutton = document.getElementById("back-to-top");
// 通过类名选择元素
const navbarToggler = document.querySelector('.navbar-toggler');
const navbarCollapse = document.querySelector('.navbar-collapse');
const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]')
// 通过标签名选择元素
var elements = document.getElementById("navigation").getElementsByTagName("a");
// 使用更复杂的选择器
const targetElement = document.querySelector(targetId);
const dropdowns = document.querySelectorAll('.dropdown');
事件监听器
DOMContentLoaded事件
DOMContentLoaded是项目中最常用的事件,确保DOM完全加载后再执行脚本:
// 基本用法
document.addEventListener('DOMContentLoaded', function() {
// 在这里执行DOM操作
renderMathInElement(document.getElementById("content"), {
// 配置选项
});
});
// 箭头函数写法
document.addEventListener('DOMContentLoaded', () => {
window.ImageHandler.init();
});
其他常用事件监听
// 滚动事件
window.addEventListener('scroll', function() {
const scrollTop = window.pageYOffset || document.documentElement.scrollTop;
// 处理滚动逻辑
});
// 点击事件
document.addEventListener('click', function(event) {
var isClickInsideElement = suggestions.contains(event.target);
if (!isClickInsideElement) {
suggestions.classList.add('d-none');
}
});
// 键盘事件
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape') {
this.closeZoom();
}
});
// 窗口大小变化事件
window.addEventListener('resize', function() {
if (window.innerWidth >= 992) {
// 处理响应式逻辑
}
});
DOM操作实例
元素样式操作
// 添加/移除类
navbar.classList.add("nav-sticky");
navbar.classList.remove("scrolled");
navbar.classList.toggle('open');
// 直接修改样式
mybutton.style.display = "block";
overlay.style.borderBottom = '1px solid var(--alert-border-color)'
元素属性操作
// 获取属性
const isExpanded = navbarToggler.getAttribute('aria-expanded') === 'true';
const href = elem.target.getAttribute("href");
// 设置属性
navbarToggler.setAttribute('aria-expanded', 'false');
element.setAttribute('data-collapse-state', 'collapsed');
创建和插入元素
// 创建新元素
const overlay = document.createElement('div');
overlay.className = 'image-overlay';
const collapseBtn = document.createElement('button');
collapseBtn.setAttribute('type', 'button');
// 克隆元素
const clonedElement = this.cloneImageElement(element);
// 插入元素
document.body.appendChild(overlay);
parent.insertBefore(wrapper, block);
wrapper.appendChild(block);
全局JS注册
直接挂载到window对象
最简单直接的方式是将函数或对象挂载到window对象上:
// 注册全局函数
window.toggleMenu = function() {
const isActive = legacyToggle.classList.contains('active');
if (isActive) {
legacyToggle.classList.remove('active');
navigation.classList.remove('show');
} else {
legacyToggle.classList.add('active');
navigation.classList.add('show');
}
};
// 注册全局对象
window.ImageHandler = {
init() {
// 初始化逻辑
},
toggleZoom(element) {
// 缩放功能
},
closeZoom() {
// 关闭功能
}
};
// 注册全局工具函数
window.sanitizeHTML = function (str) {
return str.replace(/[^\w. ]/gi, function (c) {
return '&#' + c.charCodeAt(0) + ';';
});
};
模块导出与全局注册结合
对于模块化代码,可以同时使用ES6模块导出和全局注册:
加载中...
最后更新于 2025-12-20 17:30