【JavaScript】day27-dom

作者:mario 发布时间: 2026-08-26 阅读量:3 评论数:0

第二十七天:DOM 操作 — 用 JS 让页面"活"起来

蜗牛往上爬 · 前端工业可视化学习笔记 第 27 篇
之前学的 JS 都跑在"控制台"里,和页面没有关系。今天学 DOM——浏览器把 HTML 解析成节点树,JS 通过操作这棵树来修改页面。获取元素、改内容、改样式、增删节点,最后用 JS 渲染一个设备列表。这是让大屏"动"起来的第一步。


目录


一、什么是 DOM

DOM(Document Object Model):浏览器把 HTML 解析成一棵"节点树"。

document
└── html
    ├── head → meta, title
    └── body
        ├── h1#title
        ├── div.device-card
        ├── ul.device-list
        └── footer

JS 操作 DOM = 操作这棵树 = 修改页面。


二、获取元素

<body>
  <h1 id="title">智慧工厂监控</h1>
  <div class="device-card" data-id="CNC-001">数控机床</div>
  <div class="device-card" data-id="AGV-002">搬运机器人</div>
</body>
// ===== 单个元素 =====
var title = document.getElementById("title");          // 按 id
var firstCard = document.querySelector(".device-card"); // CSS 选择器,第一个

// ===== 多个元素 =====
var cards = document.getElementsByClassName("device-card");  // 类数组 HTMLCollection
var allCards = document.querySelectorAll(".device-card");    // NodeList,推荐

console.log(allCards.length);  // 2
allCards.forEach(function (card) {   // NodeList 可以 forEach
  console.log(card.textContent);
});

// 找不到:单个返回 null,多个返回空 NodeList
console.log(document.getElementById("not-exist"));  // null

推荐:统一用 querySelector / querySelectorAll——CSS 选择器最灵活,不用记多种 API。


三、修改内容与属性

var title = document.getElementById("title");

// ===== 文本内容 =====
title.textContent = "智慧工厂监控平台 V2.0";  // 纯文本,安全(推荐)
// title.innerHTML = "<span>HTML</span>";    // 解析 HTML(慎用,防 XSS)

// ===== 属性 =====
var card = document.querySelector(".device-card");
card.setAttribute("data-status", "运行中");
console.log(card.getAttribute("data-status"));  // "运行中"
card.removeAttribute("data-status");

// ===== 类名(最常用)=====
card.classList.add("is-active");       // 添加
card.classList.remove("is-active");    // 删除
card.classList.toggle("is-active");    // 切换(有删无加)
card.classList.contains("is-active");  // 检查

四、修改样式

var title = document.getElementById("title");

// 方式一:直接改 style(内联样式,优先级最高)
title.style.color = "#00d4ff";
title.style.fontSize = "24px";  // ⭐ CSS 的 font-size → JS 的 fontSize(驼峰)

// 方式二:切换 class(推荐,样式集中在 CSS)
// CSS: .is-warning { color: red; }
title.classList.add("is-warning");

取舍:动态小改动用 style,状态切换用 classList(好维护)。


五、创建与插入节点

// 创建元素
var newCard = document.createElement("div");
newCard.className = "device-card";
newCard.textContent = "新设备 CNC-005";

// 插入(4 种方式)
var list = document.querySelector(".device-list");
list.appendChild(newCard);          // 尾部追加
// list.prepend(newCard);           // 头部插入
// list.insertBefore(newCard, ref); // 插到某元素前

// 删除
// list.removeChild(newCard);  // 父元素删除
newCard.remove();               // 自己删除(推荐)

// 复制
var copy = newCard.cloneNode(true);  // true 深拷贝
list.appendChild(copy);

六、用 JS 渲染设备列表

这是工业大屏最核心的场景:数据在 JS 里,页面展示靠 DOM 渲染。

var devices = [
  { id: "CNC-001", name: "数控机床", temp: 65, status: "运行中" },
  { id: "AGV-002", name: "搬运机器人", temp: 42, status: "待机" },
  { id: "CNC-004", name: "加工中心", temp: 0, status: "故障" }
];

/**
 * 渲染设备列表
 * @param {Array} data 设备数组
 */
function renderDeviceList(data) {
  var list = document.getElementById("device-list");
  list.innerHTML = "";  // 先清空

  data.forEach(function (device) {
    var card = document.createElement("div");
    card.className = "device-card";
    card.setAttribute("data-id", device.id);

    // 状态样式:故障红,其他绿
    var statusClass = device.status === "故障" ? "danger" : "normal";

    card.innerHTML =
      "<div class='device-card__header'>" +
        "<span class='device-card__name'>" + device.name + "</span>" +
        "<span class='device-card__status--" + statusClass + "'>" +
        device.status + "</span>" +
      "</div>" +
      "<div class='device-card__temp'>温度:" + device.temp + "°C</div>";

    list.appendChild(card);
  });
}

renderDeviceList(devices);

渲染三步:清空(innerHTML = "")→ 遍历数据创建元素 → appendChild。


七、常见属性速查

var card = document.querySelector(".device-card");

// 节点关系
card.parentElement;        // 父元素
card.children;             // 子元素集合
card.firstElementChild;    // 第一个子元素
card.nextElementSibling;   // 下一个兄弟

// 尺寸位置
card.offsetWidth;   // 宽(含 padding/border)
card.clientWidth;   // 宽(含 padding,不含 border)
card.getBoundingClientRect().top;  // 距视口顶部

// 表单值
var input = document.getElementById("search");
input.value;  // 输入框的值

八、总结

操作

关键 API

获取元素

getElementById / querySelector / querySelectorAll

改内容

textContent(安全)/ innerHTML(慎用)

改样式

style(内联)/ classList(类切换)

创建

createElement

插入

appendChild / prepend / insertBefore

删除

remove / removeChild

渲染列表

清空 → 遍历 → appendChild

🎯 DOM 让 JS 能操作页面。明天学"事件"——让页面能响应你的点击和输入,这是交互的起点。

评论