选取页面上的元素、响应点击,并采用事件委托来编写高性能代码。
在 Kodokon 中打开本课DOM 是你 HTML 页面的活体表示:操作它正是 JavaScript 让界面变得可交互的方式。核心搭档:选取一个元素,然后监听它身上发生的事。让我们从一个小小的初始结构开始。
<button id="save-btn" class="btn">Save</button>
<ul class="task-list">
<li>Buy groceries</li>
<li>Call the client</li>
</ul>querySelector 接受任意 CSS 选择器(#id、.class、ul li、[data-id]),并返回第一个匹配的元素,或 null。querySelectorAll 以 NodeList 的形式返回所有匹配的元素,你可以用 forEach 遍历它。
const button = document.querySelector("#save-btn");
const firstTask = document.querySelector(".task-list li");
const tasks = document.querySelectorAll(".task-list li");
console.log(tasks.length); // 2
console.log(firstTask.textContent); // "Buy groceries"要响应用户操作,addEventListener 会把一个函数绑定到某种事件类型上:click、input、submit、keydown……该函数会接收一个描述所发生之事的 event 对象。随后你可以用 textContent 改变内容,用 classList 改变样式。
const button = document.querySelector("#save-btn");
button.addEventListener("click", () => {
button.textContent = "Saved!";
button.classList.add("success");
});一个良好的专业习惯:一个包含 200 个条目的列表不值得配 200 个监听器。把单个监听器绑定到父元素上,并用 event.target 识别被点击的元素。这就是事件委托:它甚至对之后才添加的元素也有效。
const list = document.querySelector(".task-list");
list.addEventListener("click", (event) => {
const item = event.target.closest("li");
if (item) {
item.classList.toggle("done");
}
});document.querySelector(".btn") 会返回什么?addEventListener 的第二个参数的作用是什么?event.target 代表什么?