页面上的按钮能点、列表能增删、文字能变颜色,背后都是 JavaScript 在操作 DOM。DOM(Document Object Model,文档对象模型)是浏览器把 HTML 解析出来的一棵节点树,页面里每个标签都对应一个 JS 对象。学会操作 DOM,写出来的代码才能真正"动"网页。
找到元素:querySelector 系列
操作任何元素之前,得先把它从页面里找出来:
// 假设页面里有 <h1 id="title">你好</h1> 和若干 .item 元素
const title = document.querySelector('#title'); // 按 CSS 选择器找第一个
const items = document.querySelectorAll('.item'); // 找所有匹配的
console.log(title.textContent); // 输出:你好
console.log(items.length); // 输出:匹配到的元素个数
querySelector 只要传合法的 CSS 选择器就行:'#title'、'.box'、'ul > li:first-child' 都可以。老的 getElementById、getElementsByClassName 也能用,但日常记住 querySelector 这对组合就够覆盖几乎所有场景了。
修改内容和属性
const title = document.querySelector('#title');
title.textContent = '标题被改了'; // 改成纯文本
title.innerHTML = '标题被<b>改了</b>'; // 会把字符串解析成 HTML
const link = document.querySelector('a');
console.log(link.href); // 读取属性
link.href = 'https://example.com'; // 修改属性
link.setAttribute('target', '_blank'); // 通用写法:设置任意属性
textContent 和 innerHTML 的区别要分清:textContent 一律当纯文本处理,innerHTML 会真的解析标签。内容里如果拼了用户输入的东西,优先用 textContent,不然别人填个 <img onerror=...> 就可能被注入恶意代码。
修改样式与切换类名
const box = document.querySelector('.box');
box.style.color = 'tomato'; // 对应 CSS 的 color
box.style.backgroundColor = '#222'; // 带连字符的属性写成驼峰
box.style.fontSize = '20px'; // 别忘了单位
要改的样式一多,一个个赋值就很啰嗦,更好的做法是切换类名,让样式归 CSS 管:
box.classList.add('active'); // 加类
box.classList.remove('hidden'); // 删类
box.classList.toggle('dark'); // 有就删、没有就加,做开关特别顺手
创建和删除元素
const li = document.createElement('li'); // 新建一个元素,此时还没显示在页面上
li.textContent = '新来的列表项';
document.querySelector('ul').appendChild(li); // 挂到 ul 末尾,页面立刻多一行
li.remove(); // 不要了,直接移除
创建、设置内容、挂载,三步走。经典场景就是点「添加」按钮往待办列表里塞新条目。
监听事件:让页面响应用户
const btn = document.querySelector('button');
btn.addEventListener('click', () => {
console.log('按钮被点了');
const count = +btn.dataset.count + 1; // data-count 自定义属性
btn.dataset.count = count;
btn.textContent = `已点击 ${count} 次`;
});
addEventListener 第一个参数是事件类型,常用的还有 input(输入框打字)、submit(表单提交)、mouseover(鼠标移入)。回调函数里写的代码,会在事件发生的那一刻执行。
小结
querySelector按 CSS 选择器找元素,querySelectorAll找一批textContent改纯文本更安全,innerHTML会解析标签- 改样式优先
classList切类名,style适合临时改一两个属性 createElement+appendChild负责新增元素,remove()负责删除addEventListener把函数和事件绑在一起,是页面交互的入口
先把查找和改内容练熟,再去看事件冒泡、事件委托这些进阶内容会轻松很多。