正在加载...

用 JavaScript 改 HTML

页面上已经有一张轮渡纸条:船名是 Gull,时间是 09:10,备注写着 Boarding。改 HTML,就是往你已经拿到的元素里写新内容。boat.textContent = "Heron" 放进去的是普通文字 Heron。note.textContent = "<em>Late</em>" 会把这些字符原样显示出来,note.querySelector("em") 是 null。note.innerHTML = "<em>Late</em>" 会造出一个文字为 Late 的 em。这之后 note.textContent 是 Late,而 note.innerHTML 里仍带着标签。再写一次 note.innerHTML = "Dock 2",那个 em 就被删掉。note.insertAdjacentHTML("beforeend", " <span>gate B</span>") 保留 Dock 2,再补上 gate B,备注读成 Dock 2 gate B。时间没有被赋值,所以一直是 09:10。

这页是在写,不是再找一遍

上一页比较的是怎么找到节点。这一页不数集合,不读下标,也不沿着 parentElement 走。getElementById 只是把纸条交给你。要学的是你赋进去的值。

每次写入在备注上留下什么

备注从 Boarding 开始。按顺序看每一行。每次赋值要么换掉备注,要么把它加长。

📊 每次写入在备注上留下什么

写入 你看到的 还留下什么 容易混
textContent = "Heron" 写在船上 Heron 一个文本节点 一个名叫 Heron 的元素
textContent = "<em>Late</em>" 字符 <em>Late</em> 没有 em 元素 真的 em
innerHTML = "<em>Late</em>" Late 一个 em 以为 textContent 里还有标签
innerHTML = "Dock 2" Dock 2 em 没了 em 还挨着 Dock 2
insertAdjacentHTML("beforeend", " <span>gate B</span>") Dock 2 gate B Dock 2 再加一个 span 用 innerHTML 会丢掉 Dock 2

textContent 存的是字符串,不解析标签。innerHTML 会解析标签,并把元素里原有的子节点全部丢掉。insertAdjacentHTML 也会解析标签,但 beforeend 是把新节点放在现有内容后面。窗口上敲进去的船名应该放进 textContent。同一串字符若交给 innerHTML,小于号会被当成标记。

先读纸条,再写

文件打开时有三个值。还没有任何赋值。

先读纸条

javascript
console.log(document.getElementById("boat").textContent);
console.log(document.getElementById("when").textContent);
console.log(document.getElementById("note").textContent);

三次输出是 Gull、09:10 和 Boarding。时间是单独的一段。后面的写入都不会碰到 when。

字还是字

textContent 用一个文本节点换掉全部子节点。看起来像标签的字符仍然是字符。

普通文字

javascript
let boat = document.getElementById("boat");
let note = document.getElementById("note");
boat.textContent = "Heron";
note.textContent = "<em>Late</em>";
console.log(boat.textContent);
console.log(note.textContent);
console.log(note.querySelector("em"));

第一行是 Heron。第二行是字符 <em>Late</em>。第三行是 null。备注把标签当文字显示,并没有造出元素。

innerHTML 才会造出元素

把同一串字符交给 innerHTML。解析器把它变成节点,并换掉备注里原来的内容。

解析后的标记

javascript
let note = document.getElementById("note");
note.innerHTML = "<em>Late</em>";
console.log(note.textContent);
console.log(note.innerHTML);
console.log(note.querySelector("em") === null);

第一行是 Late。第二行是 <em>Late</em>,因为 innerHTML 返回的是带标签的标记字符串。第三行是 false:em 在,所以它不是 null。看得见的词和标记字符串,是同一个元素的两种读法。

下一次 innerHTML 会清掉这个 em

新的 innerHTML 会换掉整段备注。em 不会留在新文字旁边。

再换一次

javascript
let note = document.getElementById("note");
note.innerHTML = "Dock 2";
console.log(note.textContent);
console.log(note.querySelector("em"));

第一行是 Dock 2。第二行是 null。Boarding 早就没了。这一次连 em 也没了。

加上 gate B,Dock 2 还在

insertAdjacentHTML("beforeend", ...) 解析一段片段,放到末尾。这个字符串以空格开头,两段话才不会粘成一个词。别的位置也有。这一页只用 beforeend。

加在末尾

javascript
let note = document.getElementById("note");
note.insertAdjacentHTML("beforeend", " <span>gate B</span>");
console.log(note.textContent);
console.log(note.querySelector("span").textContent);

第一行是 Dock 2 gate B。第二行是 gate B。Dock 2 还在备注里。若用 innerHTML 赋同一段 span 字符串,Dock 2 会被删掉。

纸条下面的一行

脚本放在 body 末尾,纸条已经在页面上。它先把 Late 这个词存下来,再让 Dock 2 换掉 em,然后用船名、存下的词,以及加上 gate B 之后的备注,拼出一行。

页面示例 — 轮渡纸条

html
<!DOCTYPE html>
<html>
<head>
<title>changing html — page</title>
</head>
<body>
<article id="slip">
<h2 id="boat">Gull</h2>
<p id="when">09:10</p>
<p id="note">Boarding</p>
<p id="line">…</p>
</article>
<script>
let boat = document.getElementById("boat");
let note = document.getElementById("note");
boat.textContent = "Heron";
note.innerHTML = "<em>Late</em>";
let late = note.textContent;
note.innerHTML = "Dock 2";
note.insertAdjacentHTML("beforeend", " <span>gate B</span>");
document.getElementById("line").textContent = boat.textContent + " / " + late + " / " + note.textContent;
</script>
</body>
</html>

这一行是 Heron / Late / Dock 2 gate B。时间仍是 09:10。行里的 Late 是清掉之前存下的词。备注本身已经不写 Late。下一页改的是这类元素的 CSS,不会再教一种新的选取办法。

核对这张纸条

  1. 输出三个起始文本,期望 Gull、09:10 和 Boarding
  2. 把船写成 Heron,把备注写成 em 那些字符,期望那串字符,以及 em 为 null
  3. 把 innerHTML 设成 em 字符串,期望 textContent 为 Late,innerHTML 仍带标签,并且 em 不是 null
  4. 把 innerHTML 设成 Dock 2,期望 em 为 null
  5. 用 beforeend 加上 span,期望 Dock 2 gate B,再期望 span 的文字是 gate B
  6. 读这一行,期望 Heron / Late / Dock 2 gate B;读时间,期望 09:10

这张纸条上容易写错的地方

页面照样会打开。赋进去的值种类不对。

  • 把窗口上敲的名字放进 innerHTML,< 会被当成标记
  • 以为 textContent = "<em>Late</em>" 会造出 em
  • 写完 em 之后去读 textContent,还指望那串字符串里有标签
  • 再次赋值 innerHTML,还指望 em 留着
  • 用 innerHTML 去加 gate B,结果 Dock 2 没了
  • 丢掉开头的空格,备注变成 Dock 2gate B
  • 在这一页设置 style;下一页才改 CSS
  • 在这里调用 createElement;后面的页面才新建节点

带走这些

  • textContent 写的是纯文本,不解析标签
  • innerHTML 解析标签,并换掉每一个子节点
  • 写完 em 之后,textContent 是 Late,innerHTML 里仍有标签
  • 第二次 innerHTML 会删掉 em
  • insertAdjacentHTML("beforeend", ...) 追加标记,Dock 2 还在
  • 时间停在 09:10,因为没有人给它赋值
  • 这一行是 Heron / Late / Dock 2 gate B

🧠 测试您的知识

准备开始

测试您的知识

通过这个互动测验挑战自己,看看你对这个主题的理解程度如何

❓
8
问题
🎯
70%
及格要求
♾️
∞
时间
🔄
∞
尝试次数

📝 说明

  • 仔细阅读每个问题
  • 为每个问题选择最佳答案
  • 您可以随时重新参加测验
  • 您的进度将显示在顶部