document.getElementById 或者只使用 id

如果一个元素有 id 特性(attribute),那我们就可以使用 document.getElementById(id) 方法获取该元素,无论它在哪里。
例如:

  1. <div id="elem">
  2. <div id="elem-content">Element</div>
  3. </div>
  4. <script>
  5. // 获取该元素
  6. let elem = document.getElementById('elem');
  7. // 将该元素背景改为红色
  8. elem.style.background = 'red';
  9. </script>

image.png
此外,还有一个通过 id 命名的全局变量,它引用了元素:

  1. <div id="elem">
  2. <div id="elem-content">Element</div>
  3. </div>
  4. <script>
  5. // elem 是对带有 id="elem" 的 DOM 元素的引用
  6. elem.style.background = 'red';
  7. // id="elem-content" 内有连字符,所以它不能成为一个变量
  8. // ...但是我们可以通过使用方括号 window['elem-content'] 来访问它
  9. </script>

……除非我们声明一个具有相同名称的 JavaScript 变量,否则它具有优先权:

  1. <div id="elem"></div>
  2. <script>
  3. let elem = 5; // 现在 elem 是 5,而不是对 <div id="elem"> 的引用
  4. alert(elem); // 5
  5. </script>

注意:

  • 请不要使用以 id 命名的全局变量来访问元素
  • id 必须是唯一的

    querySelectorAll

    到目前为止,最通用的方法是 elem.querySelectorAll(css),它返回 elem 中与给定 CSS 选择器匹配的所有元素。
    在这里,我们查找所有为最后一个子元素的

  • 元素:

    1. <ul>
    2. <li>The</li>
    3. <li>test</li>
    4. </ul>
    5. <ul>
    6. <li>has</li>
    7. <li>passed</li>
    8. </ul>
    9. <script>
    10. let elements = document.querySelectorAll('ul > li:last-child');
    11. for (let elem of elements) {
    12. alert(elem.innerHTML); // "test", "passed"
    13. }
    14. </script>

    这个方法确实功能强大,因为可以使用任何 CSS 选择器。

  • 也可以使用伪类

CSS 选择器的伪类,例如 :hover 和 :active 也都是被支持的。例如, document.querySelectorAll(‘:hover’) 将会返回鼠标指针正处于其上方的元素的集合(按嵌套顺序:从最外层 到嵌套最多的元素)。

querySelector

elem.querySelector(css) 调用会返回给定 CSS 选择器的第一个元素。
换句话说,结果与 elem.querySelectorAll(css)[0] 相同,但是后者会查找 所有 元素,并从中选取一个,而 elem.querySelector 只会查找一个。因此它在速度上更快,并且写起来更短。

matches

之前的方法是搜索 DOM。
elem.matches(css) 不会查找任何内容,它只会检查 elem 是否与给定的 CSS 选择器匹配。它返回 true 或 false。
当我们遍历元素(例如数组或其他内容)并试图过滤那些我们感兴趣的元素时,这个方法会很有用。
例如:

  1. <a href="http://example.com/file.zip">...</a>
  2. <a href="http://ya.ru">...</a>
  3. <script>
  4. // 不一定是 document.body.children,还可以是任何集合
  5. for (let elem of document.body.children) {
  6. if (elem.matches('a[href$="zip"]')) {
  7. alert("The archive reference: " + elem.href );
  8. //The archive reference: http://example.com/file.zip
  9. }
  10. }
  11. </script>

closest

元素的祖先(ancestor)是:父级,父级的父级,它的父级等。祖先们一起组成了从元素到顶端的父级链。
elem.closest(css) 方法会查找与 CSS 选择器匹配的最近的祖先。elem 自己也会被搜索。
换句话说,方法 closest 在元素中得到了提升,并检查每个父级。如果它与选择器匹配,则停止搜索并返回该祖先。
例如:

  1. <h1>Contents</h1>
  2. <div class="contents">
  3. <ul class="book">
  4. <li class="chapter">Chapter 1</li>
  5. <li class="chapter">Chapter 2</li>
  6. </ul>
  7. </div>
  8. <script>
  9. let chapter = document.querySelector('.chapter'); // LI
  10. alert(chapter.closest('.book')); // UL
  11. alert(chapter.closest('.contents')); // DIV
  12. alert(chapter.closest('h1')); // null(因为 h1 不是祖先)
  13. </script>

任务

这是带有表格(table)和表单(form)的文档。
如何查找?……

  1. 带有 id=”age-table” 的表格。
  2. 表格内的所有 label 元素(应该有三个)。
  3. 表格中的第一个 td(带有 “Age” 字段)。
  4. 带有 name=”search” 的 form。
  5. 表单中的第一个 input。
  6. 表单中的最后一个 input。

在一个单独的窗口中打开 table.html 页面,并对此页面使用浏览器开发者工具。

  1. // 1. 带有 id="age-table" 的表格。
  2. let table = document.getElementById('age-table')
  3. // 2. 表格内的所有 label 元素
  4. table.getElementsByTagName('label')
  5. // 或
  6. document.querySelectorAll('#age-table label')
  7. // 3. 表格中的第一个 td(带有 "Age" 字段)
  8. table.rows[0].cells[0]
  9. // 或
  10. table.getElementsByTagName('td')[0]
  11. // 或
  12. table.querySelector('td')
  13. // 4. 带有 name="search" 的 form。
  14. // 假设文档中只有一个 name="search" 的元素
  15. let form = document.getElementsByName('search')[0]
  16. // 或者,专门对于 form
  17. document.querySelector('form[name="search"]')
  18. // 5. 表单中的第一个 input
  19. form.getElementsByTagName('input')[0]
  20. // 或
  21. form.querySelector('input')
  22. // 6. 表单中的最后一个 input
  23. let inputs = form.querySelectorAll('input') // 查找所有 input
  24. inputs[inputs.length-1] // 取出最后一个