document.getElementById或者只使用id

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

  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>

【示例2】一个通过id命名的全局变量,它引用了元素

<div id="elem">
  <div id="elem-content">Element</div>
</div>

<script>
  // elem 是对带有 id="elem" 的 DOM 元素的引用
  elem.style.background = 'red';

  // id="elem-content" 内有连字符,所以它不能成为一个变量
  // ...但是我们可以通过使用方括号 window['elem-content'] 来访问它
</script>

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

<div id="elem"></div>

<script>
  let elem = 5; // 现在 elem 是 5,而不是对 <div id="elem"> 的引用

  alert(elem); // 5
</script>

2、请不要使用以id命名的全局变量来访问元素。
(1)在规范中对此行为进行了描述,所以它是一种标准。但这是注意考虑到兼容性才支持的。
①优点
浏览器尝试通过混合JavaScript和DOM的命名空间来帮助我们。
对于内联到HTML中的简单脚本来说,这还行。
②缺点
当人们阅读JavaScript代码且看不到对应的HTML时,变量的来源就会不明显。
3、id必须是唯一的。
(1)如果有多个元素都带有同一个id,那么使用它的方法的行为是不可预测的。
【示例1】document.getElementById,可能会随机返回其中一个元素。

querySelectorAll

一、elem.querySelectorAll(css),它返回elem中与给定CSS选择器匹配的所有元素。
【示例1】查找所有为最后一个子元素的

  • 元素

    <ul>
      <li>The</li>
        <li>test</li>
    </ul>
    <ul>
      <li>has</li>
        <li>passed</li>
    </ul>
    <script>
      let elements = document.querySelecorAll('ul > li:last-child');
        for (let elem of elements) {
          alert(elem.innerHTML); // 'test', 'passed'
      }
    </script>
    

    二、也可以使用CSS选择器的伪类
    【示例1】以下代码将会返回鼠标指针现在已经结束的元素的集合(按嵌套顺序:从最外层到嵌套最多的元素)

    document.querySelectorAll(':hover')
    

    querySelector

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

    matches

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

    <a href="http://example.com/file.zip">...</a>
    <a href="http://ya.ru">...</a>
    
    <script>
        // 不一定是document.body.children,还可以是任何集合
      for (let elem of document.body.children) {
          if (elem.matches('a[href$="zip"]')) {
            alert('the archive reference:' + elem.href)
        }
      }
    </script>
    

    二、elem.matches(css)用于检查elem与给定的CSS选择器是否匹配。

    closest

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

    <h1>Contents</h1>
    <div class="contents">
      <ul class="book">
        <li class="chapter">Chapter 1</li>
        <li class="chapter">Chapter 1</li>
      </ul>
    </div>
    <script>
      let chapter = document.querySelector('.chapter'); // LI
    
        alert(chapter.closest('.book')); // UL
        alert(chapter.closest('.contents')); // DIV
    
        alert(chapter.closest('h1;)); // null (因为h1不是祖先)
    </script>
    

    getElementsBy*

    一、elem.getElementsByTagName(tag)查找具有给定标签的元素,并返回给它们的集合。tag参数也可以是对于“任何标签”的星号“*”.
    二、elem.getElementsByClassName(className)返回具有给定CSS类的元素。
    三、document.getElementsByName(name)返回在文档范围内具有给定name特征的元素。
    【示例1】

    // 获取文档中的所有div
    let divs = document.getElementsByTagName('div')
    
    // 查找table中的所有input标签
    <table id="table">
      <tr>
        <td>Your age:</td>
    
        <td>
          <label>
            <input type="radio" name="age" value="young" checked> less than 18
          </label>
          <label>
            <input type="radio" name="age" value="mature"> from 18 to 50
          </label>
          <label>
            <input type="radio" name="age" value="senior"> more than 60
          </label>
        </td>
      </tr>
    </table>
    
    <script>
      let inputs = table.getElementsByTagName('input');
    
      for (let input of inputs) {
        alert( input.value + ': ' + input.checked );
      }
    </script>
    

    1、返回的是一个集合,不是一个元素

    // 错误写法
    document.getElementsByTagName('input').value = 5;
    
    // 正确写法(如果有input)
    document.getElementsByTagName('input')[0].value = 5;
    

    【示例2】查找.article元素

    <form name="my-form">
      <div class="article">Article</div>
      <div class="long article">Long article</div>
    </form>
    
    <script>
      // 按 name 特性查找
      let form = document.getElementsByName('my-form')[0];
    
      // 在 form 中按 class 查找
      let articles = form.getElementsByClassName('article');
      alert(articles.length); // 2, found two elements with class "article"
    </script>
    

    getElementsBy*、querySelectorAll返回的集合的区别

    一、所有的”getElementsBy*”方法都会返回一个实时的(live)集合。这样的结合始终反映的是文档的当前状态,并且在文档发生更改时会“自动更新”。
    【示例1】下面有2个脚本
    第一个创建了对

    的集合的引用。截止目前,它的长度是1
    第二个脚本在浏览器再遇到一个
    时运行,所以它的长度是2

    <div>First div</div>
    <script>
      let divs - document.getElementsByTagName('div');
        alert(divs.length); // 1
    </script>
    
    <div>Second div</div>
    <script>
      alert(divs.length); // 2
    </script>
    

    二、querySelectorAll返回的是一个静态的集合。就像元素的固定数组。
    【示例1】如果我们使用它,两个脚本都会输出1。

    <div>First div</div>
    
    <script>
      let divs = document.querySelectorAll('div');
      alert(divs.length); // 1
    </script>
    
    <div>Second div</div>
    
    <script>
      alert(divs.length); // 1
    </script>
    

    1、文档出现新的div后,静态集合并没有增加。

    总结

    一、在DOM中搜索节点

    Method Searches by… Can call on an element? Live
    querySelector CSS-selector -
    querySelectorAll CSS-selector -
    getElementById id - -
    getElementsByName name -
    getElementsByTagName tag or ‘*’
    getElementsByClassName class

    1、20210305,目前为止,最常用的是querySelector和querySelectorAll,但是getElement(s)By*可能会偶尔有用,或者可以在就脚本中找到。
    二、contains可用来检查子级与父级之间关系的方法,因为它有时很有用
    【示例1】如果elemB在elemA(elemA的后代)或者elemA==elemB, elmA.contains(elemB)将返回true。