ZetCode

JavaScript previousSibling

最后修改于 2025 年 4 月 2 日

在本文中,我们将探讨 JavaScript 中的 previousSibling 属性。此属性对于 DOM 遍历至关重要,它允许开发人员访问文档树中元素的上一个同级节点。

基本定义

previousSibling 属性返回指定元素在同一树级别(同级)的上一个节点。这包括所有节点类型,而不仅仅是元素节点。

需要注意的是,previousSibling 返回的是紧邻的上一个同级节点,它可能是文本节点、注释节点或元素节点。元素之间的空白字符通常会创建文本节点。

基本 previousSibling

本示例演示了如何访问元素的上一个同级节点。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Basic previousSibling</title>
</head>
<body>

<div id="first">First div</div>
<div id="second">Second div</div>

<script>
    const second = document.getElementById('second');
    const previous = second.previousSibling;
    console.log(previous); // Might be a text node
</script>

</body>
</html>

在这个基本示例中,我们有两个 div 元素。JavaScript 代码检索第二个 div,然后访问其上一个同级节点。请注意,结果可能是包含空白字符的文本节点。

这演示了 previousSibling 的基本用法,用于导航 DOM 树。该属性返回父节点 childNodes 列表中当前节点之前的那个节点。

访问元素节点

本示例展示了如何专门访问上一个元素同级节点。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Element Siblings</title>
</head>
<body>

<div id="first">First div</div>
<!-- Comment -->
<div id="second">Second div</div>

<script>
    const second = document.getElementById('second');
    let previous = second.previousSibling;
    
    // Loop to find the previous element node
    while (previous && previous.nodeType !== 1) {
        previous = previous.previousSibling;
    }
    
    console.log(previous); // First div element
</script>

</body>
</html>

这里我们有两个 div 元素,它们之间有一个注释节点。代码找到第二个 div,然后循环遍历其上一个同级节点,直到找到一个元素节点(nodeType 1)。

这演示了如何处理元素之间存在非元素节点的情况。nodeType 检查确保我们获取到的是一个元素节点。

修改上一个同级节点

本示例演示了如何修改上一个同级元素节点。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Modifying Sibling</title>
</head>
<body>

<p>First paragraph</p>
<p id="target">Target paragraph</p>
<button onclick="changePrevious()">Change Previous</button>

<script>
    function changePrevious() {
        const target = document.getElementById('target');
        const previous = target.previousElementSibling;
        
        if (previous) {
            previous.style.color = 'red';
            previous.textContent = 'Modified content!';
        }
    }
</script>

</body>
</html>

在这个示例中,我们有两个段落和一个按钮。点击按钮时,按钮会更改目标段落上一个同级节点的样式和内容。

这表明 previousSibling(或 previousElementSibling)可用于动态修改相邻的元素。该示例使用 previousElementSibling 来跳过非元素节点。

检查同级节点是否存在

本示例展示了在访问上一个同级节点之前如何检查它是否存在。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Checking Siblings</title>
</head>
<body>

<div id="first">First element</div>

<script>
    const first = document.getElementById('first');
    const previous = first.previousSibling;
    
    if (previous) {
        console.log('Previous sibling exists:', previous);
    } else {
        console.log('No previous sibling');
    }
</script>

</body>
</html>

这里我们只有一个 div 元素。JavaScript 代码在尝试访问其上一个同级节点之前会检查它是否存在,从而防止潜在的错误。

这演示了在使用同级属性时的重要安全实践。在尝试访问同级节点的属性或方法之前,务必检查该同级节点是否存在。

导航复杂的 DOM

本示例展示了如何导航多个同级节点。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Complex DOM Navigation</title>
</head>
<body>

<div>First</div>
<span>Second</span>
<!-- Comment -->
<p id="start">Third</p>
<div>Fourth</div>

<script>
    const start = document.getElementById('start');
    let node = start;
    let count = 0;
    
    // Count all previous siblings
    while (node = node.previousSibling) {
        count++;
    }
    
    console.log(`Total previous siblings: ${count}`);
</script>

</body>
</html>

在这个示例中,我们有多个不同类型的节点。JavaScript 代码从一个特定的元素开始,并计算所有上一个同级节点,无论它们的类型如何。

这演示了如何使用 previousSibling 遍历 DOM 树中的所有前置节点。循环会一直继续,直到没有更多上一个同级节点为止。

来源

MDN previousSibling 文档

在本文中,我们展示了如何在 JavaScript 中使用 previousSibling 属性。此属性对于 Web 开发中的 DOM 遍历和元素导航至关重要。

作者

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

列出 所有 JS DOM 教程