DOM 导航

Frontend SELF ZH
第 41 级 , 课程 1
可用

2.1 获取元素的方法

在操作网页文档时,DOM(Document Object Model)导航是一项重要任务。JavaScript 提供了许多用于查找和访问文档元素的方法。这些方法让开发者可以轻松找到需要的元素并进行操作。

1. 方法 getElementById()

方法 getElementById() 返回具有指定 id 属性值的元素。这是最简单、最常用的方法之一。

例子:

HTML
    
      <!DOCTYPE html>
      <html>
        <head>
          <title>Document</title>
        </head>
        <body>
          <div id="content">这是内容</div>

          <script>
            const contentDiv = document.getElementById('content');
            console.log(contentDiv.textContent); // 输出: This is the content
          </script>
        </body>
      </html>
    
  

2. 方法 getElementsByClassName()

方法 getElementsByClassName() 返回一个包含所有具有指定类名的元素的集合。该集合是“活的”,这意味着在 DOM 发生变化时它会自动更新。

例子:

HTML
    
      <!DOCTYPE html>
      <html>
        <head>
          <title>Document</title>
        </head>
        <body>
          <p class="text">段落 1</p>
          <p class="text">段落 2</p>
          <p class="text">段落 3</p>

          <script>
            const paragraphs = document.getElementsByClassName('text');
            console.log(paragraphs.length); // 输出: 3
          </script>
        </body>
      </html>
    
  

3. 方法 getElementsByTagName()

方法 getElementsByTagName() 返回一个包含所有指定标签的元素的集合。这个集合也是“活的”。

例子:

HTML
    
      <!DOCTYPE html>
      <html>
        <head>
          <title>Document</title>
        </head>
        <body>
          <p>段落 1</p>
          <p>段落 2</p>
          <p>段落 3</p>

          <script>
            const paragraphs = document.getElementsByTagName('p');
            console.log(paragraphs.length); // 输出: 3
          </script>
        </body>
      </html>
    
  

4. 方法 querySelector()

方法 querySelector() 返回与指定 CSS 选择器匹配的第一个元素。这是一个非常强大且灵活的方法。

例子:

HTML
    
      <!DOCTYPE html>
      <html>
      <head>
        <title>Document</title>
      </head>
        <body>
          <div class="container">
            <p>段落 1</p>
            <p class="highlight">段落 2</p>
            <p>段落 3</p>
          </div>

          <script>
            const highlightedParagraph = document.querySelector('.highlight');
            console.log(highlightedParagraph.textContent); // 输出: Paragraph 2
          </script>
        </body>
      </html>
    
  

5. 方法 querySelectorAll()

方法 querySelectorAll() 返回一个静态(不可变)集合,包含所有与指定 CSS 选择器匹配的元素。

例子:

HTML
    
      <!DOCTYPE html>
      <html>
        <head>
          <title>Document</title>
        </head>
        <body>
          <div class="container">
            <p>段落 1</p>
            <p class="highlight">段落 2</p>
            <p>段落 3</p>
          </div>

          <script>
            const paragraphs = document.querySelectorAll('.container p');
            console.log(paragraphs.length); // 输出: 3
          </script>
        </body>
      </html>
    
  

2.2 节点导航

DOM 还提供了一些用于在相对于当前元素的节点之间导航的方法。

1. 属性 parentNode

属性 parentNode 返回当前节点的父节点。

例子:

HTML
    
      <!DOCTYPE html>
      <html>
        <head>
          <title>Document</title>
        </head>
        <body>
          <div id="container">
            <p>段落</p>
          </div>

          <script>
            const paragraph = document.querySelector('p');
            const parent = paragraph.parentNode;
            console.log(parent.id); // 输出: container
          </script>
        </body>
      </html>
    
  

2. 属性 childNodes

属性 childNodes 返回当前节点的所有子节点的集合,包括文本节点。

例子:

HTML
    
      <!DOCTYPE html>
      <html>
        <head>
          <title>Document</title>
        </head>
        <body>
          <ul id="list">
            <li>项目 1</li>
            <li>项目 2</li>
            <li>项目 3</li>
          </ul>

          <script>
            const list = document.getElementById('list');
            const children = list.childNodes;
            console.log(children.length); // 输出所有子节点的数量,包括文本节点
          </script>
        </body>
      </html>
    
  

可能你还在想为什么结果是 7?

就像上面说的,childNodes 属性返回当前节点的所有子节点的集合,包括文本节点(空格、字符、换行符等)。HTML 标记里在 <li> 元素之间有空格和换行符,也被当作单独的节点。

在上面的例子中,<ul> 标签和第一个 <li> 之间有换行(可能还有空格),被视为文本节点。同样的情况发生在所有的 <li> 之间和最后一个 <li> 之后。因此,除了三个列表项,childNodes 还包括这些文本节点,总数为 7。

想要仅获取元素节点(忽略文本节点),可以使用 children 属性,它只返回子元素:

HTML
    
      <!DOCTYPE html>
      <html>
        <head>
          <title>Document</title>
        </head>
        <body>
          <ul id="list">
            <li>项目 1</li>
            <li>项目 2</li>
            <li>项目 3</li>
          </ul>

          <script>
            const list = document.getElementById('list');
            const children = list.children;
            console.log(children.length); // 3
          </script>
        </body>
      </html>
    
  

3. 属性 firstChild 和 lastChild

属性 firstChildlastChild 分别返回第一个和最后一个子节点。

例子:

HTML
    
      <!DOCTYPE html>
      <html>
        <head>
          <title>Document</title>
        </head>
        <body>
          <ul id="list">
            <li>项目 1</li>
            <li>项目 2</li>
            <li>项目 3</li>
          </ul>

          <script>
            const list = document.getElementById('list');
            const first = list.firstChild;
            const last = list.lastChild;
            console.log(first.textContent);
            console.log(last.textContent);
          </script>
        </body>
      </html>
    
  

你可能惊讶地发现控制台没有显示任何东西。这不是这样的。显示的是最后一个子节点 项目 1 和 项目 3(换行符)。如果你被这个问题困扰,请再阅读一下2. 属性 childNodes

4. 属性 nextSibling 和 previousSibling

属性 nextSiblingpreviousSibling 返回与当前节点在同一层级上的下一个和上一个节点。

例子:

HTML
    
      <!DOCTYPE html>
      <html>
        <head>
          <title>Document</title>
        </head>
        <body>
          <ul id="list">
            <li>项目 1</li>
            <li>项目 2</li>
            <li>项目 3</li>
          </ul>

          <script>
            const secondItem = document.querySelector('li:nth-child(2)');
            const next = secondItem.nextSibling;
            const prev = secondItem.previousSibling;
            console.log(next.textContent); // 输出: 项目 3
            console.log(prev.textContent); // 输出: 项目 1(如果忽略文本节点)
          </script>
        </body>
      </html>
    
  

2.3 元素节点导航

5. 属性 nextElementSibling 和 previousElementSibling

这些属性返回与当前节点在同一层级上的下一个和上一个元素节点(跳过文本和注释)。

例子:

HTML
    
      <!DOCTYPE html>
      <html>
        <head>
          <title>Document</title>
        </head>
        <body>
          <ul id="list">
            <li>项目 1</li>
            <li>项目 2</li>
            <li>项目 3</li>
          </ul>

          <script>
            const secondItem = document.querySelector('li:nth-child(2)');
            const next = secondItem.nextElementSibling;
            const prev = secondItem.previousElementSibling;
            console.log(next.textContent); // 输出: 项目 3
            console.log(prev.textContent); // 输出: 项目 1
          </script>
        </body>
      </html>
    
  

6. 属性 firstElementChild 和 lastElementChild

这些属性返回第一个和最后一个子元素节点(跳过文本和注释)。

例子:

HTML
    
      <!DOCTYPE html>
      <html>
        <head>
          <title>Document</title>
        </head>
        <body>
          <ul id="list">
            <li>项目 1</li>
            <li>项目 2</li>
            <li>项目 3</li>
          </ul>

          <script>
            const list = document.getElementById('list');
            const first = list.firstElementChild;
            const last = list.lastElementChild;
            console.log(first.textContent); // 输出: 项目 1
            console.log(last.textContent);  // 输出: 项目 3
          </script>
        </body>
      </html>
    
  
1
任务
Frontend SELF ZH, 第 41 级, 课程 1
已锁定
段落计数
段落计数
1
任务
Frontend SELF ZH, 第 41 级, 课程 1
已锁定
第一个和最后一个节点
第一个和最后一个节点
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION