Skip to content

选择元素

在 DOM 操作中,选择元素是最基本也是最重要的操作之一。JavaScript 提供了多种方法来选择文档中的元素。

通过 ID 选择元素

使用 getElementById() 方法可以通过元素的 ID 来选择元素。这是最直接和高效的方法之一。

语法

javascript
let element = document.getElementById(id);

示例

html
<!DOCTYPE html>
<html>
<head>
    <title>选择元素示例</title>
</head>
<body>
    <h1 id="main-title">主标题</h1>
    <p id="description">这是一段描述文本。</p>
    <button id="my-button">点击我</button>
</body>
</html>
javascript
// 选择元素
let title = document.getElementById("main-title");
let description = document.getElementById("description");
let button = document.getElementById("my-button");

// 修改元素内容
title.textContent = "新的主标题";
description.style.color = "blue";

// 添加事件监听器
button.addEventListener("click", function() {
    alert("按钮被点击了!");
});

通过类名选择元素

使用 getElementsByClassName() 方法可以通过类名来选择元素。该方法返回一个 HTMLCollection。

语法

javascript
let elements = document.getElementsByClassName(className);

示例

html
<!DOCTYPE html>
<html>
<head>
    <title>选择元素示例</title>
</head>
<body>
    <p class="highlight">段落 1</p>
    <p class="highlight">段落 2</p>
    <p class="normal">段落 3</p>
    <div class="highlight">这是一个 div 元素</div>
</body>
</html>
javascript
// 选择所有具有 highlight 类的元素
let highlightedElements = document.getElementsByClassName("highlight");

// 遍历所有选中的元素
for (let i = 0; i < highlightedElements.length; i++) {
    highlightedElements[i].style.backgroundColor = "yellow";
}

// 使用 Array.from() 转换为数组以便使用数组方法
let elementsArray = Array.from(highlightedElements);
elementsArray.forEach(function(element) {
    element.style.fontWeight = "bold";
});

通过标签名选择元素

使用 getElementsByTagName() 方法可以通过标签名来选择元素。该方法也返回一个 HTMLCollection。

语法

javascript
let elements = document.getElementsByTagName(tagName);

示例

html
<!DOCTYPE html>
<html>
<head>
    <title>选择元素示例</title>
</head>
<body>
    <h1>标题 1</h1>
    <h2>标题 2</h2>
    <p>段落 1</p>
    <p>段落 2</p>
    <div>Div 1</div>
    <div>Div 2</div>
</body>
</html>
javascript
// 选择所有 h1 元素
let h1Elements = document.getElementsByTagName("h1");
h1Elements[0].style.color = "red";

// 选择所有 p 元素
let pElements = document.getElementsByTagName("p");
for (let i = 0; i < pElements.length; i++) {
    pElements[i].style.marginBottom = "10px";
}

// 选择所有 div 元素
let divElements = document.getElementsByTagName("div");
Array.from(divElements).forEach(function(div) {
    div.style.border = "1px solid black";
});

使用 querySelector

querySelector() 方法使用 CSS 选择器语法来选择元素,返回匹配的第一个元素。

语法

javascript
let element = document.querySelector(selectors);

示例

html
<!DOCTYPE html>
<html>
<head>
    <title>选择元素示例</title>
    <style>
        .container {
            padding: 20px;
        }
        #main-content {
            background-color: #f0f0f0;
        }
        .item:first-child {
            font-weight: bold;
        }
    </style>
</head>
<body>
    <div class="container">
        <div id="main-content">
            <p class="item">项目 1</p>
            <p class="item">项目 2</p>
            <p class="item">项目 3</p>
        </div>
    </div>
</body>
</html>
javascript
// 通过 ID 选择元素
let mainContent = document.querySelector("#main-content");

// 通过类名选择元素
let container = document.querySelector(".container");

// 通过标签名选择元素
let firstParagraph = document.querySelector("p");

// 使用复杂选择器
let firstItem = document.querySelector(".item:first-child");
let nestedElement = document.querySelector(".container #main-content .item");

// 修改选中元素的样式
mainContent.style.padding = "30px";
firstItem.style.color = "red";

使用 querySelectorAll

querySelectorAll() 方法使用 CSS 选择器语法来选择所有匹配的元素,返回一个 NodeList。

语法

javascript
let elements = document.querySelectorAll(selectors);

示例

html
<!DOCTYPE html>
<html>
<head>
    <title>选择元素示例</title>
    <style>
        .highlight {
            background-color: yellow;
        }
        .card {
            border: 1px solid #ccc;
            padding: 10px;
            margin: 10px 0;
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="card">
            <h2>卡片 1</h2>
            <p class="highlight">这是卡片 1 的内容</p>
        </div>
        <div class="card">
            <h2>卡片 2</h2>
            <p>这是卡片 2 的内容</p>
        </div>
        <div class="card">
            <h2>卡片 3</h2>
            <p class="highlight">这是卡片 3 的内容</p>
        </div>
    </div>
</body>
</html>
javascript
// 选择所有卡片元素
let cards = document.querySelectorAll(".card");

// 为每个卡片添加边框样式
cards.forEach(function(card, index) {
    card.style.borderLeft = "5px solid #" + (index * 50 + 100);
});

// 选择所有具有 highlight 类的段落
let highlightedParagraphs = document.querySelectorAll("p.highlight");

// 修改所有高亮段落的样式
highlightedParagraphs.forEach(function(paragraph) {
    paragraph.style.fontWeight = "bold";
    paragraph.style.padding = "5px";
});

// 使用复杂选择器
let cardTitles = document.querySelectorAll(".card h2");
cardTitles.forEach(function(title) {
    title.style.color = "blue";
});

NodeList 与 HTMLCollection 的区别

querySelectorAll() 返回 NodeList,而 getElementsByClassName()getElementsByTagName() 返回 HTMLCollection。两者有重要区别:

javascript
// HTMLCollection 是动态的
let liveDivs = document.getElementsByTagName("div");
console.log(liveDivs.length); // 假设输出 3

// 添加新 div
let newDiv = document.createElement("div");
document.body.appendChild(newDiv);

console.log(liveDivs.length); // 输出 4,自动更新

// NodeList 是静态的(querySelectorAll 返回的)
let staticDivs = document.querySelectorAll("div");
console.log(staticDivs.length); // 假设输出 4

// 添加新 div
let anotherDiv = document.createElement("div");
document.body.appendChild(anotherDiv);

console.log(staticDivs.length); // 仍然输出 4,不会自动更新

最佳实践

  1. 优先使用 querySelector/querySelectorAll:它们使用 CSS 选择器语法,更强大且一致。

  2. 缓存选择结果:如果需要多次使用同一个元素,应该将其存储在变量中。

javascript
// 不好的做法
document.querySelector("#myButton").addEventListener("click", handler1);
document.querySelector("#myButton").style.color = "red";
document.querySelector("#myButton").textContent = "新文本";

// 好的做法
let button = document.querySelector("#myButton");
button.addEventListener("click", handler1);
button.style.color = "red";
button.textContent = "新文本";
  1. 检查元素是否存在:在操作元素之前检查它是否存在。
javascript
let element = document.querySelector("#myElement");
if (element) {
    // 元素存在,可以安全操作
    element.style.display = "none";
} else {
    // 元素不存在,处理错误情况
    console.log("元素未找到");
}
  1. 使用有意义的选择器:选择器应该清晰地表达选择元素的意图。
javascript
// 不清晰的选择器
let elements = document.querySelectorAll(".c");

// 清晰的选择器
let buttons = document.querySelectorAll(".submit-button");
  1. 避免过度具体的选择器:过于具体的选择器可能在 HTML 结构变化时失效。
javascript
// 过于具体
let element = document.querySelector("body > div.container > ul.list > li.item");

// 更好的做法
let element = document.querySelector(".item");

通过掌握这些选择元素的方法,您可以更有效地操作 DOM,创建动态和交互式的网页。