ZetCode

JavaScript document.getElementById

最后修改于 2025 年 4 月 2 日

document.getElementById 方法是 JavaScript 中用于 DOM 操作的基础方法之一。它允许您通过 HTML 元素的唯一 ID 属性来选择和操作这些元素。本指南涵盖了从基本用法到高级技术、性能考虑和最佳实践的所有内容。理解此方法对于交互式 Web 开发至关重要。

基本用法

getElementById 方法返回具有指定 ID 属性的元素。ID 在文档中必须是唯一的。本示例演示了通过 ID 进行基本元素选择和操作。

basic_usage.html
<!DOCTYPE html>
<html>
<body>
<div id="header">Welcome to my site</div>
<button id="changeButton">Change Header</button>

<script>
// 1. Basic element selection
const header = document.getElementById('header');
console.log(header.textContent); // "Welcome to my site"

// 2. Modifying element content
header.textContent = "New Welcome Message";

// 3. Changing styles
header.style.color = "blue";
header.style.fontSize = "24px";

// 4. Event handling
document.getElementById('changeButton').addEventListener('click', function() {
    header.textContent = "Header Changed!";
    header.style.backgroundColor = "yellow";
});
</script>
</body>
</html>

示例 1 展示了基本元素选择。示例 2 修改文本内容。示例 3 展示了样式更改。示例 4 向按钮添加了一个事件监听器,该按钮在点击时修改标题。如果不存在具有指定 ID 的元素,该方法将返回 null

何时使用 getElementById

当您需要处理 DOM 中的特定、唯一的元素时,getElementById 是理想的选择。这些示例将其与其他选择方法进行比较,并展示了适当的用例。

when_to_use.html
<!DOCTYPE html>
<html>
<body>
<div id="userProfile">User: John Doe</div>
<div class="item">Item 1</div>
<div class="item">Item 2</div>

<script>
// 5. getElementById vs querySelector
const byId = document.getElementById('userProfile');
const byQuery = document.querySelector('#userProfile');
console.log(byId === byQuery); // true

// 6. When NOT to use getElementById (selecting multiple elements)
const items = document.getElementsByClassName('item'); // Better than querySelectorAll here
items[0].style.color = "red";

// 7. Checking for element existence
const nonExistent = document.getElementById('doesNotExist');
if (nonExistent) {
    console.log("Element exists");
} else {
    console.log("Element not found"); // This will execute
}

// 8. Performance comparison
console.time('getElementById');
for (let i = 0; i < 1000; i++) {
    document.getElementById('userProfile');
}
console.timeEnd('getElementById');

console.time('querySelector');
for (let i = 0; i < 1000; i++) {
    document.querySelector('#userProfile');
}
console.timeEnd('querySelector');
</script>
</body>
</html>

示例 5 展示了使用 querySelector 进行等效选择。示例 6 演示了何时为多个元素使用其他方法。示例 7 检查元素是否存在。示例 8 表明 getElementById 对于 ID 选择通常比 querySelector 更快。

处理表单元素

getElementById 在处理表单元素时特别有用。这些示例演示了常见的表单操作技术。

form_elements.html
<!DOCTYPE html>
<html>
<body>
<form id="userForm">
    <input type="text" id="username" placeholder="Username">
    <input type="password" id="password" placeholder="Password">
    <button type="submit">Submit</button>
</form>
<div id="output"></div>

<script>
// 9. Getting form values
document.getElementById('userForm').addEventListener('submit', function(e) {
    e.preventDefault();
    const username = document.getElementById('username').value;
    const password = document.getElementById('password').value;
    
    // 10. Validating input
    if (username.length < 3) {
        document.getElementById('output').textContent = "Username too short";
        return;
    }
    
    // 11. Form reset
    this.reset();
    document.getElementById('output').textContent = `Welcome ${username}!`;
});

// 12. Programmatic focus
document.getElementById('username').focus();

// 13. Disabling elements
document.getElementById('password').disabled = true;
setTimeout(() => {
    document.getElementById('password').disabled = false;
}, 2000);
</script>
</body>
</html>

示例 9 展示了获取表单值。示例 10 演示了验证。示例 11 重置表单。示例 12 以编程方式设置焦点。示例 13 暂时禁用输入字段。

动态内容操作

这些示例展示了如何使用 getElementById 根据用户操作或其他事件动态修改页面内容。

dynamic_content.html
<!DOCTYPE html>
<html>
<body>
<div id="content">Initial Content</div>
<button id="addButton">Add Item</button>
<ul id="itemList"></ul>

<script>
// 14. Creating and adding elements
const itemList = document.getElementById('itemList');
let counter = 1;

document.getElementById('addButton').addEventListener('click', function() {
    const li = document.createElement('li');
    li.textContent = `Item ${counter++}`;
    itemList.appendChild(li);
});

// 15. Toggling visibility
document.getElementById('content').addEventListener('click', function() {
    this.style.display = this.style.display === 'none' ? 'block' : 'none';
});

// 16. Modifying attributes
const image = document.createElement('img');
image.id = 'dynamicImage';
image.src = 'placeholder.jpg';
image.alt = 'Dynamic image';
document.body.appendChild(image);

setTimeout(() => {
    document.getElementById('dynamicImage').src = 'real-image.jpg';
}, 1500);

// 17. Adding/removing classes
const contentDiv = document.getElementById('content');
contentDiv.classList.add('highlight');

setTimeout(() => {
    contentDiv.classList.remove('highlight');
    contentDiv.classList.add('fade');
}, 1000);
</script>
</body>
</html>

示例 14 动态添加列表项。示例 15 切换元素可见性。示例 16 修改图像属性。示例 17 演示了类列表操作。

高级技术

这些示例展示了 getElementById 的更高级用法,包括处理 SVG、Canvas 和自定义数据属性。

advanced_techniques.html
<!DOCTYPE html>
<html>
<body>
<svg id="mySvg" width="200" height="200">
    <circle id="myCircle" cx="50" cy="50" r="40" fill="red"/>
</svg>

<canvas id="myCanvas" width="200" height="100"></canvas>

<div id="dataElement" data-user-id="12345">User Data</div>

<script>
// 18. Working with SVG
const circle = document.getElementById('myCircle');
circle.addEventListener('click', function() {
    this.setAttribute('fill', 'blue');
    this.setAttribute('r', '30');
});

// 19. Canvas manipulation
const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');
ctx.fillStyle = 'green';
ctx.fillRect(10, 10, 150, 80);

// 20. Accessing data attributes
const dataEl = document.getElementById('dataElement');
console.log(dataEl.dataset.userId); // "12345"
dataEl.dataset.userStatus = "active";
</script>
</body>
</html>

示例 18 操作 SVG 元素。示例 19 演示了 Canvas 绘图。示例 20 展示了如何处理自定义数据属性。

最佳实践

在操作元素之前,请始终检查元素是否存在。将经常访问的元素缓存在变量中。处理唯一元素时,优先使用 getElementById 而非更通用的选择器。使用有意义、描述性的 ID。避免为了样式目的而过度使用 ID(应改用类)。请记住,在 HTML5 中 ID 是区分大小写的。

性能注意事项

getElementById 是最快的 DOM 选择方法之一,因为浏览器通常会维护一个全局 ID 映射。但是,过多的 DOM 操作仍然会影响性能。尽可能批处理您的 DOM 更改。对于动态内容,请使用事件委托,而不是为每个元素单独附加处理程序。

资料来源

从以下资源了解更多信息:MDN document.getElementByIdW3Schools getElementByIdMDN DOM 文档

作者

我的名字是 Jan Bodnar,我是一位充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。