ZetCode

JavaScript element.closest()

最后修改于 2025 年 4 月 2 日

在本文中,我们将探讨 JavaScript 中的 element.closest() 方法。此方法对于 DOM 遍历至关重要,它允许开发人员查找与 CSS 选择器匹配的最近祖先元素。

基本定义

element.closest() 方法返回与指定 CSS 选择器匹配的当前元素的最近祖先。它会从当前元素开始向上遍历 DOM 树。

如果未找到匹配的元素,则该方法返回 null。选择器必须是有效的 CSS 选择器字符串。该方法在向上遍历 DOM 树之前,会从元素本身开始检查。

基本的 closest() 示例

此示例演示了如何查找按钮元素的最近父级 div。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Basic closest()</title>
</head>
<body>

<div class="container">
    <button class="btn">Click me</button>
</div>

<script>
    const btn = document.querySelector('.btn');
    const container = btn.closest('.container');
    console.log(container); // Logs the div.container element
</script>

</body>
</html>

在此基本示例中,我们在一个类为 "container" 的 div 中有一个按钮。JavaScript 代码会查找按钮,然后使用 closest() 获取其类为 "container" 的最近祖先。

这演示了 closest() 在 DOM 树导航中的基本用法。当处理嵌套结构且需要查找特定父元素时,此方法特别有用。

查找最近的表格行

此示例演示了如何从被点击的表格单元格中查找最近的表格行。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Table Row Example</title>
</head>
<body>

<table>
    <tr>
        <td>Row 1, Cell 1</td>
        <td>Row 1, Cell 2</td>
    </tr>
    <tr>
        <td>Row 2, Cell 1</td>
        <td>Row 2, Cell 2</td>
    </tr>
</table>

<script>
    document.querySelector('table').addEventListener('click', function(e) {
        if (e.target.tagName === 'TD') {
            const row = e.target.closest('tr');
            console.log('Clicked row:', row);
        }
    });
</script>

</body>
</html>

这里我们有一个简单的表格,包含两行。当点击一个表格单元格时,事件处理程序会使用 closest() 来查找包含它的行元素。

这表明 closest() 在事件委托场景中非常有用。我们无需为每一行添加事件监听器,而是可以在表格级别处理事件,并在需要时查找相关的行。

查找最近的表单元素

此示例演示了如何从输入元素中查找最近的表单。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Form Example</title>
</head>
<body>

<form id="userForm">
    <div class="form-group">
        <input type="text" name="username" placeholder="Username">
    </div>
    <button type="submit">Submit</button>
</form>

<script>
    const input = document.querySelector('input[name="username"]');
    const form = input.closest('form');
    console.log('Form ID:', form.id); // Logs "userForm"
</script>

</body>
</html>

在此示例中,我们在一个表单中嵌套了一个输入字段。JavaScript 代码会查找输入元素,然后使用 closest() 来定位包含它的表单元素。

这表明 closest() 可以简化表单处理,因为它允许从任何子元素轻松访问表单元素,而无需考虑嵌套深度。

检查最近匹配的类

此示例演示了如何检查元素是否具有具有特定类的父级。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Class Check Example</title>
    <style>
        .highlight { background-color: yellow; }
    </style>
</head>
<body>

<div class="highlight">
    <p>This is some text <span>with a span element</span></p>
</div>

<script>
    const span = document.querySelector('span');
    if (span.closest('.highlight')) {
        console.log('Span is inside a highlighted element');
        span.style.fontWeight = 'bold';
    }
</script>

</body>
</html>

这里我们有一个段落内的 span 元素,该段落又在一个类为 "highlight" 的 div 内部。JavaScript 会检查 span 是否有被高亮显示的祖先。

这表明 closest() 可用于基于元素的祖先进行条件逻辑。对于基于上下文的主题化或组件样式特别有用。

使用 closest() 进行事件委托

此示例展示了如何在事件委托场景中使用 closest()。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Event Delegation Example</title>
</head>
<body>

<div class="button-group">
    <button class="action-btn" data-action="save">Save</button>
    <button class="action-btn" data-action="delete">Delete</button>
</div>

<script>
    document.addEventListener('click', function(e) {
        const btn = e.target.closest('.action-btn');
        if (btn) {
            console.log('Action:', btn.dataset.action);
        }
    });
</script>

</body>
</html>

在此示例中,我们有多个具有通用类的按钮。我们不为每个按钮添加事件监听器,而是使用文档级别的事件委托,并通过 closest() 来识别按钮点击事件。

这演示了一种处理多个相似元素的有效模式。closest() 方法有助于确保我们只响应目标元素的点击事件,即使它们包含子元素。

来源

MDN closest() 文档

在本文中,我们展示了如何在 JavaScript 中使用 element.closest()。此方法在 Web 开发中对于 DOM 遍历和祖先元素选择非常强大。

作者

我的名字是 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 JS DOM 教程