一、 获取/查询节点 (Selecting Elements)
这是最基础也是最频繁的操作,用于在 DOM 树中找到需要操作的元素。
**document.getElementById(id)**- 说明: 通过元素的
id属性获取单个元素,速度最快。ID 在整个文档中应该是唯一的。 - 示例:
const container = document.getElementById('main-container');
- 说明: 通过元素的
**document.getElementsByTagName(tagName)**- 说明: 通过标签名获取一个元素的集合 (HTMLCollection)。这是一个“实时”的集合,当 DOM 变化时,它会自动更新。
- 示例:
const allParagraphs = document.getElementsByTagName('p');
**document.getElementsByClassName(className)**- 说明: 通过类名获取一个元素的集合 (HTMLCollection),同样是实时的。
- 示例:
const highlights = document.getElementsByClassName('highlight');
**document.querySelector(selector)**- 说明: (非常常用) 使用 CSS 选择器语法获取匹配的第一个元素。功能强大且灵活。
- 示例:
const firstItem = document.querySelector('#list .item');
**document.querySelectorAll(selector)**- 说明: (非常常用) 使用 CSS 选择器语法获取匹配的所有元素,返回一个静态的 NodeList。它不是实时的,不会随 DOM 变化而自动更新。
- 示例:
const allItems = document.querySelectorAll('#list .item');
二、 修改节点 (Modifying Elements)
获取到元素后,我们通常需要修改它的内容、样式或属性。
**element.innerHTML**- 说明: 获取或设置一个元素内部的 HTML 内容。可以解析 HTML 标签。
- 注意: 直接设置
innerHTML时要注意 XSS (跨站脚本) 攻击风险。 - 示例:
container.innerHTML = '<h2>New Title</h2><p>New content.</p>';
**element.textContent**- 说明: 获取或设置一个元素及其所有后代的文本内容。它会自动转义 HTML 标签,因此更安全。
- 示例:
title.textContent = 'This is a safe title';
**element.style.property**- 说明: 直接修改元素的内联样式。CSS 属性名需要写成驼峰式 (camelCase),例如
background-color变成backgroundColor。 - 示例:
container.style.backgroundColor = 'blue'; container.style.fontSize = '16px';
- 说明: 直接修改元素的内联样式。CSS 属性名需要写成驼峰式 (camelCase),例如
**element.setAttribute(name, value)**/**element.getAttribute(name)**- 说明: 设置或获取元素的属性。
- 示例:
const img = document.querySelector('img'); img.setAttribute('src', 'new_image.jpg');
**element.removeAttribute(name)**- 说明: 移除元素的某个属性。
- 示例:
const input = document.querySelector('input'); input.removeAttribute('disabled');
三、 增、删、插节点 (Creating, Adding & Removing Elements)
动态地在页面上创建、添加或删除元素。
**document.createElement(tagName)**- 说明: 创建一个指定标签名的新元素节点。
- 示例:
const newDiv = document.createElement('div');
**parentNode.appendChild(childNode)**- 说明: 将一个节点
childNode添加到parentNode的子节点列表的末尾。 - 示例:
document.body.appendChild(newDiv);
- 说明: 将一个节点
**parentNode.insertBefore(newNode, referenceNode)**- 说明: 在
referenceNode之前插入newNode。 - 示例:
const container = document.getElementById('container'); const firstChild = container.firstChild; container.insertBefore(newDiv, firstChild);
- 说明: 在
**parentNode.removeChild(childNode)**- 说明: 从
parentNode中移除一个子节点childNode。 - 示例:
container.removeChild(someOldDiv);
- 说明: 从
**element.remove()**- 说明: (现代、推荐) 一个更简单的方法,直接在要删除的元素上调用即可。
- 示例:
const elementToRemove = document.getElementById('old-element'); elementToRemove.remove();
**element.append(...nodes)**/**element.prepend(...nodes)**- 说明: (现代、推荐) 更灵活的添加方法。可以在元素内部的末尾 (
append) 或开头 (prepend) 添加多个节点或文本字符串。 - 示例:
const p = document.createElement('p'); container.append('Some text', p);
- 说明: (现代、推荐) 更灵活的添加方法。可以在元素内部的末尾 (
四、 Class 操作 (Class Manipulation)
动态地添加、移除或切换元素的 CSS 类,是实现交互效果的关键。
**element.className**- 说明: 获取或设置元素的
class属性(一个字符串)。操作单个类不方便。 - 示例:
div.className = 'class1 class2';
- 说明: 获取或设置元素的
**element.classList**- 说明: (非常常用,推荐) 返回一个元素的
DOMTokenList,提供了一系列方便的方法来操作类。 **element.classList.add('className')**: 添加一个类。**element.classList.remove('className')**: 移除一个类。**element.classList.toggle('className')**: 如果类存在则移除,不存在则添加。**element.classList.contains('className')**: 检查是否包含某个类,返回true或false。- 示例:
div.classList.add('active'); div.classList.remove('hidden'); if (div.classList.contains('active')) { ... }
- 说明: (非常常用,推荐) 返回一个元素的
五、 事件处理 (Event Handling)
让页面响应用户的操作(点击、滚动、键盘输入等)。
**element.addEventListener(event, handler, options)**- 说明: (现代标准,推荐) 为元素添加一个事件监听器。可以为同一事件添加多个监听器。
event: 事件类型字符串,如'click','mouseover','keydown'。handler: 事件触发时执行的函数。options: 可选参数对象,如{ once: true, capture: false, passive: true }。- 示例:
const btn = document.getElementById('myBtn'); btn.addEventListener('click', () => { alert('Button clicked!'); });
**element.removeEventListener(event, handler)**- 说明: 移除通过
addEventListener添加的事件监听器。注意,移除时传入的handler必须是添加时的同一个函数引用。 - 示例:
btn.removeEventListener('click', handleClickFunction);
- 说明: 移除通过
六、 节点遍历 (DOM Traversal)
从一个已知节点出发,导航到其父、子或兄弟节点。
**node.parentNode**: 获取节点的父节点。**node.parentElement**: 获取节点的父元素节点(通常与parentNode相同,但更常用)。**node.childNodes**: 获取包含所有子节点(包括文本节点、注释节点)的 NodeList。**node.children**: (常用) 获取只包含元素子节点的 HTMLCollection。**node.firstChild**/**node.lastChild**: 获取第一个/最后一个子节点(可能是文本节点)。**node.firstElementChild**/**node.lastElementChild**: (常用) 获取第一个/最后一个元素子节点。**node.nextSibling**/**node.previousSibling**: 获取下一个/上一个兄弟节点(可能是文本节点)。**node.nextElementSibling**/**node.previousElementSibling**: (常用) 获取下一个/上一个元素兄弟节点。
七、 尺寸与位置 (Dimensions & Position)
获取元素在页面中的大小和位置,常用于布局计算和动画。
**element.getBoundingClientRect()**- 说明: (非常有用) 返回一个
DOMRect对象,包含元素的大小及其相对于视口 (viewport) 的位置。包含left,top,right,bottom,x,y,width,height属性。 - 示例:
const rect = myElement.getBoundingClientRect(); console.log(rect.width, rect.top);
- 说明: (非常有用) 返回一个
**element.offsetWidth**/**element.offsetHeight**- 说明: 获取元素的宽度/高度,包括内边距 (padding) 和边框 (border)。
**element.clientWidth**/**element.clientHeight**- 说明: 获取元素的内部宽度/高度,只包括内边距 (padding),不包括边框和滚动条。
**element.scrollTop**/**element.scrollLeft**- 说明: 获取或设置元素内容垂直/水平滚动的像素数。