六维教程

JavaScript 操作 DOM 内容与属性

上一篇解决了怎么拿元素,这一篇解决拿到之后改什么。改文本用 textContent,改 HTML 用 innerHTML,改属性用 getAttribute 和 setAttribute,改类名用 classList。每个场景都有更推荐的用法,挨个看。

读取和修改文本 textContent

textContent 读取或修改元素里的纯文本,只处理文字,不解析标签,安全也直观,是操作文本的首选。

<p id="msg">旧内容</p>
const msg = document.querySelector('#msg');

console.log(msg.textContent); // 旧内容

msg.textContent = '新内容';
console.log(msg.textContent); // 新内容

赋的新值是普通文本,就算里面写了 <b> 也会被当作普通字符原样显示,不会变成粗体标签。

读取和修改 HTML innerHTML

innerHTML 把元素内部的 HTML 整体替换掉,可以插入真正的标签。

<div id="box"></div>
const box = document.querySelector('#box');

box.innerHTML = '<p>第一行</p><p>第二行</p>';
// 页面里出现两个 p 标签

功能强大,但有个必须牢记的风险,XSS。如果把用户的输入直接塞进 innerHTML,用户就能让浏览器执行任意脚本。下面的写法是危险的,不要模仿。

// 危险示例,绝对不要这样写
const userInput = '<img src=x onerror="alert(\'你被攻击了\')">';
box.innerHTML = userInput;

用户输入想显示为文本,用 textContent 而不是 innerHTML。只有内容完全由自己控制、确实需要插入标签时,才使用 innerHTML。

读取和设置属性 getAttribute / setAttribute

getAttribute 读取任意 HTML 属性,setAttribute 设置或修改任意属性,第一个参数是属性名,第二个参数是值。

<a id="link" href="https://example.com" target="_blank">链接</a>
const link = document.querySelector('#link');

console.log(link.getAttribute('href')); // https://example.com

link.setAttribute('href', 'https://baidu.com');
link.setAttribute('title', '提示文字');
// 修改了 href,新增了 title

属性不存在时 getAttribute 返回 null,可以判断后再处理。

操作类名 classList

改类名用 classList,它提供 add、remove、toggle 三个常用方法,比直接拼接 className 字符串优雅得多。

  • add(‘类名’) 添加一个类。
  • remove(‘类名’) 移除一个类。
  • toggle(‘类名’) 有就移除,没有就添加,相当于开关。
.highlight {
  background-color: yellow;
}
<p id="tip">普通文字</p>
const tip = document.querySelector('#tip');

tip.classList.add('highlight');    // 加上高亮,背景变黄
tip.classList.remove('highlight'); // 去掉高亮,恢复普通
tip.classList.toggle('highlight'); // 现在没有这个类,会被加上

toggle 特别适合做开关类的效果,点一下加类,再点一下去掉类。

小结

  • 操作文本用 textContent,只处理文本,安全。
  • innerHTML 能插入标签,但用户输入绝不能直接塞进去,防止 XSS。
  • getAttribute 和 setAttribute 读取和设置任意 HTML 属性。
  • classList 的 add、remove、toggle 是操作类名的现代推荐用法。
  • 下一篇讲怎么在页面上创建新元素和删除旧元素。
上一篇
JavaScript 获取 DOM 元素
下一篇
JavaScript 创建与删除 DOM 元素