当前位置:首页 > 技术 > 正文内容

JavaScript DOM 基础入门

访客 技术 2026年6月10日 1

之前我们主要讨论了 JavaScript 的语法核心,即 ECMAScript 规范。现在,我们将深入探讨 JavaScript 的另一重要组成部分——DOM(文档对象模型)。DOM 是操作网页元素的 API,它允许我们通过脚本动态地访问和修改文档的内容、结构和样式。

什么是 DOM?

DOM 全称为 Document Object Model(文档对象模型)。它为 HTML 文档提供了一种结构化的表示方式,并定义了如何通过脚本来访问和操作文档结构。其根本目的是让 JavaScript 能够与 HTML 元素进行交互,并制定了一套标准规范。

DOM 的核心构成是节点(Node)。节点是构成 HTML 页面的最基本单元。网页中的任何部分,如 HTML 标签、属性、文本内容、注释乃至整个文档,都可以被视为一个节点。尽管都是节点,但它们的类型各不相同。常见的节点类型包括四种:

  • 文档节点:代表整个 HTML 文档。
  • 元素节点:即 HTML 标签。
  • 属性节点:元素的属性(如 class, id 等)。
  • 文本节点:HTML 标签内的文本内容(包括标签间的空格和换行)。

不同类型的节点拥有不同的属性和方法。实际上,所有节点都是对象(Object)。当 HTML 加载完成时,渲染引擎会在内存中构建一棵 DOM 树,而诸如 getElementById 的方法就是从这棵树中获取元素节点。后续的修改操作实际上是在改变这些元素的属性。

DOM 的功能

利用 DOM,我们可以做什么?

  • 查找元素节点:获取页面上的特定元素。
  • 设置元素属性值:修改元素的 HTML 属性。
  • 调整元素样式:动态改变元素的 CSS 样式。
  • 动态创建与删除元素:在页面中添加或移除节点。
  • 处理事件:响应用户操作(如点击、键盘输入等)。

获取 DOM 节点

要操作元素节点,首先必须找到它。以下三种方式是获取 DOM 节点的常用方法:

// 通过 id 获取单个元素节点(id 是唯一的)
var myDiv = document.getElementById("box1");

// 通过标签名获取元素节点数组(注意复数形式)
var divArray = document.getElementsByTagName("div");

// 通过 class 名称获取元素节点数组
var elementsWithClass = document.getElementsByClassName("hehe");

DOM 节点之间存在关联,我们可以通过节点间的相对关系来访问它们。这些关系以属性的形式存在:

父节点兄弟节点子节点所有子节点
parentNode nextSibling
nextElementSibling
previousSibling
previousElementSibling
firstChild
firstElementChild
lastChild
lastElementChild
childNodes
children
var parent = node.parentNode;                // 获取父节点
var nextBro = node.nextElementSibling || node.nextSibling; // 下一个兄弟节点
var prevBro = node.previousElementSibling || node.previousSibling; // 上一个兄弟节点
var sibling = node.parentNode.children[index]; // 通过父节点随意获取兄弟节点
var firstChildElement = node.firstElementChild || node.firstChild; // 第一个子元素节点
var lastChildElement = node.lastElementChild || node.lastChild;    // 最后一个子元素节点
var allChild = parent.childNodes;            // 获取所有子节点

操作 DOM 节点

前面介绍的是访问节点(属性),现在来学习操作节点(方法)。

创建节点

var newElement = document.createElement("tagName");
// 示例:
var listItem = document.createElement("li");   // 创建一个 li 标签
var customItem = document.createElement("adbc"); // 创建一个不存在的标签(可能无效)
console.log(listItem);
console.log(customItem);
console.log(typeof listItem);
console.log(typeof customItem);

插入节点

插入节点有两种方式:

// 方式一:追加到父节点的最后
parentNode.appendChild(newChildNode);

// 方式二:在参考节点前插入;如果参考节点为 null,则追加到最后
parentNode.insertBefore(newChildNode, referenceNode);

删除节点

// 用父节点删除子节点
parentNode.removeChild(childNode);

// 如果要删除自身
node.parentNode.removeChild(node);

复制节点

var clone = node.cloneNode();        // 浅克隆:只复制节点本身,不复制子节点
var deepClone = node.cloneNode(true); // 深克隆:同时复制所有子节点

操作节点属性

以如下图片元素为例:

<img src="images/1.jpg" class="img" title="hahah" alt="seeyou" id="a1">

获取属性

var img = document.getElementsByTagName("img")[0];
console.log(img.src);        // 方式一:直接属性名
console.log(img["src"]);     // 方式二:方括号
console.log(img.getAttribute("src")); // 方式三:getAttribute 方法

设置属性

img.src = "images/2.jpg";                // 直接赋值
img.className = "image2-box";             // 修改 class
img.setAttribute("title", "new title");    // 使用 setAttribute

删除属性

img.removeAttribute("class");
img.removeAttribute("id");

注意innerHTMLinnerText 的区别:

  • innerHTML:包含标签的完整内容。
  • innerText(旧版火狐用 textContent):仅文本内容,不包含标签。

还有 nodeType 属性:nodeType == 1 代表元素节点(标签),nodeType == 2 代表属性节点,nodeType == 3 代表文本节点。

style 属性

通过 style 属性只能操作行内样式,无法读取内嵌或外链样式。格式如下:

element.style.styleName;         // 获取样式值
element.style["propertyName"];   // 方括号形式
element.style.propertyName = value; // 设置样式

注意事项:

  • 适用于样式较少的情况。
  • style 是对象,值是字符串。
  • 命名采用驼峰规则(如 backgroundColor 而非 background-color)。
  • box.style.cssText = "样式字符串" 可批量设置。

事件基础

事件是文档或浏览器中发生的特定交互瞬间,JavaScript 以事件驱动为核心。事件三要素:

  • 事件源:触发事件的 HTML 元素。
  • 事件:预定义的交互动作(如点击、悬停)。
  • 事件驱动程序:执行 DOM 操作的代码。

基本写法:

// 1. 获取事件源
var btn = document.getElementById("target1");
// 2. 绑定事件
btn.onclick = function() {
    // 3. 事件驱动程序
    alert("事件被触发了!");
};

常见事件一览:

事件名触发时机
onclick鼠标点击
ondblclick鼠标双击
onkeyup按键松开
onchange内容变化(如文本框、下拉菜单)
onfocus获得焦点
onblur失去焦点
onmouseover鼠标悬停
onmouseout鼠标移出
onload页面加载完成
onunload页面关闭
onsubmit表单提交
onreset表单重置

绑定事件的方式

直接绑定

var btn = document.getElementById("target1");
btn.onclick = function() {
    alert("直接绑定方式");
};
// 或者引用函数名(注意不加括号)
btn.onclick = myHandler;
function myHandler() {
    alert("函数引用方式");
}

行内绑定

<button id="target1" type="submit" onclick="showAlert()">点击我</button>
<script>
function showAlert() {
    alert("行内绑定调用函数");
}
</script>

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。